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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }