changeset 636:15a0f37caabe

Added more visit() methods to dil.semantic.SemanticPass1.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Mon, 14 Jan 2008 00:21:13 +0100
parents b2fc028d8b55
children fe66cecb6ec9
files trunk/src/dil/ast/Node.d trunk/src/dil/semantic/Pass1.d
diffstat 2 files changed, 135 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/ast/Node.d	Sun Jan 13 21:53:01 2008 +0100
+++ b/trunk/src/dil/ast/Node.d	Mon Jan 14 00:21:13 2008 +0100
@@ -85,6 +85,11 @@
     return null;
   }
 
+  Class to(Class)()
+  {
+    return cast(Class)cast(void*)this;
+  }
+
   static bool isDoxygenComment(Token* token)
   { // Doxygen: '/+!' '/*!' '//!'
     return token.type == TOK.Comment && token.start[2] == '!';
--- a/trunk/src/dil/semantic/Pass1.d	Sun Jan 13 21:53:01 2008 +0100
+++ b/trunk/src/dil/semantic/Pass1.d	Mon Jan 14 00:21:13 2008 +0100
@@ -21,29 +21,146 @@
 {
   Scope scop;
 
-  /+Scope enterScope(Symbol s)
+  void enterScope(ScopeSymbol s)
   {
-    return null;
-  }+/
+    scop = scop.enter(s);
+  }
+
+  void exitScope()
+  {
+    scop = scop.exit();
+  }
 
 override
 {
-  Declaration visit(ClassDeclaration c)
+  Declaration visit(Declarations d)
+  {
+    foreach (node; d.children)
+    {
+      assert(node.category == NodeCategory.Declaration);
+      visitD(node.to!(Declaration));
+    }
+    return d;
+  }
+
+  Declaration visit(IllegalDeclaration)
+  { assert(0, "semantic pass on invalid AST"); return null; }
+  Declaration visit(EmptyDeclaration)
+  { return null; }
+  Declaration visit(ModuleDeclaration)
+  { return null; }
+  Declaration visit(ImportDeclaration)
+  { return null; }
+  Declaration visit(AliasDeclaration)
+  { return null; }
+  Declaration visit(TypedefDeclaration)
+  { return null; }
+  Declaration visit(EnumDeclaration)
+  { return null; }
+  Declaration visit(EnumMember)
+  { return null; }
+
+  Declaration visit(ClassDeclaration d)
   {
-    if (c.symbol)
+    if (d.symbol)
+      return null;
+    d.symbol = new Class(d.name, d);
+    // Insert into current scope.
+    scop.insert(d.symbol, d.name);
+    enterScope(d.symbol);
+    // Continue semantic analysis.
+    d.decls && visitD(d.decls);
+    exitScope();
+    return d;
+  }
+
+  Declaration visit(InterfaceDeclaration d)
+  {
+    if (d.symbol)
       return null;
-    c.symbol = new Class(c.name, c);
+    d.symbol = new dil.semantic.Symbols.Interface(d.name, d);
+    // Insert into current scope.
+    scop.insert(d.symbol, d.name);
+    enterScope(d.symbol);
+    // Continue semantic analysis.
+    d.decls && visitD(d.decls);
+    exitScope();
+    return d;
+  }
+
+  Declaration visit(StructDeclaration d)
+  {
+    if (d.symbol)
+      return null;
+    d.symbol = new Struct(d.name, d);
     // Insert into current scope.
-    scop.insert(c.symbol, c.name);
-    // Enter a new scope.
-    this.scop = this.scop.enter(c.symbol);
+    scop.insert(d.symbol, d.name);
+    enterScope(d.symbol);
+    // Continue semantic analysis.
+    d.decls && visitD(d.decls);
+    exitScope();
+    return d;
+  }
+
+  Declaration visit(UnionDeclaration d)
+  {
+    if (d.symbol)
+      return null;
+    d.symbol = new Union(d.name, d);
+    // Insert into current scope.
+    scop.insert(d.symbol, d.name);
+    enterScope(d.symbol);
     // Continue semantic analysis.
-    c.decls && visitD(c.decls);
-    // Exit scope.
-    this.scop = scop.exit();
-    return c;
+    d.decls && visitD(d.decls);
+    exitScope();
+    return d;
   }
 
+  Declaration visit(ConstructorDeclaration)
+  { return null; }
+  Declaration visit(StaticConstructorDeclaration)
+  { return null; }
+  Declaration visit(DestructorDeclaration)
+  { return null; }
+  Declaration visit(StaticDestructorDeclaration)
+  { return null; }
+  Declaration visit(FunctionDeclaration)
+  { return null; }
+  Declaration visit(VariableDeclaration)
+  { return null; }
+  Declaration visit(InvariantDeclaration)
+  { return null; }
+  Declaration visit(UnittestDeclaration)
+  { return null; }
+  Declaration visit(DebugDeclaration)
+  { return null; }
+  Declaration visit(VersionDeclaration)
+  { return null; }
+  Declaration visit(StaticIfDeclaration)
+  { return null; }
+  Declaration visit(StaticAssertDeclaration)
+  { return null; }
+  Declaration visit(TemplateDeclaration)
+  { return null; }
+  Declaration visit(NewDeclaration)
+  { return null; }
+  Declaration visit(DeleteDeclaration)
+  { return null; }
+  Declaration visit(AttributeDeclaration)
+  { return null; }
+  Declaration visit(ProtectionDeclaration)
+  { return null; }
+  Declaration visit(StorageClassDeclaration)
+  { return null; }
+  Declaration visit(LinkageDeclaration)
+  { return null; }
+  Declaration visit(AlignDeclaration)
+  { return null; }
+  Declaration visit(PragmaDeclaration)
+  { return null; }
+  Declaration visit(MixinDeclaration)
+  { return null; }
+
   Expression visit(CommaExpression e)
   {
     if (!e.type)