Mercurial > projects > dil
annotate trunk/src/dil/ast/NodeCopier.d @ 804:9e6c6bb73e5f
Implemented visit methods for some type nodes.
Added method SemanticPass2.search().
Added methods arrayOf() and arrayOf(Type) to class Type.
Refactored ModuleScopeType.
Added error msg UndefinedIdentifier.
Added release.py.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 08 Mar 2008 22:02:20 +0100 |
parents | 5fe89bb8cbdd |
children |
rev | line source |
---|---|
791
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
1 /++ |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
2 Author: Aziz Köksal |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
3 License: GPL3 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
4 +/ |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
5 module dil.ast.NodeCopier; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
6 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
7 import common; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
9 /// Mixed into the body of a class that inherits from Node. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
10 const string copyMethod = ` |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 override typeof(this) copy() |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 mixin copyNode!(typeof(this)); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 return copyNode(this); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 }`; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
16 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 /// A helper function that generates code for copying subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
18 string doCopy_(string obj, string[] members) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
20 char[] result; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
21 foreach (member; members) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
22 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
23 if (member.length > 2 && member[$-2..$] == "[]") // Array copy. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
25 member = member[0..$-2]; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
26 // obj.member = obj.member.dup; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 // foreach (ref m_; obj.member) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
28 // m_ = m_.copy(); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
29 result ~= obj~"."~member~" = "~obj~"."~member~".dup;" |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
30 "foreach (ref m_; "~obj~"."~member~")" |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 "m_ = m_.copy();"; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
32 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 else if (member[$-1] == '?') // Optional member copy. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 member = member[0..$-1]; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 // obj.member && (obj.member = obj.member.copy()); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 result ~= obj~"."~member~" && ("~obj~"."~member~" = "~obj~"."~member~".copy());"; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
39 else // Non-optional member copy. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
40 // obj.member = obj.member.copy(); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 result ~= obj~"."~member~" = "~obj~"."~member~".copy();"; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 return result; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
46 string doCopy(string[] members) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 return doCopy_("x", members); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
49 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
51 string doCopy(string member) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
52 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 return doCopy_("x", [member]); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
54 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
55 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
56 // pragma(msg, doCopy("decls?")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
57 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
58 /// Returns a deep copy of node. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
59 T copyNode(T)(T node) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
60 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
61 assert(node !is null); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
62 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
63 // Firstly do a shallow copy. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
64 T x = cast(T)cast(void*)node.dup; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
66 // Now copy the subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
67 static if (is(Declaration) && is(T : Declaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
68 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
69 alias T D; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
70 static if (is(D == CompoundDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
71 mixin(doCopy("decls[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
72 //EmptyDeclaration, |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
73 //IllegalDeclaration, |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
74 //ModuleDeclaration have no subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
75 static if (is(D == AliasDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 is(D == TypedefDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
77 mixin(doCopy("decl")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
78 static if (is(D == EnumDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
79 mixin(doCopy(["baseType?", "members[]"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
80 static if (is(D == EnumMemberDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
81 mixin(doCopy("value")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
82 static if (is(D == ClassDeclaration) || is( D == InterfaceDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
83 mixin(doCopy(["bases[]", "decls"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
84 static if (is(D == StructDeclaration) || is(D == UnionDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 mixin(doCopy("decls")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
86 static if (is(D == ConstructorDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 mixin(doCopy(["params", "funcBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
88 static if (is(D == StaticConstructorDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
89 is(D == DestructorDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
90 is(D == StaticDestructorDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
91 is(D == InvariantDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
92 is(D == UnittestDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
93 mixin(doCopy("funcBody")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
94 static if (is(D == FunctionDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
95 mixin(doCopy(["returnType", "params", "funcBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
96 static if (is(D == VariablesDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
97 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
98 mixin(doCopy("typeNode?")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
99 x.inits = x.inits.dup; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
100 foreach(ref init; x.inits) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
101 init && (init = init.copy()); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
102 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
103 static if (is(D == DebugDeclaration) || is(D == VersionDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
104 mixin(doCopy(["decls?","elseDecls?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
105 static if (is(D == StaticIfDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
106 mixin(doCopy(["condition","ifDecls", "elseDecls?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
107 static if (is(D == StaticAssertDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
108 mixin(doCopy(["condition","message?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
109 static if (is(D == TemplateDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
110 mixin(doCopy(["tparams","decls"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
111 static if (is(D == NewDeclaration) || is(D == DeleteDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
112 mixin(doCopy(["params","funcBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
113 static if (is(D == ProtectionDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
114 is(D == StorageClassDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
115 is(D == LinkageDeclaration) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
116 is(D == AlignDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
117 mixin(doCopy("decls")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
118 static if (is(D == PragmaDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
119 mixin(doCopy(["args[]","decls"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
120 static if (is(D == MixinDeclaration)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
121 mixin(doCopy(["templateExpr?","argument?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
122 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
123 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
124 static if (is(Expression) && is(T : Expression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
125 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
126 alias T E; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
127 static if (is(E == IllegalExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
128 {} |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
129 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
130 static if (is(E == CondExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
131 mixin(doCopy(["condition", "lhs", "rhs"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
132 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
133 static if (is(E : BinaryExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
134 mixin(doCopy(["lhs", "rhs"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
135 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
136 static if (is(E : UnaryExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
137 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
138 static if (is(E == CastExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
139 mixin(doCopy("type")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
140 mixin(doCopy("e")); // Copy member in base class UnaryExpression. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
141 static if (is(E == IndexExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
142 mixin(doCopy("args[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
143 static if (is(E == SliceExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
144 mixin(doCopy(["left?", "right?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
145 static if (is(E == AsmPostBracketExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
146 mixin(doCopy("e2")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
147 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
148 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
149 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
150 static if (is(E == NewExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
151 mixin(doCopy(["newArgs[]", "type", "ctorArgs[]"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
152 static if (is(E == NewAnonClassExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
153 mixin(doCopy(["newArgs[]", "bases[]", "ctorArgs[]", "decls"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
154 static if (is(E == AsmBracketExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
155 mixin(doCopy("e")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
156 static if (is(E == TemplateInstanceExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
157 mixin(doCopy("targs?")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
158 static if (is(E == ArrayLiteralExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
159 mixin(doCopy("values[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
160 static if (is(E == AArrayLiteralExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
161 mixin(doCopy(["keys[]", "values[]"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
162 static if (is(E == AssertExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
163 mixin(doCopy(["expr", "msg?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
164 static if (is(E == MixinExpression) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
165 is(E == ImportExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
166 mixin(doCopy("expr")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
167 static if (is(E == TypeofExpression) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
168 is(E == TypeDotIdExpression) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
169 is(E == TypeidExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
170 mixin(doCopy("type")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
171 static if (is(E == IsExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
172 mixin(doCopy(["type", "specType?", "tparams?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
173 static if (is(E == FunctionLiteralExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
174 mixin(doCopy(["returnType?", "params?", "funcBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
175 static if (is(E == ParenExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
176 mixin(doCopy("next")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
177 static if (is(E == TraitsExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
178 mixin(doCopy("targs")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
179 // VoidInitializer has no subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
180 static if (is(E == ArrayInitExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
181 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
182 mixin(doCopy("values[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
183 x.keys = x.keys.dup; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
184 foreach(ref key; x.keys) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
185 key && (key = key.copy()); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
186 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
187 static if (is(E == StructInitExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
188 mixin(doCopy("values[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
189 static if (is(E == StringExpression)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
190 x.str = x.str.dup; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
191 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
192 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
193 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
194 static if (is(Statement) && is(T : Statement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
195 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
196 alias T S; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
197 static if (is(S == CompoundStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
198 mixin(doCopy("stmnts[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
199 //IllegalStatement, |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
200 //EmptyStatement have no subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
201 static if (is(S == FuncBodyStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
202 mixin(doCopy(["funcBody?", "inBody?", "outBody?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
203 static if (is(S == ScopeStatement) || is(S == LabeledStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
204 mixin(doCopy("s")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
205 static if (is(S == ExpressionStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
206 mixin(doCopy("e")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
207 static if (is(S == DeclarationStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
208 mixin(doCopy("decl")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
209 static if (is(S == IfStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
210 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
211 if (x.variable) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
212 mixin(doCopy("variable")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
213 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
214 mixin(doCopy("condition")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
215 mixin(doCopy(["ifBody", "elseBody?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
216 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
217 static if (is(S == WhileStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
218 mixin(doCopy(["condition", "whileBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
219 static if (is(S == DoWhileStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
220 mixin(doCopy(["doBody", "condition"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
221 static if (is(S == ForStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
222 mixin(doCopy(["init?", "condition?", "increment?", "forBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
223 static if (is(S == ForeachStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
224 mixin(doCopy(["params", "aggregate", "forBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
225 static if (is(S == ForeachRangeStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
226 mixin(doCopy(["params", "lower", "upper", "forBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
227 static if (is(S == SwitchStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
228 mixin(doCopy(["condition", "switchBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
229 static if (is(S == CaseStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
230 mixin(doCopy(["values[]", "caseBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
231 static if (is(S == DefaultStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
232 mixin(doCopy("defaultBody")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
233 //ContinueStatement, |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
234 //BreakStatement have no subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
235 static if (is(S == ReturnStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
236 mixin(doCopy("e?")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
237 static if (is(S == GotoStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
238 mixin(doCopy("caseExpr?")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
239 static if (is(S == WithStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
240 mixin(doCopy(["e", "withBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
241 static if (is(S == SynchronizedStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
242 mixin(doCopy(["e?", "syncBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
243 static if (is(S == TryStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
244 mixin(doCopy(["tryBody", "catchBodies[]", "finallyBody?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
245 static if (is(S == CatchStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
246 mixin(doCopy(["param?", "catchBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
247 static if (is(S == FinallyStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
248 mixin(doCopy("finallyBody")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
249 static if (is(S == ScopeGuardStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
250 mixin(doCopy("scopeBody")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
251 static if (is(S == ThrowStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
252 mixin(doCopy("e")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
253 static if (is(S == VolatileStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
254 mixin(doCopy("volatileBody?")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
255 static if (is(S == AsmBlockStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
256 mixin(doCopy("statements")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
257 static if (is(S == AsmStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
258 mixin(doCopy("operands[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
259 //AsmAlignStatement, |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
260 //IllegalAsmStatement have no subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
261 static if (is(S == PragmaStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
262 mixin(doCopy(["args[]", "pragmaBody"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
263 static if (is(S == MixinStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
264 mixin(doCopy("templateExpr")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
265 static if (is(S == StaticIfStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
266 mixin(doCopy(["condition", "ifBody", "elseBody?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
267 static if (is(S == StaticAssertStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
268 mixin(doCopy(["condition", "message?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
269 static if (is(S == DebugStatement) || is(S == VersionStatement)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
270 mixin(doCopy(["mainBody", "elseBody?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
271 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
272 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
273 static if (is(TypeNode) && is(T : TypeNode)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
274 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
275 //IllegalType, |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
276 //IntegralType, |
804
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
791
diff
changeset
|
277 //ModuleScopeType, |
791
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
278 //IdentifierType have no subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
279 static if (is(T == QualifiedType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
280 mixin(doCopy(["lhs", "rhs"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
281 static if (is(T == TypeofType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
282 mixin(doCopy("e")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
283 static if (is(T == TemplateInstanceType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
284 mixin(doCopy("targs?")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
285 static if (is(T == PointerType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
286 mixin(doCopy("next")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
287 static if (is(T == ArrayType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
288 mixin(doCopy(["next", "assocType?", "e1?", "e2?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
289 static if (is(T == FunctionType) || is(T == DelegateType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
290 mixin(doCopy(["returnType", "params"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
291 static if (is(T == CFuncPointerType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
292 mixin(doCopy(["next", "params?"])); |
804
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
791
diff
changeset
|
293 static if (is(T == BaseClassType) || |
791
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
294 is(T == ConstType) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
295 is(T == InvariantType)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
296 mixin(doCopy("next")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
297 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
298 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
299 static if (is(Parameter) && is(T == Parameter)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
300 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
301 mixin(doCopy(["type?", "defValue?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
302 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
303 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
304 static if (is(Parameter) && is(T == Parameters) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
305 is(TemplateParameter) && is(T == TemplateParameters) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
306 is(TemplateArguments) && is(T == TemplateArguments)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
307 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
308 mixin(doCopy("children[]")); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
309 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
310 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
311 static if (is(TemplateParameter) && is(T : TemplateParameter)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
312 { |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
313 static if (is(N == TemplateAliasParameter) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
314 is(N == TemplateTypeParameter) || |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
315 is(N == TemplateThisParameter)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
316 mixin(doCopy(["specType", "defType"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
317 static if (is(N == TemplateValueParameter)) |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
318 mixin(doCopy(["valueType", "specValue?", "defValue?"])); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
319 //TemplateTupleParameter has no subnodes. |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
320 } |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
321 else |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
322 static assert(0, "copying of "~typeof(x).stringof~" is not handled"); |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
323 return x; |
5fe89bb8cbdd
Implemented syntax tree copying.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
324 } |