1
2/* Compiler implementation of the D programming language
3 * Copyright (C) 2013-2019 by The D Language Foundation, All Rights Reserved
4 * http://www.digitalmars.com
5 * Distributed under the Boost Software License, Version 1.0.
6 * http://www.boost.org/LICENSE_1_0.txt
7 * https://github.com/dlang/dmd/blob/master/src/dmd/visitor.h
8 */
9
10#pragma once
11
12#include "root/dsystem.h"
13
14class Statement;
15class ErrorStatement;
16class PeelStatement;
17class ExpStatement;
18class DtorExpStatement;
19class CompileStatement;
20class CompoundStatement;
21class CompoundDeclarationStatement;
22class UnrolledLoopStatement;
23class ScopeStatement;
24class ForwardingStatement;
25class WhileStatement;
26class DoStatement;
27class ForStatement;
28class ForeachStatement;
29class ForeachRangeStatement;
30class StaticForeachStatement;
31class IfStatement;
32class ConditionalStatement;
33class PragmaStatement;
34class StaticAssertStatement;
35class SwitchStatement;
36class CaseStatement;
37class CaseRangeStatement;
38class DefaultStatement;
39class GotoDefaultStatement;
40class GotoCaseStatement;
41class SwitchErrorStatement;
42class ReturnStatement;
43class BreakStatement;
44class ContinueStatement;
45class SynchronizedStatement;
46class WithStatement;
47class TryCatchStatement;
48class TryFinallyStatement;
49class OnScopeStatement;
50class ThrowStatement;
51class DebugStatement;
52class GotoStatement;
53class LabelStatement;
54class AsmStatement;
55class InlineAsmStatement;
56class GccAsmStatement;
57class CompoundAsmStatement;
58class ImportStatement;
59
60class Type;
61class TypeError;
62class TypeNext;
63class TypeBasic;
64class TypeVector;
65class TypeArray;
66class TypeSArray;
67class TypeDArray;
68class TypeAArray;
69class TypePointer;
70class TypeReference;
71class TypeFunction;
72class TypeDelegate;
73class TypeQualified;
74class TypeIdentifier;
75class TypeInstance;
76class TypeTypeof;
77class TypeReturn;
78class TypeStruct;
79class TypeEnum;
80class TypeClass;
81class TypeTuple;
82class TypeSlice;
83class TypeNull;
84class TypeTraits;
85
86class Dsymbol;
87
88class StaticAssert;
89class DebugSymbol;
90class VersionSymbol;
91class EnumMember;
92class Import;
93class OverloadSet;
94class LabelDsymbol;
95class AliasThis;
96
97class AttribDeclaration;
98class StorageClassDeclaration;
99class DeprecatedDeclaration;
100class LinkDeclaration;
101class CPPMangleDeclaration;
102class ProtDeclaration;
103class AlignDeclaration;
104class AnonDeclaration;
105class PragmaDeclaration;
106class ConditionalDeclaration;
107class StaticIfDeclaration;
108class CompileDeclaration;
109class StaticForeachDeclaration;
110class UserAttributeDeclaration;
111class ForwardingAttribDeclaration;
112
113class ScopeDsymbol;
114class TemplateDeclaration;
115class TemplateInstance;
116class TemplateMixin;
117class EnumDeclaration;
118class Package;
119class Module;
120class WithScopeSymbol;
121class ArrayScopeSymbol;
122class Nspace;
123
124class AggregateDeclaration;
125class StructDeclaration;
126class UnionDeclaration;
127class ClassDeclaration;
128class InterfaceDeclaration;
129
130class Declaration;
131class TupleDeclaration;
132class AliasDeclaration;
133class OverDeclaration;
134class VarDeclaration;
135class SymbolDeclaration;
136class ThisDeclaration;
137
138class TypeInfoDeclaration;
139class TypeInfoStructDeclaration;
140class TypeInfoClassDeclaration;
141class TypeInfoInterfaceDeclaration;
142class TypeInfoPointerDeclaration;
143class TypeInfoArrayDeclaration;
144class TypeInfoStaticArrayDeclaration;
145class TypeInfoAssociativeArrayDeclaration;
146class TypeInfoEnumDeclaration;
147class TypeInfoFunctionDeclaration;
148class TypeInfoDelegateDeclaration;
149class TypeInfoTupleDeclaration;
150class TypeInfoConstDeclaration;
151class TypeInfoInvariantDeclaration;
152class TypeInfoSharedDeclaration;
153class TypeInfoWildDeclaration;
154class TypeInfoVectorDeclaration;
155
156class FuncDeclaration;
157class FuncAliasDeclaration;
158class FuncLiteralDeclaration;
159class CtorDeclaration;
160class PostBlitDeclaration;
161class DtorDeclaration;
162class StaticCtorDeclaration;
163class SharedStaticCtorDeclaration;
164class StaticDtorDeclaration;
165class SharedStaticDtorDeclaration;
166class InvariantDeclaration;
167class UnitTestDeclaration;
168class NewDeclaration;
169class DeleteDeclaration;
170
171class Initializer;
172class VoidInitializer;
173class ErrorInitializer;
174class StructInitializer;
175class ArrayInitializer;
176class ExpInitializer;
177
178class Expression;
179class IntegerExp;
180class ErrorExp;
181class RealExp;
182class ComplexExp;
183class IdentifierExp;
184class DollarExp;
185class DsymbolExp;
186class ThisExp;
187class SuperExp;
188class NullExp;
189class StringExp;
190class TupleExp;
191class ArrayLiteralExp;
192class AssocArrayLiteralExp;
193class StructLiteralExp;
194class TypeExp;
195class ScopeExp;
196class TemplateExp;
197class NewExp;
198class NewAnonClassExp;
199class SymbolExp;
200class SymOffExp;
201class VarExp;
202class OverExp;
203class FuncExp;
204class DeclarationExp;
205class TypeidExp;
206class TraitsExp;
207class HaltExp;
208class IsExp;
209class UnaExp;
210class BinExp;
211class BinAssignExp;
212class CompileExp;
213class ImportExp;
214class AssertExp;
215class DotIdExp;
216class DotTemplateExp;
217class DotVarExp;
218class DotTemplateInstanceExp;
219class DelegateExp;
220class DotTypeExp;
221class CallExp;
222class AddrExp;
223class PtrExp;
224class NegExp;
225class UAddExp;
226class ComExp;
227class NotExp;
228class DeleteExp;
229class CastExp;
230class VectorExp;
231class VectorArrayExp;
232class SliceExp;
233class ArrayLengthExp;
234class IntervalExp;
235class DelegatePtrExp;
236class DelegateFuncptrExp;
237class ArrayExp;
238class DotExp;
239class CommaExp;
240class IndexExp;
241class PostExp;
242class PreExp;
243class AssignExp;
244class ConstructExp;
245class BlitExp;
246class AddAssignExp;
247class MinAssignExp;
248class MulAssignExp;
249class DivAssignExp;
250class ModAssignExp;
251class AndAssignExp;
252class OrAssignExp;
253class XorAssignExp;
254class PowAssignExp;
255class ShlAssignExp;
256class ShrAssignExp;
257class UshrAssignExp;
258class CatAssignExp;
259class AddExp;
260class MinExp;
261class CatExp;
262class MulExp;
263class DivExp;
264class ModExp;
265class PowExp;
266class ShlExp;
267class ShrExp;
268class UshrExp;
269class AndExp;
270class OrExp;
271class XorExp;
272class OrOrExp;
273class AndAndExp;
274class CmpExp;
275class InExp;
276class RemoveExp;
277class EqualExp;
278class IdentityExp;
279class CondExp;
280class DefaultInitExp;
281class FileInitExp;
282class LineInitExp;
283class ModuleInitExp;
284class FuncInitExp;
285class PrettyFuncInitExp;
286class ClassReferenceExp;
287class VoidInitExp;
288class ThrownExceptionExp;
289
290class TemplateParameter;
291class TemplateTypeParameter;
292class TemplateThisParameter;
293class TemplateValueParameter;
294class TemplateAliasParameter;
295class TemplateTupleParameter;
296
297class Condition;
298class DVCondition;
299class DebugCondition;
300class VersionCondition;
301class StaticIfCondition;
302
303class Parameter;
304
305class Visitor
306{
307public:
308    virtual void visit(Statement *) { assert(0); }
309    virtual void visit(ErrorStatement *s) { visit((Statement *)s); }
310    virtual void visit(PeelStatement *s) { visit((Statement *)s); }
311    virtual void visit(ExpStatement *s) { visit((Statement *)s); }
312    virtual void visit(DtorExpStatement *s) { visit((ExpStatement *)s); }
313    virtual void visit(CompileStatement *s) { visit((Statement *)s); }
314    virtual void visit(CompoundStatement *s) { visit((Statement *)s); }
315    virtual void visit(CompoundDeclarationStatement *s) { visit((CompoundStatement *)s); }
316    virtual void visit(UnrolledLoopStatement *s) { visit((Statement *)s); }
317    virtual void visit(ScopeStatement *s) { visit((Statement *)s); }
318    virtual void visit(ForwardingStatement *s) { visit((Statement *)s); }
319    virtual void visit(WhileStatement *s) { visit((Statement *)s); }
320    virtual void visit(DoStatement *s) { visit((Statement *)s); }
321    virtual void visit(ForStatement *s) { visit((Statement *)s); }
322    virtual void visit(ForeachStatement *s) { visit((Statement *)s); }
323    virtual void visit(ForeachRangeStatement *s) { visit((Statement *)s); }
324    virtual void visit(StaticForeachStatement *s) { visit((Statement *)s); }
325    virtual void visit(IfStatement *s) { visit((Statement *)s); }
326    virtual void visit(ConditionalStatement *s) { visit((Statement *)s); }
327    virtual void visit(PragmaStatement *s) { visit((Statement *)s); }
328    virtual void visit(StaticAssertStatement *s) { visit((Statement *)s); }
329    virtual void visit(SwitchStatement *s) { visit((Statement *)s); }
330    virtual void visit(CaseStatement *s) { visit((Statement *)s); }
331    virtual void visit(CaseRangeStatement *s) { visit((Statement *)s); }
332    virtual void visit(DefaultStatement *s) { visit((Statement *)s); }
333    virtual void visit(GotoDefaultStatement *s) { visit((Statement *)s); }
334    virtual void visit(GotoCaseStatement *s) { visit((Statement *)s); }
335    virtual void visit(SwitchErrorStatement *s) { visit((Statement *)s); }
336    virtual void visit(ReturnStatement *s) { visit((Statement *)s); }
337    virtual void visit(BreakStatement *s) { visit((Statement *)s); }
338    virtual void visit(ContinueStatement *s) { visit((Statement *)s); }
339    virtual void visit(SynchronizedStatement *s) { visit((Statement *)s); }
340    virtual void visit(WithStatement *s) { visit((Statement *)s); }
341    virtual void visit(TryCatchStatement *s) { visit((Statement *)s); }
342    virtual void visit(TryFinallyStatement *s) { visit((Statement *)s); }
343    virtual void visit(OnScopeStatement *s) { visit((Statement *)s); }
344    virtual void visit(ThrowStatement *s) { visit((Statement *)s); }
345    virtual void visit(DebugStatement *s) { visit((Statement *)s); }
346    virtual void visit(GotoStatement *s) { visit((Statement *)s); }
347    virtual void visit(LabelStatement *s) { visit((Statement *)s); }
348    virtual void visit(AsmStatement *s) { visit((Statement *)s); }
349    virtual void visit(InlineAsmStatement *s) { visit((AsmStatement *)s); }
350    virtual void visit(GccAsmStatement *s) { visit((AsmStatement *)s); }
351    virtual void visit(CompoundAsmStatement *s) { visit((CompoundStatement *)s); }
352    virtual void visit(ImportStatement *s) { visit((Statement *)s); }
353
354    virtual void visit(Type *) { assert(0); }
355    virtual void visit(TypeError *t) { visit((Type *)t); }
356    virtual void visit(TypeNext *t) { visit((Type *)t); }
357    virtual void visit(TypeBasic *t) { visit((Type *)t); }
358    virtual void visit(TypeVector *t) { visit((Type *)t); }
359    virtual void visit(TypeArray *t) { visit((TypeNext *)t); }
360    virtual void visit(TypeSArray *t) { visit((TypeArray *)t); }
361    virtual void visit(TypeDArray *t) { visit((TypeArray *)t); }
362    virtual void visit(TypeAArray *t) { visit((TypeArray *)t); }
363    virtual void visit(TypePointer *t) { visit((TypeNext *)t); }
364    virtual void visit(TypeReference *t) { visit((TypeNext *)t); }
365    virtual void visit(TypeFunction *t) { visit((TypeNext *)t); }
366    virtual void visit(TypeDelegate *t) { visit((TypeNext *)t); }
367    virtual void visit(TypeQualified *t) { visit((Type *)t); }
368    virtual void visit(TypeIdentifier *t) { visit((TypeQualified *)t); }
369    virtual void visit(TypeInstance *t) { visit((TypeQualified *)t); }
370    virtual void visit(TypeTypeof *t) { visit((TypeQualified *)t); }
371    virtual void visit(TypeReturn *t) { visit((TypeQualified *)t); }
372    virtual void visit(TypeStruct *t) { visit((Type *)t); }
373    virtual void visit(TypeEnum *t) { visit((Type *)t); }
374    virtual void visit(TypeClass *t) { visit((Type *)t); }
375    virtual void visit(TypeTuple *t) { visit((Type *)t); }
376    virtual void visit(TypeSlice *t) { visit((TypeNext *)t); }
377    virtual void visit(TypeNull *t) { visit((Type *)t); }
378    virtual void visit(TypeTraits *t) { visit((Type *)t); }
379
380    virtual void visit(Dsymbol *) { assert(0); }
381
382    virtual void visit(StaticAssert *s) { visit((Dsymbol *)s); }
383    virtual void visit(DebugSymbol *s) { visit((Dsymbol *)s); }
384    virtual void visit(VersionSymbol *s) { visit((Dsymbol *)s); }
385    virtual void visit(EnumMember *s) { visit((VarDeclaration *)s); }
386    virtual void visit(Import *s) { visit((Dsymbol *)s); }
387    virtual void visit(OverloadSet *s) { visit((Dsymbol *)s); }
388    virtual void visit(LabelDsymbol *s) { visit((Dsymbol *)s); }
389    virtual void visit(AliasThis *s) { visit((Dsymbol *)s); }
390
391    virtual void visit(AttribDeclaration *s) { visit((Dsymbol *)s); }
392    virtual void visit(StorageClassDeclaration *s) { visit((AttribDeclaration *)s); }
393    virtual void visit(DeprecatedDeclaration *s) { visit((StorageClassDeclaration *)s); }
394    virtual void visit(LinkDeclaration *s) { visit((AttribDeclaration *)s); }
395    virtual void visit(CPPMangleDeclaration *s) { visit((AttribDeclaration *)s); }
396    virtual void visit(ProtDeclaration *s) { visit((AttribDeclaration *)s); }
397    virtual void visit(AlignDeclaration *s) { visit((AttribDeclaration *)s); }
398    virtual void visit(AnonDeclaration *s) { visit((AttribDeclaration *)s); }
399    virtual void visit(PragmaDeclaration *s) { visit((AttribDeclaration *)s); }
400    virtual void visit(ConditionalDeclaration *s) { visit((AttribDeclaration *)s); }
401    virtual void visit(StaticIfDeclaration *s) { visit((ConditionalDeclaration *)s); }
402    virtual void visit(StaticForeachDeclaration *s) { visit((AttribDeclaration *)s); }
403    virtual void visit(CompileDeclaration *s) { visit((AttribDeclaration *)s); }
404    virtual void visit(UserAttributeDeclaration *s) { visit((AttribDeclaration *)s); }
405    virtual void visit(ForwardingAttribDeclaration *s) { visit((AttribDeclaration *)s); }
406
407    virtual void visit(ScopeDsymbol *s) { visit((Dsymbol *)s); }
408    virtual void visit(TemplateDeclaration *s) { visit((ScopeDsymbol *)s); }
409    virtual void visit(TemplateInstance *s) { visit((ScopeDsymbol *)s); }
410    virtual void visit(TemplateMixin *s) { visit((TemplateInstance *)s); }
411    virtual void visit(EnumDeclaration *s) { visit((ScopeDsymbol *)s); }
412    virtual void visit(Package *s) { visit((ScopeDsymbol *)s); }
413    virtual void visit(Module *s) { visit((Package *)s); }
414    virtual void visit(WithScopeSymbol *s) { visit((ScopeDsymbol *)s); }
415    virtual void visit(ArrayScopeSymbol *s) { visit((ScopeDsymbol *)s); }
416    virtual void visit(Nspace *s) { visit((ScopeDsymbol *)s); }
417
418    virtual void visit(AggregateDeclaration *s) { visit((ScopeDsymbol *)s); }
419    virtual void visit(StructDeclaration *s) { visit((AggregateDeclaration *)s); }
420    virtual void visit(UnionDeclaration *s) { visit((StructDeclaration *)s); }
421    virtual void visit(ClassDeclaration *s) { visit((AggregateDeclaration *)s); }
422    virtual void visit(InterfaceDeclaration *s) { visit((ClassDeclaration *)s); }
423
424    virtual void visit(Declaration *s) { visit((Dsymbol *)s); }
425    virtual void visit(TupleDeclaration *s) { visit((Declaration *)s); }
426    virtual void visit(AliasDeclaration *s) { visit((Declaration *)s); }
427    virtual void visit(OverDeclaration *s) { visit((Declaration *)s); }
428    virtual void visit(VarDeclaration *s) { visit((Declaration *)s); }
429    virtual void visit(SymbolDeclaration *s) { visit((Declaration *)s); }
430    virtual void visit(ThisDeclaration *s) { visit((VarDeclaration *)s); }
431
432    virtual void visit(TypeInfoDeclaration *s) { visit((VarDeclaration *)s); }
433    virtual void visit(TypeInfoStructDeclaration *s) { visit((TypeInfoDeclaration *)s); }
434    virtual void visit(TypeInfoClassDeclaration *s) { visit((TypeInfoDeclaration *)s); }
435    virtual void visit(TypeInfoInterfaceDeclaration *s) { visit((TypeInfoDeclaration *)s); }
436    virtual void visit(TypeInfoPointerDeclaration *s) { visit((TypeInfoDeclaration *)s); }
437    virtual void visit(TypeInfoArrayDeclaration *s) { visit((TypeInfoDeclaration *)s); }
438    virtual void visit(TypeInfoStaticArrayDeclaration *s) { visit((TypeInfoDeclaration *)s); }
439    virtual void visit(TypeInfoAssociativeArrayDeclaration *s) { visit((TypeInfoDeclaration *)s); }
440    virtual void visit(TypeInfoEnumDeclaration *s) { visit((TypeInfoDeclaration *)s); }
441    virtual void visit(TypeInfoFunctionDeclaration *s) { visit((TypeInfoDeclaration *)s); }
442    virtual void visit(TypeInfoDelegateDeclaration *s) { visit((TypeInfoDeclaration *)s); }
443    virtual void visit(TypeInfoTupleDeclaration *s) { visit((TypeInfoDeclaration *)s); }
444    virtual void visit(TypeInfoConstDeclaration *s) { visit((TypeInfoDeclaration *)s); }
445    virtual void visit(TypeInfoInvariantDeclaration *s) { visit((TypeInfoDeclaration *)s); }
446    virtual void visit(TypeInfoSharedDeclaration *s) { visit((TypeInfoDeclaration *)s); }
447    virtual void visit(TypeInfoWildDeclaration *s) { visit((TypeInfoDeclaration *)s); }
448    virtual void visit(TypeInfoVectorDeclaration *s) { visit((TypeInfoDeclaration *)s); }
449
450    virtual void visit(FuncDeclaration *s) { visit((Declaration *)s); }
451    virtual void visit(FuncAliasDeclaration *s) { visit((FuncDeclaration *)s); }
452    virtual void visit(FuncLiteralDeclaration *s) { visit((FuncDeclaration *)s); }
453    virtual void visit(CtorDeclaration *s) { visit((FuncDeclaration *)s); }
454    virtual void visit(PostBlitDeclaration *s) { visit((FuncDeclaration *)s); }
455    virtual void visit(DtorDeclaration *s) { visit((FuncDeclaration *)s); }
456    virtual void visit(StaticCtorDeclaration *s) { visit((FuncDeclaration *)s); }
457    virtual void visit(SharedStaticCtorDeclaration *s) { visit((StaticCtorDeclaration *)s); }
458    virtual void visit(StaticDtorDeclaration *s) { visit((FuncDeclaration *)s); }
459    virtual void visit(SharedStaticDtorDeclaration *s) { visit((StaticDtorDeclaration *)s); }
460    virtual void visit(InvariantDeclaration *s) { visit((FuncDeclaration *)s); }
461    virtual void visit(UnitTestDeclaration *s) { visit((FuncDeclaration *)s); }
462    virtual void visit(NewDeclaration *s) { visit((FuncDeclaration *)s); }
463    virtual void visit(DeleteDeclaration *s) { visit((FuncDeclaration *)s); }
464
465    virtual void visit(Initializer *) { assert(0); }
466    virtual void visit(VoidInitializer *i) { visit((Initializer *)i); }
467    virtual void visit(ErrorInitializer *i) { visit((Initializer *)i); }
468    virtual void visit(StructInitializer *i) { visit((Initializer *)i); }
469    virtual void visit(ArrayInitializer *i) { visit((Initializer *)i); }
470    virtual void visit(ExpInitializer *i) { visit((Initializer *)i); }
471
472    virtual void visit(Expression *) { assert(0); }
473    virtual void visit(IntegerExp *e) { visit((Expression *)e); }
474    virtual void visit(ErrorExp *e) { visit((Expression *)e); }
475    virtual void visit(RealExp *e) { visit((Expression *)e); }
476    virtual void visit(ComplexExp *e) { visit((Expression *)e); }
477    virtual void visit(IdentifierExp *e) { visit((Expression *)e); }
478    virtual void visit(DollarExp *e) { visit((IdentifierExp *)e); }
479    virtual void visit(DsymbolExp *e) { visit((Expression *)e); }
480    virtual void visit(ThisExp *e) { visit((Expression *)e); }
481    virtual void visit(SuperExp *e) { visit((ThisExp *)e); }
482    virtual void visit(NullExp *e) { visit((Expression *)e); }
483    virtual void visit(StringExp *e) { visit((Expression *)e); }
484    virtual void visit(TupleExp *e) { visit((Expression *)e); }
485    virtual void visit(ArrayLiteralExp *e) { visit((Expression *)e); }
486    virtual void visit(AssocArrayLiteralExp *e) { visit((Expression *)e); }
487    virtual void visit(StructLiteralExp *e) { visit((Expression *)e); }
488    virtual void visit(TypeExp *e) { visit((Expression *)e); }
489    virtual void visit(ScopeExp *e) { visit((Expression *)e); }
490    virtual void visit(TemplateExp *e) { visit((Expression *)e); }
491    virtual void visit(NewExp *e) { visit((Expression *)e); }
492    virtual void visit(NewAnonClassExp *e) { visit((Expression *)e); }
493    virtual void visit(SymbolExp *e) { visit((Expression *)e); }
494    virtual void visit(SymOffExp *e) { visit((SymbolExp *)e); }
495    virtual void visit(VarExp *e) { visit((SymbolExp *)e); }
496    virtual void visit(OverExp *e) { visit((Expression *)e); }
497    virtual void visit(FuncExp *e) { visit((Expression *)e); }
498    virtual void visit(DeclarationExp *e) { visit((Expression *)e); }
499    virtual void visit(TypeidExp *e) { visit((Expression *)e); }
500    virtual void visit(TraitsExp *e) { visit((Expression *)e); }
501    virtual void visit(HaltExp *e) { visit((Expression *)e); }
502    virtual void visit(IsExp *e) { visit((Expression *)e); }
503    virtual void visit(UnaExp *e) { visit((Expression *)e); }
504    virtual void visit(BinExp *e) { visit((Expression *)e); }
505    virtual void visit(BinAssignExp *e) { visit((BinExp *)e); }
506    virtual void visit(CompileExp *e) { visit((UnaExp *)e); }
507    virtual void visit(ImportExp *e) { visit((UnaExp *)e); }
508    virtual void visit(AssertExp *e) { visit((UnaExp *)e); }
509    virtual void visit(DotIdExp *e) { visit((UnaExp *)e); }
510    virtual void visit(DotTemplateExp *e) { visit((UnaExp *)e); }
511    virtual void visit(DotVarExp *e) { visit((UnaExp *)e); }
512    virtual void visit(DotTemplateInstanceExp *e) { visit((UnaExp *)e); }
513    virtual void visit(DelegateExp *e) { visit((UnaExp *)e); }
514    virtual void visit(DotTypeExp *e) { visit((UnaExp *)e); }
515    virtual void visit(CallExp *e) { visit((UnaExp *)e); }
516    virtual void visit(AddrExp *e) { visit((UnaExp *)e); }
517    virtual void visit(PtrExp *e) { visit((UnaExp *)e); }
518    virtual void visit(NegExp *e) { visit((UnaExp *)e); }
519    virtual void visit(UAddExp *e) { visit((UnaExp *)e); }
520    virtual void visit(ComExp *e) { visit((UnaExp *)e); }
521    virtual void visit(NotExp *e) { visit((UnaExp *)e); }
522    virtual void visit(DeleteExp *e) { visit((UnaExp *)e); }
523    virtual void visit(CastExp *e) { visit((UnaExp *)e); }
524    virtual void visit(VectorExp *e) { visit((UnaExp *)e); }
525    virtual void visit(VectorArrayExp *e) { visit((UnaExp *)e); }
526    virtual void visit(SliceExp *e) { visit((UnaExp *)e); }
527    virtual void visit(ArrayLengthExp *e) { visit((UnaExp *)e); }
528    virtual void visit(IntervalExp *e) { visit((Expression *)e); }
529    virtual void visit(DelegatePtrExp *e) { visit((UnaExp *)e); }
530    virtual void visit(DelegateFuncptrExp *e) { visit((UnaExp *)e); }
531    virtual void visit(ArrayExp *e) { visit((UnaExp *)e); }
532    virtual void visit(DotExp *e) { visit((BinExp *)e); }
533    virtual void visit(CommaExp *e) { visit((BinExp *)e); }
534    virtual void visit(IndexExp *e) { visit((BinExp *)e); }
535    virtual void visit(PostExp *e) { visit((BinExp *)e); }
536    virtual void visit(PreExp *e) { visit((UnaExp *)e); }
537    virtual void visit(AssignExp *e) { visit((BinExp *)e); }
538    virtual void visit(ConstructExp *e) { visit((AssignExp *)e); }
539    virtual void visit(BlitExp *e) { visit((AssignExp *)e); }
540    virtual void visit(AddAssignExp *e) { visit((BinAssignExp *)e); }
541    virtual void visit(MinAssignExp *e) { visit((BinAssignExp *)e); }
542    virtual void visit(MulAssignExp *e) { visit((BinAssignExp *)e); }
543    virtual void visit(DivAssignExp *e) { visit((BinAssignExp *)e); }
544    virtual void visit(ModAssignExp *e) { visit((BinAssignExp *)e); }
545    virtual void visit(AndAssignExp *e) { visit((BinAssignExp *)e); }
546    virtual void visit(OrAssignExp *e) { visit((BinAssignExp *)e); }
547    virtual void visit(XorAssignExp *e) { visit((BinAssignExp *)e); }
548    virtual void visit(PowAssignExp *e) { visit((BinAssignExp *)e); }
549    virtual void visit(ShlAssignExp *e) { visit((BinAssignExp *)e); }
550    virtual void visit(ShrAssignExp *e) { visit((BinAssignExp *)e); }
551    virtual void visit(UshrAssignExp *e) { visit((BinAssignExp *)e); }
552    virtual void visit(CatAssignExp *e) { visit((BinAssignExp *)e); }
553    virtual void visit(AddExp *e) { visit((BinExp *)e); }
554    virtual void visit(MinExp *e) { visit((BinExp *)e); }
555    virtual void visit(CatExp *e) { visit((BinExp *)e); }
556    virtual void visit(MulExp *e) { visit((BinExp *)e); }
557    virtual void visit(DivExp *e) { visit((BinExp *)e); }
558    virtual void visit(ModExp *e) { visit((BinExp *)e); }
559    virtual void visit(PowExp *e) { visit((BinExp *)e); }
560    virtual void visit(ShlExp *e) { visit((BinExp *)e); }
561    virtual void visit(ShrExp *e) { visit((BinExp *)e); }
562    virtual void visit(UshrExp *e) { visit((BinExp *)e); }
563    virtual void visit(AndExp *e) { visit((BinExp *)e); }
564    virtual void visit(OrExp *e) { visit((BinExp *)e); }
565    virtual void visit(XorExp *e) { visit((BinExp *)e); }
566    virtual void visit(OrOrExp *e) { visit((BinExp *)e); }
567    virtual void visit(AndAndExp *e) { visit((BinExp *)e); }
568    virtual void visit(CmpExp *e) { visit((BinExp *)e); }
569    virtual void visit(InExp *e) { visit((BinExp *)e); }
570    virtual void visit(RemoveExp *e) { visit((BinExp *)e); }
571    virtual void visit(EqualExp *e) { visit((BinExp *)e); }
572    virtual void visit(IdentityExp *e) { visit((BinExp *)e); }
573    virtual void visit(CondExp *e) { visit((BinExp *)e); }
574    virtual void visit(DefaultInitExp *e) { visit((Expression *)e); }
575    virtual void visit(FileInitExp *e) { visit((DefaultInitExp *)e); }
576    virtual void visit(LineInitExp *e) { visit((DefaultInitExp *)e); }
577    virtual void visit(ModuleInitExp *e) { visit((DefaultInitExp *)e); }
578    virtual void visit(FuncInitExp *e) { visit((DefaultInitExp *)e); }
579    virtual void visit(PrettyFuncInitExp *e) { visit((DefaultInitExp *)e); }
580    virtual void visit(ClassReferenceExp *e) { visit((Expression *)e); }
581    virtual void visit(VoidInitExp *e) { visit((Expression *)e); }
582    virtual void visit(ThrownExceptionExp *e) { visit((Expression *)e); }
583
584    virtual void visit(TemplateParameter *) { assert(0); }
585    virtual void visit(TemplateTypeParameter *tp) { visit((TemplateParameter *)tp); }
586    virtual void visit(TemplateThisParameter *tp) { visit((TemplateTypeParameter *)tp); }
587    virtual void visit(TemplateValueParameter *tp) { visit((TemplateParameter *)tp); }
588    virtual void visit(TemplateAliasParameter *tp) { visit((TemplateParameter *)tp); }
589    virtual void visit(TemplateTupleParameter *tp) { visit((TemplateParameter *)tp); }
590
591    virtual void visit(Condition *) { assert(0); }
592    virtual void visit(DVCondition *c) { visit((Condition *)c); }
593    virtual void visit(DebugCondition *c) { visit((DVCondition *)c); }
594    virtual void visit(VersionCondition *c) { visit((DVCondition *)c); }
595    virtual void visit(StaticIfCondition *c) { visit((Condition *)c); }
596
597    virtual void visit(Parameter *) { assert(0); }
598};
599
600class StoppableVisitor : public Visitor
601{
602public:
603    bool stop;
604    StoppableVisitor() : stop(false) {}
605};
606