changeset 660:085bac570c7e

Implemented class DefaultVisitor.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Tue, 15 Jan 2008 23:26:49 +0100
parents 304331ca2f95
children c37d25d661af
files trunk/src/dil/ast/Declarations.d trunk/src/dil/ast/DefaultVisitor.d trunk/src/dil/ast/Statements.d
diffstat 3 files changed, 558 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/ast/Declarations.d	Tue Jan 15 20:34:39 2008 +0100
+++ b/trunk/src/dil/ast/Declarations.d	Tue Jan 15 23:26:49 2008 +0100
@@ -459,7 +459,7 @@
     super.hasBody = true;
     mixin(set_kind);
     addChild(condition);
-    addOptChild(ifDecls);
+    addChild(ifDecls);
     addOptChild(elseDecls);
 
     this.condition = condition;
--- a/trunk/src/dil/ast/DefaultVisitor.d	Tue Jan 15 20:34:39 2008 +0100
+++ b/trunk/src/dil/ast/DefaultVisitor.d	Tue Jan 15 23:26:49 2008 +0100
@@ -15,5 +15,537 @@
 
 class DefaultVisitor : Visitor
 {
-  // TODO: implement visit methods to traverse syntax tree.
+override: // Override methods of the base class.
+  Declaration visit(D : Declaration)(D d)
+  {
+    static if (is(D == Declarations))
+      foreach (node; d.children)
+        visitD(node.to!(Declaration));
+    static if (is(D == EmptyDeclaration))
+    static if (is(D == IllegalDeclaration))
+    static if (is(D == ModuleDeclaration))
+    static if (is(D == AliasDeclaration) ||
+               is(D == AliasDeclaration) ||
+               is(D == TypedefDeclaration))
+      visitD(d.decl);
+    static if (is(D == EnumDeclaration))
+    {
+      foreach (member; d.members)
+        visitD(member);
+      visitT(d.baseType);
+    }
+    static if (is(D == EnumMember))
+      visitE(d.value);
+    static if (is(D == ClassDeclaration) || is( D == InterfaceDeclaration))
+    {
+      d.tparams && visitN(d.tparams);
+      foreach (base; d.bases)
+        visitT(base);
+      d.decls && visitD(d.decls);
+    }
+    static if (is(D == StructDeclaration) || is(D == UnionDeclaration))
+      d.tparams && visitN(d.tparams),
+      d.decls && visitD(d.decls);
+    static if (is(D == ConstructorDeclaration))
+      visitN(d.parameters),
+      visitS(d.funcBody);
+    static if (is(D == StaticConstructorDeclaration) ||
+               is(D == DestructorDeclaration) ||
+               is(D == StaticDestructorDeclaration) ||
+               is(D == InvariantDeclaration) ||
+               is(D == UnittestDeclaration))
+      visitS(d.funcBody);
+    static if (is(D == FunctionDeclaration))
+      visitT(d.returnType),
+      d.tparams && visitN(d.tparams),
+      visitN(d.params),
+      visitS(d.funcBody);
+    static if (is(D == VariableDeclaration))
+    {
+      d.typeNode && visitT(d.typeNode);
+      foreach(value; d.values)
+        value && visitE(value);
+    }
+    static if (is(D == DebugDeclaration) || is(D == VersionDeclaration))
+      visitD(d.decls),
+      d.elseDecls && visitD(d.elseDecls);
+    static if (is(D == StaticIfDeclaration))
+      visitE(d.condition),
+      visitD(d.ifDecls),
+      d.elseDecls && visitD(d.elseDecls);
+    static if (is(D == StaticAssertDeclaration))
+      visitE(d.condition),
+      d.message && visitE(d.message);
+    static if (is(D == TemplateDeclaration))
+      d.tparams && visitN(d.tparams),
+      visitD(d.decls);
+    static if (is(D == NewDeclaration) || is(D == DeleteDeclaration))
+      visitN(d.parameters),
+      visitS(d.funcBody);
+    static if (is(D == ProtectionDeclaration) ||
+               is(D == StorageClassDeclaration) ||
+               is(D == LinkageDeclaration) ||
+               is(D == AlignDeclaration))
+      visitD(d.decls);
+    static if (is(D == PragmaDeclaration))
+    {
+      foreach (arg; d.args)
+        visitE(arg);
+      visitD(d.decls);
+    }
+    static if (is(D == MixinDeclaration))
+      d.templateExpr ? visitE(d.templateExpr) : visitE(d.argument);
+    return d;
+  }
+
+  mixin visit!(Declarations);
+  mixin visit!(EmptyDeclaration);
+  mixin visit!(IllegalDeclaration);
+  mixin visit!(ModuleDeclaration);
+  mixin visit!(ImportDeclaration);
+  mixin visit!(AliasDeclaration);
+  mixin visit!(TypedefDeclaration);
+  mixin visit!(EnumDeclaration);
+  mixin visit!(EnumMember);
+  mixin visit!(ClassDeclaration);
+  mixin visit!(InterfaceDeclaration);
+  mixin visit!(StructDeclaration);
+  mixin visit!(UnionDeclaration);
+  mixin visit!(ConstructorDeclaration);
+  mixin visit!(StaticConstructorDeclaration);
+  mixin visit!(DestructorDeclaration);
+  mixin visit!(StaticDestructorDeclaration);
+  mixin visit!(FunctionDeclaration);
+  mixin visit!(VariableDeclaration);
+  mixin visit!(InvariantDeclaration);
+  mixin visit!(UnittestDeclaration);
+  mixin visit!(DebugDeclaration);
+  mixin visit!(VersionDeclaration);
+  mixin visit!(StaticIfDeclaration);
+  mixin visit!(StaticAssertDeclaration);
+  mixin visit!(TemplateDeclaration);
+  mixin visit!(NewDeclaration);
+  mixin visit!(DeleteDeclaration);
+  mixin visit!(ProtectionDeclaration);
+  mixin visit!(StorageClassDeclaration);
+  mixin visit!(LinkageDeclaration);
+  mixin visit!(AlignDeclaration);
+  mixin visit!(PragmaDeclaration);
+  mixin visit!(MixinDeclaration);
+
+  Expression visit(E : Expression)(E e)
+  {
+    static if (is(E == IllegalExpression))
+    {}
+    else
+    static if (is(E : CondExpression))
+      visitE(e.condition), visitE(e.left), visitE(e.right);
+    else
+    static if (is(E : BinaryExpression))
+      visitE(e.left), visitE(e.right);
+    else
+    static if (is(E : UnaryExpression))
+    {
+      static if (is(E == CastExpression))
+        visitT(e.type);
+      visitE(e.e); // member of UnaryExpression
+      static if (is(E == IndexExpression))
+        foreach (arg; e.args)
+          visitE(arg);
+      static if (is(E == SliceExpression))
+        visitE(e.left), visitE(e.right);
+      static if (is(E == AsmPostBracketExpression))
+        visitE(e.e2);
+    }
+    else
+    {
+      static if (is(E == NewExpression))
+      {
+        foreach (arg; e.newArgs)
+          visitE(arg);
+        visitT(e.type);
+        foreach (arg; e.ctorArgs)
+          visitE(arg);
+      }
+      static if (is(E == NewAnonClassExpression))
+      {
+        foreach (arg; e.newArgs)
+          visitE(arg);
+        foreach (base; e.bases)
+          visitT(base);
+        foreach (arg; e.ctorArgs)
+          visitE(arg);
+        visitD(e.decls);
+      }
+      static if (is(E == AsmBracketExpression))
+        visitE(e.e);
+      static if (is(E == TemplateInstanceExpression))
+        e.targs && visitN(e.targs);
+      static if (is(E == ArrayLiteralExpression))
+        foreach (value; e.values)
+          visitE(value);
+      static if (is(E == AArrayLiteralExpression))
+        foreach (i, key; e.keys)
+          visitE(key), visitE(e.values[i]);
+      static if (is(E == AssertExpression))
+        visitE(e.expr), e.msg && visitE(e.msg);
+      static if (is(E == MixinExpression) ||
+                 is(E == ImportExpression))
+        visitE(e.expr);
+      static if (is(E == TypeofExpression) ||
+                 is(E == TypeDotIdExpression) ||
+                 is(E == TypeidExpression))
+        visitT(e.type);
+      static if (is(E == IsExpression))
+        visitT(e.type), e.specType && visitT(e.specType),
+        e.tparams && visitN(e.tparams);
+      static if (is(E == FunctionLiteralExpression))
+        e.returnType && visitT(e.returnType),
+        e.parameters && visitN(e.parameters),
+        visitS(e.funcBody);
+      static if (is(E == ParenExpression))
+        visitE(e.next);
+      static if (is(E == TraitsExpression))
+        visitN(e.targs);
+      static if (is(E == ArrayInitializer))
+        foreach (i, key; e.keys)
+          key && visitE(key), visitE(e.values[i]);
+      static if (is(E == StructInitializer))
+        foreach (value; e.values)
+          visitE(value);
+
+    }
+    return e;
+  }
+
+  mixin visit!(IllegalExpression);
+  mixin visit!(CondExpression);
+  mixin visit!(CommaExpression);
+  mixin visit!(OrOrExpression);
+  mixin visit!(AndAndExpression);
+  mixin visit!(OrExpression);
+  mixin visit!(XorExpression);
+  mixin visit!(AndExpression);
+  mixin visit!(EqualExpression);
+  mixin visit!(IdentityExpression);
+  mixin visit!(RelExpression);
+  mixin visit!(InExpression);
+  mixin visit!(LShiftExpression);
+  mixin visit!(RShiftExpression);
+  mixin visit!(URShiftExpression);
+  mixin visit!(PlusExpression);
+  mixin visit!(MinusExpression);
+  mixin visit!(CatExpression);
+  mixin visit!(MulExpression);
+  mixin visit!(DivExpression);
+  mixin visit!(ModExpression);
+  mixin visit!(AssignExpression);
+  mixin visit!(LShiftAssignExpression);
+  mixin visit!(RShiftAssignExpression);
+  mixin visit!(URShiftAssignExpression);
+  mixin visit!(OrAssignExpression);
+  mixin visit!(AndAssignExpression);
+  mixin visit!(PlusAssignExpression);
+  mixin visit!(MinusAssignExpression);
+  mixin visit!(DivAssignExpression);
+  mixin visit!(MulAssignExpression);
+  mixin visit!(ModAssignExpression);
+  mixin visit!(XorAssignExpression);
+  mixin visit!(CatAssignExpression);
+  mixin visit!(DotExpression);
+
+  mixin visit!(AddressExpression);
+  mixin visit!(PreIncrExpression);
+  mixin visit!(PreDecrExpression);
+  mixin visit!(PostIncrExpression);
+  mixin visit!(PostDecrExpression);
+  mixin visit!(DerefExpression);
+  mixin visit!(SignExpression);
+  mixin visit!(NotExpression);
+  mixin visit!(CompExpression);
+  mixin visit!(CallExpression);
+  mixin visit!(NewExpression);
+  mixin visit!(NewAnonClassExpression);
+  mixin visit!(DeleteExpression);
+  mixin visit!(CastExpression);
+  mixin visit!(IndexExpression);
+  mixin visit!(SliceExpression);
+  mixin visit!(ModuleScopeExpression);
+
+  mixin visit!(IdentifierExpression);
+  mixin visit!(SpecialTokenExpression);
+  mixin visit!(TemplateInstanceExpression);
+  mixin visit!(ThisExpression);
+  mixin visit!(SuperExpression);
+  mixin visit!(NullExpression);
+  mixin visit!(DollarExpression);
+  mixin visit!(BoolExpression);
+  mixin visit!(IntExpression);
+  mixin visit!(RealExpression);
+  mixin visit!(ComplexExpression);
+  mixin visit!(CharExpression);
+  mixin visit!(StringExpression);
+  mixin visit!(ArrayLiteralExpression);
+  mixin visit!(AArrayLiteralExpression);
+  mixin visit!(AssertExpression);
+  mixin visit!(MixinExpression);
+  mixin visit!(ImportExpression);
+  mixin visit!(TypeofExpression);
+  mixin visit!(TypeDotIdExpression);
+  mixin visit!(TypeidExpression);
+
+  mixin visit!(IsExpression);
+  mixin visit!(FunctionLiteralExpression);
+  mixin visit!(ParenExpression);
+  mixin visit!(TraitsExpression);
+  mixin visit!(VoidInitializer);
+  mixin visit!(ArrayInitializer);
+  mixin visit!(StructInitializer);
+  mixin visit!(AsmTypeExpression);
+
+  mixin visit!(AsmOffsetExpression);
+  mixin visit!(AsmSegExpression);
+  mixin visit!(AsmPostBracketExpression);
+  mixin visit!(AsmBracketExpression);
+  mixin visit!(AsmLocalSizeExpression);
+  mixin visit!(AsmRegisterExpression);
+
+  Statement visit(S : Statement)(S s)
+  {
+    static if (is(T == Statements))
+      foreach (node; s.children)
+        visitS(node.to!(Statement));
+    //static if (is(T == IllegalStatement))
+    static if (is(T == FunctionBody))
+      s.funcBody && visitS(s.funcBody),
+      s.inBody && visitS(s.inBody),
+      s.outBody && visitS(s.outBody);
+    static if (is(T == ScopeStatement))
+      visitS(s.s);
+    static if (is(T == LabeledStatement))
+      visitS(s.s);
+    static if (is(T == ExpressionStatement))
+      visitE(s.e);
+    static if (is(T == DeclarationStatement))
+      visitD(s.decl);
+    static if (is(T == IfStatement))
+    {
+      s.variable ? visitS(s.variable) : visitS(s.condition);
+      visitS(s.ifBody), s.elseBody && visitS(s.elseBody);
+    }
+    static if (is(T == WhileStatement))
+      visitE(s.condition), visitS(s.whileBody);
+    static if (is(T == DoWhileStatement))
+      visitE(s.condition), visitS(s.doBody);
+    static if (is(T == ForStatement))
+      s.init && visitS(s.init),
+      s.condition && visitS(s.condition),
+      s.increment && visitS(s.increment),
+      visitS(s.forBody);
+    static if (is(T == ForeachStatement))
+      visitN(s.params), visitE(s.aggregate), visitS(s.forBody);
+    static if (is(T == ForeachRangeStatement))
+      visitN(s.params), visitE(s.lower), visitE(s.upper), visitS(s.forBody);
+    static if (is(T == SwitchStatement))
+      visitE(s.condition), visitS(s.switchBody);
+    static if (is(T == CaseStatement))
+    {
+      foreach (value; values)
+        visitE(value);
+      visitS(s.caseBody);
+    }
+    static if (is(T == DefaultStatement))
+      visitS(s.defaultBody);
+    //static if (is(T == ContinueStatement))
+    //static if (is(T == BreakStatement))
+    static if (is(T == ReturnStatement))
+      visitS(s.expr);
+    static if (is(T == GotoStatement))
+      s.caseExpr && visitS(s.caseExpr);
+    static if (is(T == WithStatement))
+      visitE(s.e), visitS(s.withBody);
+    static if (is(T == SynchronizedStatement))
+      s.e && visitE(s.e), visitS(s.syncBody);
+    static if (is(T == TryStatement))
+    {
+      visitS(s.tryBody);
+      foreach (body_; s.catchBodies)
+        visitS(body_);
+      s.finallyBody && visitS(s.finallyBody);
+    }
+    static if (is(T == CatchBody))
+      s.param && visitN(s.param), visitS(s.catchBody);
+    static if (is(T == FinallyBody))
+      visitS(s.finallyBody);
+    static if (is(T == ScopeGuardStatement))
+      visitS(s.scopeBody);
+    static if (is(T == ThrowStatement))
+      visitE(s.e);
+    static if (is(T == VolatileStatement))
+      s.volatileBody && visitS(s.volatileBody);
+    static if (is(T == AsmStatement))
+      visitS(s.statements);
+    static if (is(T == AsmInstruction))
+      foreach (e; s.operands)
+        visitS(e);
+    //static if (is(T == AsmAlignStatement))
+    static if (is(T == PragmaStatement))
+    {
+      foreach (e; s.args)
+        visitE(e);
+      visitS(s.pragmaBody);
+    }
+    static if (is(T == MixinStatement))
+      visitE(s.templateExpr);
+    static if (is(T == StaticIfStatement))
+      visitE(s.condition), visitS(s.ifBody), s.elseBody && visitS(s.elseBody);
+    static if (is(T == StaticAssertStatement))
+      visitE(s.condition), s.message && visitE(s.message);
+    static if (is(T == DebugStatement) || is(T == VersionStatement))
+      visitS(s.mainBody), s.elseBody && visitS(s.elseBody);
+    return s;
+  }
+
+  mixin visit!(Statements);
+  mixin visit!(IllegalStatement);
+  mixin visit!(EmptyStatement);
+  mixin visit!(FunctionBody);
+  mixin visit!(ScopeStatement);
+  mixin visit!(LabeledStatement);
+  mixin visit!(ExpressionStatement);
+  mixin visit!(DeclarationStatement);
+  mixin visit!(IfStatement);
+  mixin visit!(WhileStatement);
+  mixin visit!(DoWhileStatement);
+  mixin visit!(ForStatement);
+  mixin visit!(ForeachStatement);
+  mixin visit!(ForeachRangeStatement);
+  mixin visit!(SwitchStatement);
+  mixin visit!(CaseStatement);
+  mixin visit!(DefaultStatement);
+  mixin visit!(ContinueStatement);
+  mixin visit!(BreakStatement);
+  mixin visit!(ReturnStatement);
+  mixin visit!(GotoStatement);
+  mixin visit!(WithStatement);
+  mixin visit!(SynchronizedStatement);
+  mixin visit!(TryStatement);
+  mixin visit!(CatchBody);
+  mixin visit!(FinallyBody);
+  mixin visit!(ScopeGuardStatement);
+  mixin visit!(ThrowStatement);
+  mixin visit!(VolatileStatement);
+  mixin visit!(AsmStatement);
+  mixin visit!(AsmInstruction);
+  mixin visit!(AsmAlignStatement);
+  mixin visit!(IllegalAsmInstruction);
+  mixin visit!(PragmaStatement);
+  mixin visit!(MixinStatement);
+  mixin visit!(StaticIfStatement);
+  mixin visit!(StaticAssertStatement);
+  mixin visit!(DebugStatement);
+  mixin visit!(VersionStatement);
+
+  TypeNode visit(T : TypeNode)(T t)
+  {
+    //static if (is(T == UndefinedType))
+    //static if (is(T == IntegralType))
+    //static if (is(T == IdentifierType))
+    static if (is(T == QualifiedType))
+      visitT(t.left), visitT(t.right);
+    static if (is(T == ModuleScopeType))
+      visitT(t.next);
+    static if (is(T == TypeofType))
+      visitE(t.e);
+    static if (is(T == TemplateInstanceType))
+      t.targs && visitN(t.targs);
+    static if (is(T == PointerType))
+      visitT(t.next);
+    static if (is(T == ArrayType))
+    {
+      visitT(t.next);
+      if (t.assocType)
+        visitT(t.assocType);
+      else
+        visitE(t.e), t.e2 && visitE(t.e2);
+    }
+    static if (is(T == FunctionType) || is(T == DelegateType))
+      visitT(t.returnType), visitN(t.parameters);
+    static if (is(T == CFuncPointerType))
+      visitT(t.next), t.params && visitN(t.params);
+    static if (is(T == BaseClass))
+      visitT(t.next);
+    static if (is(T == ConstType) || is(T == InvariantType))
+      visitT(t.next);
+    return t;
+  }
+
+  mixin visit!(UndefinedType);
+  mixin visit!(IntegralType);
+  mixin visit!(IdentifierType);
+  mixin visit!(QualifiedType);
+  mixin visit!(ModuleScopeType);
+  mixin visit!(TypeofType);
+  mixin visit!(TemplateInstanceType);
+  mixin visit!(PointerType);
+  mixin visit!(ArrayType);
+  mixin visit!(FunctionType);
+  mixin visit!(DelegateType);
+  mixin visit!(CFuncPointerType);
+  mixin visit!(BaseClass);
+  mixin visit!(ConstType);
+  mixin visit!(InvariantType);
+
+  Node visit(N : Parameter)(N n)
+  {
+    visitT(n.type);
+    n.defValue && visitE(n.defValue);
+    return n;
+  }
+
+  Node visit(N : Parameters)(N n)
+  {
+    foreach (node; n.children)
+      visitN(node.to!(Parameters));
+    return n;
+  }
+
+  Node visit(N : TemplateParameters)(N n)
+  {
+    foreach (node; n.children)
+      visitN(node.to!(TemplateParameters));
+    return n;
+  }
+
+  Node visit(N : TemplateArguments)(N n)
+  {
+    foreach (node; n.children)
+      visitN(node.to!(TemplateArguments));
+    return n;
+  }
+
+  Node visit(N : TemplateParameter)(N n)
+  {
+    static if (is(N == TemplateAliasParameter) ||
+               is(N == TemplateTypeParameter) ||
+               is(N == TemplateThisParameter))
+      n.specType && visitN(n.specType),
+      n.defType && visitN(n.defType);
+    static if (is(N == TemplateValueParameter))
+      visitT(n.valueType),
+      n.specValue && visitN(n.specValue),
+      n.defValue && visitN(n.defValue);
+    //static if (is(N == TemplateTupleParameter))
+    return n;
+  }
+
+  mixin visit!(Parameter);
+  mixin visit!(Parameters);
+  mixin visit!(TemplateAliasParameter);
+  mixin visit!(TemplateTypeParameter);
+  mixin visit!(TemplateThisParameter);
+  mixin visit!(TemplateValueParameter);
+  mixin visit!(TemplateTupleParameter);
+  mixin visit!(TemplateParameters);
+  mixin visit!(TemplateArguments);
 }
