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