diff trunk/src/dil/semantic/Scope.d @ 592:b8dd677e0ace

Moved dil.Scope to dil.semantic.Scope.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sat, 05 Jan 2008 23:52:41 +0100
parents trunk/src/dil/Scope.d@641041912670
children 39fac5531b85
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/dil/semantic/Scope.d	Sat Jan 05 23:52:41 2008 +0100
@@ -0,0 +1,122 @@
+/++
+  Author: Aziz Köksal
+  License: GPL3
++/
+module dil.semantic.Scope;
+
+import dil.semantic.Symbol;
+import dil.semantic.Symbols;
+import dil.Information;
+import dil.Messages;
+import dil.Token;
+import common;
+
+class Scope
+{
+  Scope parent; /// The surrounding scope.
+  InfoManager infoMan; /// Collects errors reported during the semantic phase.
+
+  ScopeSymbol symbol; /// The current symbol with the symbol table.
+
+  this()
+  {
+  }
+
+  /++
+    Find an identifier in this scope.
+  +/
+  Symbol find(char[] ident)
+  {
+    return null;
+  }
+
+  /++
+    Add a symbol to this scope.
+  +/
+  void add(Symbol sym)
+  {
+
+  }
+
+  /// Insert a new variable symbol into this scope.
+  void insert(Variable var)
+  {
+    auto sym = symbol.lookup(var.ident);
+    if (sym)
+    {
+      auto loc = sym.node.begin.getLocation();
+      auto locString = Format("{}({},{})", loc.filePath, loc.lineNum, loc.colNum);
+      error(var.node.begin, MSG.VariableConflictsWithDecl, var.ident.str, locString);
+    }
+    else
+      symbol.insert(var, var.ident);
+    // Set the current scope symbol as the parent.
+    var.parent = symbol;
+  }
+
+  /++
+    Create a new inner scope.
+  +/
+  Scope push(ScopeSymbol symbol)
+  {
+    auto sc = new Scope();
+    sc.parent = this;
+    sc.infoMan = this.infoMan;
+    sc.symbol = symbol;
+    return sc;
+  }
+
+  /++
+    Destroy this scope and return the outer scope.
+  +/
+  Scope pop()
+  {
+    auto sc = parent;
+    // delete this;
+    return sc;
+  }
+
+  bool isInterface()
+  {
+    return symbol.isInterface;
+  }
+
+  /// Search for the enclosing Class scope.
+  Scope classScope()
+  {
+    auto scop = this;
+    while (scop)
+    {
+      if (scop.symbol.isClass)
+        return scop;
+      scop = scop.parent;
+    }
+    return null;
+  }
+
+  /// Search for the enclosing Module scope.
+  Scope moduleScope()
+  {
+    auto scop = this;
+    while (scop)
+    {
+      if (scop.symbol.isModule)
+        return scop;
+      scop = scop.parent;
+    }
+    return null;
+  }
+
+  void error(Token* token, MID mid)
+  {
+    auto location = token.getLocation();
+    infoMan ~= new SemanticError(location, GetMsg(mid));
+  }
+
+  void error(Token* token, char[] formatMsg, ...)
+  {
+    auto location = token.getLocation();
+    auto msg = Format(_arguments, _argptr, formatMsg);
+    infoMan ~= new SemanticError(location, msg);
+  }
+}