--- a/trunk/src/dil/ast/Statements.d	Tue Jan 15 20:34:39 2008 +0100
+++ b/trunk/src/dil/ast/Statements.d	Tue Jan 15 23:26:49 2008 +0100
@@ -84,23 +84,23 @@
 
 class ExpressionStatement : Statement
 {
-  Expression expression;
-  this(Expression expression)
+  Expression e;
+  this(Expression e)
   {
     mixin(set_kind);
-    addChild(expression);
-    this.expression = expression;
+    addChild(e);
+    this.e = e;
   }
 }
 
 class DeclarationStatement : Statement
 {
-  Declaration declaration;
-  this(Declaration declaration)
+  Declaration decl;
+  this(Declaration decl)
   {
     mixin(set_kind);
-    addChild(declaration);
-    this.declaration = declaration;
+    addChild(decl);
+    this.decl = decl;
   }
 }
 
@@ -286,12 +286,12 @@
 
 class ReturnStatement : Statement
 {
-  Expression expr;
-  this(Expression expr)
+  Expression e;
+  this(Expression e)
   {
     mixin(set_kind);
-    addOptChild(expr);
-    this.expr = expr;
+    addOptChild(e);
+    this.e = e;
   }
 }
 
@@ -310,30 +310,30 @@
 
 class WithStatement : Statement
 {
-  Expression expr;
+  Expression e;
   Statement withBody;
-  this(Expression expr, Statement withBody)
+  this(Expression e, Statement withBody)
   {
     mixin(set_kind);
-    addChild(expr);
+    addChild(e);
     addChild(withBody);
 
-    this.expr = expr;
+    this.e = e;
     this.withBody = withBody;
   }
 }
 
 class SynchronizedStatement : Statement
 {
-  Expression expr;
+  Expression e;
   Statement syncBody;
-  this(Expression expr, Statement syncBody)
+  this(Expression e, Statement syncBody)
   {
     mixin(set_kind);
-    addOptChild(expr);
+    addOptChild(e);
     addChild(syncBody);
 
-    this.expr = expr;
+    this.e = e;
     this.syncBody = syncBody;
   }
 }
@@ -396,12 +396,12 @@
 
 class ThrowStatement : Statement
 {
-  Expression expr;
-  this(Expression expr)
+  Expression e;
+  this(Expression e)
   {
     mixin(set_kind);
-    addChild(expr);
-    this.expr = expr;
+    addChild(e);
+    this.e = e;
   }
 }