annotate trunk/src/dil/ast/DefaultVisitor.d @ 667:1ac758cd952a

Fixed a few things in DefaultVisitor.d and Pass1.d Returning parameter node in visit() methods in module Visitor. Added member type to TypeNode class.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Thu, 17 Jan 2008 00:21:16 +0100
parents 8d96a7b50982
children a1f8d8f2db38
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
642
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
1 /++
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
2 Author: Aziz Köksal
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
3 License: GPL3
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
4 +/
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
5 module dil.ast.DefaultVisitor;
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
6
643
3bd947eb72c2 Added module cmd.ASTStats.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 642
diff changeset
7 import dil.ast.Visitor;
3bd947eb72c2 Added module cmd.ASTStats.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 642
diff changeset
8
642
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
9 import dil.ast.Node;
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
10 import dil.ast.Declarations,
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
11 dil.ast.Expressions,
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
12 dil.ast.Statements,
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
13 dil.ast.Types,
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
14 dil.ast.Parameters;
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
15 import common;
642
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
16
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
17 /++
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
18 This huge template function, when instantiated for a certain node class,
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
19 generates a body of visit method calls on the subnodes.
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
20 +/
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
21 returnType!(T.stringof) visitDefault(T)(T t)
642
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
22 {
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
23 assert(t !is null, "node passed to visitDefault() is null");
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
24 //Stdout(t).newline;
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
25
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
26 alias t d, s, e, n; // Variable aliases of t.
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
27
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
28 static if (is(T : Declaration))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
29 {
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
30 alias T D;
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
31 static if (is(D == Declarations))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
32 foreach (node; d.children)
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
33 visitN(node);
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
34 //EmptyDeclaration,
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
35 //IllegalDeclaration,
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
36 //ModuleDeclaration have no subnodes.
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
37 static if (is(D == AliasDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
38 is(D == AliasDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
39 is(D == TypedefDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
40 visitD(d.decl);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
41 static if (is(D == EnumDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
42 {
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
43 d.baseType && visitT(d.baseType);
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
44 foreach (member; d.members)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
45 visitD(member);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
46 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
47 static if (is(D == EnumMember))
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
48 d.value && visitE(d.value);
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
49 static if (is(D == ClassDeclaration) || is( D == InterfaceDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
50 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
51 d.tparams && visitN(d.tparams);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
52 foreach (base; d.bases)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
53 visitT(base);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
54 d.decls && visitD(d.decls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
55 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
56 static if (is(D == StructDeclaration) || is(D == UnionDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
57 d.tparams && visitN(d.tparams),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
58 d.decls && visitD(d.decls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
59 static if (is(D == ConstructorDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
60 visitN(d.parameters),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
61 visitS(d.funcBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
62 static if (is(D == StaticConstructorDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
63 is(D == DestructorDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
64 is(D == StaticDestructorDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
65 is(D == InvariantDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
66 is(D == UnittestDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
67 visitS(d.funcBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
68 static if (is(D == FunctionDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
69 visitT(d.returnType),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
70 d.tparams && visitN(d.tparams),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
71 visitN(d.params),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
72 visitS(d.funcBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
73 static if (is(D == VariableDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
74 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
75 d.typeNode && visitT(d.typeNode);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
76 foreach(value; d.values)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
77 value && visitE(value);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
78 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
79 static if (is(D == DebugDeclaration) || is(D == VersionDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
80 visitD(d.decls),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
81 d.elseDecls && visitD(d.elseDecls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
82 static if (is(D == StaticIfDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
83 visitE(d.condition),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
84 visitD(d.ifDecls),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
85 d.elseDecls && visitD(d.elseDecls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
86 static if (is(D == StaticAssertDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
87 visitE(d.condition),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
88 d.message && visitE(d.message);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
89 static if (is(D == TemplateDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
90 d.tparams && visitN(d.tparams),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
91 visitD(d.decls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
92 static if (is(D == NewDeclaration) || is(D == DeleteDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
93 visitN(d.parameters),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
94 visitS(d.funcBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
95 static if (is(D == ProtectionDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
96 is(D == StorageClassDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
97 is(D == LinkageDeclaration) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
98 is(D == AlignDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
99 visitD(d.decls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
100 static if (is(D == PragmaDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
101 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
102 foreach (arg; d.args)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
103 visitE(arg);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
104 visitD(d.decls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
105 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
106 static if (is(D == MixinDeclaration))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
107 d.templateExpr ? visitE(d.templateExpr) : visitE(d.argument);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
108 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
109 else
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
110 static if (is(T : Expression))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
111 {
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
112 alias T E;
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
113 static if (is(E == IllegalExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
114 {}
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
115 else
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
116 static if (is(E : CondExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
117 visitE(e.condition), visitE(e.left), visitE(e.right);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
118 else
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
119 static if (is(E : BinaryExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
120 visitE(e.left), visitE(e.right);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
121 else
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
122 static if (is(E : UnaryExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
123 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
124 static if (is(E == CastExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
125 visitT(e.type);
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
126 visitE(e.e); // Visit member in base class UnaryExpression.
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
127 static if (is(E == IndexExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
128 foreach (arg; e.args)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
129 visitE(arg);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
130 static if (is(E == SliceExpression))
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
131 e.left && (visitE(e.left), visitE(e.right));
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
132 static if (is(E == AsmPostBracketExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
133 visitE(e.e2);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
134 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
135 else
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
136 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
137 static if (is(E == NewExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
138 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
139 foreach (arg; e.newArgs)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
140 visitE(arg);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
141 visitT(e.type);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
142 foreach (arg; e.ctorArgs)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
143 visitE(arg);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
144 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
145 static if (is(E == NewAnonClassExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
146 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
147 foreach (arg; e.newArgs)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
148 visitE(arg);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
149 foreach (base; e.bases)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
150 visitT(base);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
151 foreach (arg; e.ctorArgs)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
152 visitE(arg);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
153 visitD(e.decls);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
154 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
155 static if (is(E == AsmBracketExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
156 visitE(e.e);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
157 static if (is(E == TemplateInstanceExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
158 e.targs && visitN(e.targs);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
159 static if (is(E == ArrayLiteralExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
160 foreach (value; e.values)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
161 visitE(value);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
162 static if (is(E == AArrayLiteralExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
163 foreach (i, key; e.keys)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
164 visitE(key), visitE(e.values[i]);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
165 static if (is(E == AssertExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
166 visitE(e.expr), e.msg && visitE(e.msg);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
167 static if (is(E == MixinExpression) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
168 is(E == ImportExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
169 visitE(e.expr);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
170 static if (is(E == TypeofExpression) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
171 is(E == TypeDotIdExpression) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
172 is(E == TypeidExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
173 visitT(e.type);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
174 static if (is(E == IsExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
175 visitT(e.type), e.specType && visitT(e.specType),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
176 e.tparams && visitN(e.tparams);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
177 static if (is(E == FunctionLiteralExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
178 e.returnType && visitT(e.returnType),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
179 e.parameters && visitN(e.parameters),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
180 visitS(e.funcBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
181 static if (is(E == ParenExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
182 visitE(e.next);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
183 static if (is(E == TraitsExpression))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
184 visitN(e.targs);
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
185 // VoidInitializer has no subnodes.
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
186 static if (is(E == ArrayInitializer))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
187 foreach (i, key; e.keys)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
188 key && visitE(key), visitE(e.values[i]);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
189 static if (is(E == StructInitializer))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
190 foreach (value; e.values)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
191 visitE(value);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
192 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
193 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
194 else
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
195 static if (is(T : Statement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
196 {
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
197 alias T S;
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
198 static if (is(S == Statements))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
199 foreach (node; s.children)
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
200 visitS(cast(Statement)cast(void*)node);
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
201 //IllegalStatement has no subnodes.
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
202 static if (is(S == FunctionBody))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
203 s.funcBody && visitS(s.funcBody),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
204 s.inBody && visitS(s.inBody),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
205 s.outBody && visitS(s.outBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
206 static if (is(S == ScopeStatement) || is(S == LabeledStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
207 visitS(s.s);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
208 static if (is(S == ExpressionStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
209 visitE(s.e);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
210 static if (is(S == DeclarationStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
211 visitD(s.decl);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
212 static if (is(S == IfStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
213 {
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
214 s.variable ? cast(Node)visitS(s.variable) : visitE(s.condition);
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
215 visitS(s.ifBody), s.elseBody && visitS(s.elseBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
216 }
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
217 static if (is(S == WhileStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
218 visitE(s.condition), visitS(s.whileBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
219 static if (is(S == DoWhileStatement))
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
220 visitS(s.doBody), visitE(s.condition);
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
221 static if (is(S == ForStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
222 s.init && visitS(s.init),
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
223 s.condition && visitE(s.condition),
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
224 s.increment && visitE(s.increment),
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
225 visitS(s.forBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
226 static if (is(S == ForeachStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
227 visitN(s.params), visitE(s.aggregate), visitS(s.forBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
228 static if (is(S == ForeachRangeStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
229 visitN(s.params), visitE(s.lower), visitE(s.upper), visitS(s.forBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
230 static if (is(S == SwitchStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
231 visitE(s.condition), visitS(s.switchBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
232 static if (is(S == CaseStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
233 {
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
234 foreach (value; s.values)
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
235 visitE(value);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
236 visitS(s.caseBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
237 }
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
238 static if (is(S == DefaultStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
239 visitS(s.defaultBody);
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
240 //ContinueStatement,
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
241 //BreakStatement have no subnodes.
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
242 static if (is(S == ReturnStatement))
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
243 s.e && visitE(s.e);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
244 static if (is(S == GotoStatement))
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
245 s.caseExpr && visitE(s.caseExpr);
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
246 static if (is(S == WithStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
247 visitE(s.e), visitS(s.withBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
248 static if (is(S == SynchronizedStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
249 s.e && visitE(s.e), visitS(s.syncBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
250 static if (is(S == TryStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
251 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
252 visitS(s.tryBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
253 foreach (body_; s.catchBodies)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
254 visitS(body_);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
255 s.finallyBody && visitS(s.finallyBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
256 }
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
257 static if (is(S == CatchBody))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
258 s.param && visitN(s.param), visitS(s.catchBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
259 static if (is(S == FinallyBody))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
260 visitS(s.finallyBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
261 static if (is(S == ScopeGuardStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
262 visitS(s.scopeBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
263 static if (is(S == ThrowStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
264 visitE(s.e);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
265 static if (is(S == VolatileStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
266 s.volatileBody && visitS(s.volatileBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
267 static if (is(S == AsmStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
268 visitS(s.statements);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
269 static if (is(S == AsmInstruction))
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
270 foreach (op; s.operands)
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
271 visitE(op);
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
272 //AsmAlignStatement has no subnodes.
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
273 static if (is(S == PragmaStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
274 {
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
275 foreach (arg; s.args)
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
276 visitE(arg);
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
277 visitS(s.pragmaBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
278 }
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
279 static if (is(S == MixinStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
280 visitE(s.templateExpr);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
281 static if (is(S == StaticIfStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
282 visitE(s.condition), visitS(s.ifBody), s.elseBody && visitS(s.elseBody);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
283 static if (is(S == StaticAssertStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
284 visitE(s.condition), s.message && visitE(s.message);
662
73bac90f90b2 Fixed visit() method for Statements in DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 660
diff changeset
285 static if (is(S == DebugStatement) || is(S == VersionStatement))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
286 visitS(s.mainBody), s.elseBody && visitS(s.elseBody);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
287 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
288 else
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
289 static if (is(T : TypeNode))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
290 {
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
291 //UndefinedType,
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
292 //IntegralType,
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
293 //IdentifierType have no subnodes.
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
294 static if (is(T == QualifiedType))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
295 visitT(t.left), visitT(t.right);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
296 static if (is(T == TypeofType))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
297 visitE(t.e);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
298 static if (is(T == TemplateInstanceType))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
299 t.targs && visitN(t.targs);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
300 static if (is(T == PointerType))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
301 visitT(t.next);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
302 static if (is(T == ArrayType))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
303 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
304 visitT(t.next);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
305 if (t.assocType)
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
306 visitT(t.assocType);
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
307 else if (t.e)
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
308 visitE(t.e), t.e2 && visitE(t.e2);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
309 }
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
310 static if (is(T == FunctionType) || is(T == DelegateType))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
311 visitT(t.returnType), visitN(t.parameters);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
312 static if (is(T == CFuncPointerType))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
313 visitT(t.next), t.params && visitN(t.params);
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
314 static if (is(T == ModuleScopeType) ||
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
315 is(T == BaseClass) ||
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
316 is(T == ConstType) ||
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
317 is(T == InvariantType))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
318 visitT(t.next);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
319 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
320 else
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
321 static if (is(T == Parameter))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
322 {
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
323 n.type && visitT(n.type);
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
324 n.defValue && visitE(n.defValue);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
325 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
326 else
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
327 static if (is(T == Parameters) ||
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
328 is(T == TemplateParameters) ||
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
329 is(T == TemplateArguments))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
330 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
331 foreach (node; n.children)
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
332 visitN(node);
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
333 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
334 else
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
335 static if (is(T : TemplateParameter))
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
336 {
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
337 static if (is(N == TemplateAliasParameter) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
338 is(N == TemplateTypeParameter) ||
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
339 is(N == TemplateThisParameter))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
340 n.specType && visitN(n.specType),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
341 n.defType && visitN(n.defType);
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
342 static if (is(N == TemplateValueParameter))
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
343 visitT(n.valueType),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
344 n.specValue && visitN(n.specValue),
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
345 n.defValue && visitN(n.defValue);
667
1ac758cd952a Fixed a few things in DefaultVisitor.d and Pass1.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 666
diff changeset
346 //TemplateTupleParameter has no subnodes.
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
347 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
348 else
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
349 assert(0, "Missing default visit method for: "~t.classinfo.name);
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
350 return t;
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
351 }
660
085bac570c7e Implemented class DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 655
diff changeset
352
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
353 /++
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
354 Generate default visit methods.
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
355 E.g:
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
356 private mixin .visitDefault!(ClassDeclaration) _ClassDeclaration;
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
357 override returnType!("ClassDeclaration") visit(ClassDeclaration node)
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
358 { return _ClassDeclaration.visitDefault(node); }
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
359 +/
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
360 char[] generateDefaultVisitMethods()
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
361 {
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
362 char[] text;
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
363 foreach (className; classNames)
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
364 text ~= "private mixin .visitDefault!("~className~") _"~className~";\n"
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
365 "override returnType!(\""~className~"\") visit("~className~" node){return _"~className~".visitDefault(node);}\n";
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
366 return text;
642
be45f982ee3e Added module dil.ast.DefaultVisitor.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
367 }
666
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
368 // pragma(msg, generateDefaultVisitMethods());
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
369
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
370 /++
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
371 This class provides default methods for traversing nodes in a syntax tree.
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
372 +/
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
373 class DefaultVisitor : Visitor
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
374 {
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
375 mixin(generateDefaultVisitMethods());
8d96a7b50982 Revamped DefaultVisitor class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 662
diff changeset
376 }