changeset 611:6d449e777f5d

Added semantic code to insert symbols into the scope.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sun, 06 Jan 2008 22:58:49 +0100
parents f58fd84c0d18
children c65b11c2074c
files trunk/src/dil/Messages.d trunk/src/dil/ast/Declarations.d trunk/src/dil/semantic/Scope.d
diffstat 3 files changed, 40 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/Messages.d	Sun Jan 06 21:07:37 2008 +0100
+++ b/trunk/src/dil/Messages.d	Sun Jan 06 22:58:49 2008 +0100
@@ -143,6 +143,7 @@
   auto ExpectedNameForThisTempParam = "expected name for 'this' template parameter, not '{}'";
   auto ExpectedIdentOrInt = "expected an identifier or an integer, not '{}'";
   // Semantic analysis:
+  auto DeclConflictsWithDecl = "declaration '{}' conflicts with declaration @{}";
   auto VariableConflictsWithDecl = "variable '{}' conflicts with declaration @{}";
   auto InterfaceCantHaveVariables = "an interface can't have member variables";
 }
--- a/trunk/src/dil/ast/Declarations.d	Sun Jan 06 21:07:37 2008 +0100
+++ b/trunk/src/dil/ast/Declarations.d	Sun Jan 06 22:58:49 2008 +0100
@@ -106,7 +106,7 @@
 /++
   Illegal declarations encompass all tokens that don't
   start a DeclarationDefinition.
-  See_Also: dil.Token.isDeclDefStartToken()
+  See_Also: dil.lexer.Token.isDeclDefStartToken()
 +/
 class IllegalDeclaration : Declaration
 {
@@ -279,15 +279,17 @@
     this.bases = bases;
   }
 
-  Class class_; /// The class symbol for this declaration.
+  Class symbol; /// The class symbol for this declaration.
 
   override void semantic(Scope scop)
   {
-    if (class_)
+    if (symbol)
       return;
-    class_ = new Class(name, this);
+    symbol = new Class(name, this);
+    // Insert into current scope.
+    scop.insert(symbol, name);
     // Create a new scope.
-    scop = scop.push(class_);
+    scop = scop.push(symbol);
     // Continue semantic analysis.
     decls && decls.semantic(scop);
     scop.pop();
@@ -310,15 +312,17 @@
 
   alias dil.semantic.Symbols.Interface Interface;
 
-  Interface interface_; /// The interface symbol for this declaration.
+  Interface symbol; /// The interface symbol for this declaration.
 
   override void semantic(Scope scop)
   {
-    if (interface_)
+    if (symbol)
       return;
-    interface_ = new Interface(name, this);
+    symbol = new Interface(name, this);
+    // Insert into current scope.
+    scop.insert(symbol, name);
     // Create a new scope.
-    scop = scop.push(interface_);
+    scop = scop.push(symbol);
     // Continue semantic analysis.
     decls && decls.semantic(scop);
     scop.pop();
@@ -341,15 +345,17 @@
     this.alignSize = alignSize;
   }
 
-  Struct struct_; /// The struct symbol for this declaration.
+  Struct symbol; /// The struct symbol for this declaration.
 
   override void semantic(Scope scop)
   {
-    if (struct_)
+    if (symbol)
       return;
-    struct_ = new Struct(name, this);
+    symbol = new Struct(name, this);
+    // Insert into current scope.
+    scop.insert(symbol, name);
     // Create a new scope.
-    scop = scop.push(struct_);
+    scop = scop.push(symbol);
     // Continue semantic analysis.
     decls && decls.semantic(scop);
     scop.pop();
@@ -366,15 +372,17 @@
     addOptChild(decls);
   }
 
-  Union union_; /// The union symbol for this declaration.
+  Union symbol; /// The union symbol for this declaration.
 
   override void semantic(Scope scop)
   {
-    if (union_)
+    if (symbol)
       return;
-    union_ = new Union(name, this);
+    symbol = new Union(name, this);
+    // Insert into current scope.
+    scop.insert(symbol, name);
     // Create a new scope.
-    scop = scop.push(union_);
+    scop = scop.push(symbol);
     // Continue semantic analysis.
     decls && decls.semantic(scop);
     scop.pop();
--- a/trunk/src/dil/semantic/Scope.d	Sun Jan 06 21:07:37 2008 +0100
+++ b/trunk/src/dil/semantic/Scope.d	Sun Jan 06 22:58:49 2008 +0100
@@ -7,6 +7,7 @@
 import dil.semantic.Symbol;
 import dil.semantic.Symbols;
 import dil.lexer.Token;
+import dil.lexer.Identifier;
 import dil.Information;
 import dil.Messages;
 import common;
@@ -30,12 +31,20 @@
     return null;
   }
 
-  /++
-    Add a symbol to this scope.
-  +/
-  void add(Symbol sym)
+  /// Insert a symbol into this scope.
+  void insert(Symbol sym, Identifier* ident)
   {
-
+    auto sym2 = symbol.lookup(ident);
+    if (sym2)
+    {
+      auto loc = sym2.node.begin.getLocation();
+      auto locString = Format("{}({},{})", loc.filePath, loc.lineNum, loc.colNum);
+      error(sym.node.begin, MSG.DeclConflictsWithDecl, ident.str, locString);
+    }
+    else
+      symbol.insert(sym, ident);
+    // Set the current scope symbol as the parent.
+    sym.parent = symbol;
   }
 
   /// Insert a new variable symbol into this scope.