Mercurial > projects > dil
annotate trunk/src/dil/ast/Node.d @ 671:f1325a4506de
Removed enum TID from dil.ast.Types.
Renamed UndefinedType to IllegalType.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Thu, 17 Jan 2008 22:57:36 +0100 |
parents | 15a0f37caabe |
children | 64fec49651cf |
rev | line source |
---|---|
142 | 1 /++ |
2 Author: Aziz Köksal | |
249 | 3 License: GPL3 |
142 | 4 +/ |
580
fa6d3c52757d
Moved SyntaxTree.d to new package 'ast'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
543
diff
changeset
|
5 module dil.ast.Node; |
596
39fac5531b85
Moved dil.Token to dil.lexer.Token.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
580
diff
changeset
|
6 |
391
33b566df6af4
Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
374
diff
changeset
|
7 import common; |
142 | 8 |
596
39fac5531b85
Moved dil.Token to dil.lexer.Token.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
580
diff
changeset
|
9 public import dil.lexer.Token; |
635 | 10 public import dil.ast.NodesEnum; |
276
d6b2f7616ca5
- Added enum NodeKind to classify different nodes in the AST. Correspondingly added member 'kind' to class Node.
aziz
parents:
275
diff
changeset
|
11 |
281 | 12 /// This string is mixed into the constructor of a class that inherits from Node. |
276
d6b2f7616ca5
- Added enum NodeKind to classify different nodes in the AST. Correspondingly added member 'kind' to class Node.
aziz
parents:
275
diff
changeset
|
13 const string set_kind = `this.kind = mixin("NodeKind." ~ typeof(this).stringof);`; |
d6b2f7616ca5
- Added enum NodeKind to classify different nodes in the AST. Correspondingly added member 'kind' to class Node.
aziz
parents:
275
diff
changeset
|
14 |
516
433d51c18524
Renamed template Cast to TryCast.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
495
diff
changeset
|
15 Class TryCast(Class)(Node n) |
309 | 16 { |
17 assert(n !is null); | |
18 if (n.kind == mixin("NodeKind." ~ typeof(Class).stringof)) | |
19 return cast(Class)cast(void*)n; | |
20 return null; | |
21 } | |
22 | |
495
b60450804b6e
Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
492
diff
changeset
|
23 Class CastTo(Class)(Node n) |
b60450804b6e
Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
492
diff
changeset
|
24 { |
b60450804b6e
Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
492
diff
changeset
|
25 assert(n !is null && n.kind == mixin("NodeKind." ~ typeof(Class).stringof)); |
b60450804b6e
Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
492
diff
changeset
|
26 return cast(Class)cast(void*)n; |
b60450804b6e
Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
492
diff
changeset
|
27 } |
b60450804b6e
Attributes are evaluated during the parsing phase now.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
492
diff
changeset
|
28 |
142 | 29 class Node |
30 { | |
275 | 31 NodeCategory category; |
276
d6b2f7616ca5
- Added enum NodeKind to classify different nodes in the AST. Correspondingly added member 'kind' to class Node.
aziz
parents:
275
diff
changeset
|
32 NodeKind kind; |
292 | 33 Node[] children; |
189 | 34 Token* begin, end; |
35 | |
275 | 36 this(NodeCategory category) |
142 | 37 { |
671
f1325a4506de
Removed enum TID from dil.ast.Types.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
636
diff
changeset
|
38 assert(category != NodeCategory.Undefined); |
275 | 39 this.category = category; |
142 | 40 } |
189 | 41 |
42 void setTokens(Token* begin, Token* end) | |
43 { | |
44 this.begin = begin; | |
45 this.end = end; | |
46 } | |
489
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
47 |
543
c9579ea87228
Added ComplexExpression to enum NodeKind and setToks() to Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
516
diff
changeset
|
48 Class setToks(Class)(Class node) |
c9579ea87228
Added ComplexExpression to enum NodeKind and setToks() to Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
516
diff
changeset
|
49 { |
c9579ea87228
Added ComplexExpression to enum NodeKind and setToks() to Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
516
diff
changeset
|
50 node.setTokens(this.begin, this.end); |
c9579ea87228
Added ComplexExpression to enum NodeKind and setToks() to Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
516
diff
changeset
|
51 return node; |
c9579ea87228
Added ComplexExpression to enum NodeKind and setToks() to Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
516
diff
changeset
|
52 } |
c9579ea87228
Added ComplexExpression to enum NodeKind and setToks() to Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
516
diff
changeset
|
53 |
489
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
54 void addChild(Node child) |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
55 { |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
56 assert(child !is null, "failed in " ~ this.classinfo.name); |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
57 this.children ~= child; |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
58 } |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
59 |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
60 void addOptChild(Node child) |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
61 { |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
62 child is null || addChild(child); |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
63 } |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
64 |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
65 void addChildren(Node[] children) |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
66 { |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
67 assert(children !is null && delegate{ |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
68 foreach (child; children) |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
69 if (child is null) |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
70 return false; |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
71 return true; }(), |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
72 "failed in " ~ this.classinfo.name |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
73 ); |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
74 this.children ~= children; |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
75 } |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
76 |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
77 void addOptChildren(Node[] children) |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
78 { |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
79 children is null || addChildren(children); |
a7291d3ee9d7
Refactored classes that inherit from Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
488
diff
changeset
|
80 } |
612
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
81 |
635 | 82 Class iS(Class)() |
83 { | |
84 if (kind == mixin("NodeKind." ~ typeof(Class).stringof)) | |
85 return cast(Class)cast(void*)this; | |
86 return null; | |
87 } | |
88 | |
636
15a0f37caabe
Added more visit() methods to dil.semantic.SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
635
diff
changeset
|
89 Class to(Class)() |
15a0f37caabe
Added more visit() methods to dil.semantic.SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
635
diff
changeset
|
90 { |
15a0f37caabe
Added more visit() methods to dil.semantic.SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
635
diff
changeset
|
91 return cast(Class)cast(void*)this; |
15a0f37caabe
Added more visit() methods to dil.semantic.SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
635
diff
changeset
|
92 } |
15a0f37caabe
Added more visit() methods to dil.semantic.SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
635
diff
changeset
|
93 |
612
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
94 static bool isDoxygenComment(Token* token) |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
95 { // Doxygen: '/+!' '/*!' '//!' |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
96 return token.type == TOK.Comment && token.start[2] == '!'; |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
97 } |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
98 |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
99 static bool isDDocComment(Token* token) |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
100 { // DDOC: '/++' '/**' '///' |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
101 return token.type == TOK.Comment && token.start[1] == token.start[2]; |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
102 } |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
103 |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
104 /++ |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
105 Returns the surrounding documentation comment tokens. |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
106 Note: this function works correctly only if |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
107 the source text is syntactically correct. |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
108 +/ |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
109 Token*[] getDocComments(bool function(Token*) isDocComment = &isDDocComment) |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
110 { |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
111 Token*[] comments; |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
112 // Get preceding comments. |
613
7034d3f9e40c
Fixed Node.getDocComments().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
612
diff
changeset
|
113 auto token = begin; |
612
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
114 // Scan backwards until we hit another declaration. |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
115 while (1) |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
116 { |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
117 token = token.prev; |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
118 if (token.type == TOK.LBrace || |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
119 token.type == TOK.RBrace || |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
120 token.type == TOK.Semicolon || |
618
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
121 token.type == TOK.HEAD || |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
122 (kind == NodeKind.EnumMember && token.type == TOK.Comma)) |
612
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
123 break; |
618
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
124 |
612
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
125 if (token.type == TOK.Comment) |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
126 { |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
127 // Check that this comment doesn't belong to the previous declaration. |
618
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
128 if (kind == NodeKind.EnumMember && token.type == TOK.Comma) |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
129 break; |
612
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
130 switch (token.prev.type) |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
131 { |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
132 case TOK.Semicolon, TOK.RBrace: |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
133 break; |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
134 default: |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
135 if (isDocComment(token)) |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
136 comments ~= token; |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
137 } |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
138 } |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
139 } |
613
7034d3f9e40c
Fixed Node.getDocComments().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
612
diff
changeset
|
140 // Get single comment to the right. |
7034d3f9e40c
Fixed Node.getDocComments().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
612
diff
changeset
|
141 token = end.next; |
618
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
142 if (token.type == TOK.Comment && isDocComment(token)) |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
143 comments ~= token; |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
144 else if (kind == NodeKind.EnumMember) |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
145 { |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
146 token = end.nextNWS; |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
147 if (token.type == TOK.Comma) |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
148 { |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
149 token = token.next; |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
150 if (token.type == TOK.Comment && isDocComment(token)) |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
151 comments ~= token; |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
152 } |
07946b379006
Refactored the way dot expressions are parsed.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
613
diff
changeset
|
153 } |
612
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
154 return comments; |
c65b11c2074c
Added getDocComments() to class Node.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
596
diff
changeset
|
155 } |
142 | 156 } |