diff sema/ScopeBuilder.d @ 129:ed815b31479b

Added a Symbol
author Anders Halager <halager@gmail.com>
date Sat, 21 Jun 2008 20:41:18 +0200
parents c0b531362ca6
children 6545a8d59596
line wrap: on
line diff
--- a/sema/ScopeBuilder.d	Sat Jun 21 17:32:27 2008 +0200
+++ b/sema/ScopeBuilder.d	Sat Jun 21 20:41:18 2008 +0200
@@ -4,7 +4,8 @@
        tango.core.Array : find;
 
 public
-import sema.Scope;
+import sema.Scope,
+       sema.Symbol;
 
 import sema.Visitor,
        basic.SmallArray;
@@ -14,19 +15,31 @@
     override void visit(Module[] modules)
     {
         this.modules = modules;
-        super.visit(modules);
+        inFunctionBodyStack.push(false);
+        foreach (mod; modules)
+        {
+            current = mod;
+            foreach (decl; mod.decls)
+                visitDecl(decl);
+        }
     }
 
     override void visitFuncDecl(FuncDecl d)
     {
+
         visitExp(d.returnType);
         visitExp(d.identifier);
         foreach (arg; d.funcArgs)
             visitDecl(arg);
+
+        inFunctionBodyStack.push(true);
+
         foreach (stmt; d.statements)
             visitStmt(stmt);
 
-        d.env.find(d.identifier).setType(d.type);
+        inFunctionBodyStack.pop();
+
+        d.sym = current.symbol.createMember(d.identifier.get, d.type);
     }
 
     override void visitVarDecl(VarDecl d)
@@ -37,35 +50,68 @@
         if (d.init)
             visitExp(d.init);
 
-        d.env.find(d.identifier).setType( typeOf(d.varType, d.env) );
+        DType t = typeOf(d.varType, d.env);
+        /*
+        if (inFunctionBodyStack.peek())
+        {
+            Stdout.formatln("?? {}, {}, {}", d.varType.get, d.identifier.get, t);
+            auto find = d.env.find(d.varType);
+            d.sym = d.env.find(d.varType).sym;
+        }
+        else
+        */
+            d.sym = current.symbol.createMember(d.identifier.get, t);
     }
 
     override void visitStructDecl(StructDecl s)
     {
-        super.visitStructDecl(s);
+        auto st = s.env.findType(s.identifier).asStruct;
+        s.sym = current.symbol.createMember(s.identifier.get, st);
+        //s.env.set(s.identifier, s);
 
-        DType[char[]] types;
+        auto old = current.symbol;
+        current.symbol = s.sym;
+        inFunctionBodyStack.push(false);
+        super.visitStructDecl(s);
+        inFunctionBodyStack.pop();
+        current.symbol = old;
 
-        auto st = s.env.types[s.identifier.get].asStruct;
         foreach (decl; s.decls)
+        {
+            DType type;
+            char[] name;
             if (auto varDecl = cast(VarDecl)decl)
-                st.addMember(typeOf(varDecl.varType, varDecl.env), varDecl.identifier.get);
+            {
+                type = typeOf(varDecl.varType, varDecl.env);
+                name = varDecl.identifier.get;
+            }
             else if (auto fd = cast(FuncDecl)decl)
-                st.addMember(fd.type, fd.identifier.get);
+            {
+                type = fd.type;
+                name = fd.identifier.get;
+            }
+            st.addMember(type, name);
+        }
     }
 
     DType typeOf(Identifier id, Scope sc)
     {
         if(auto i = cast(PointerIdentifier)id)
             return (typeOf(i.pointerOf, sc)).getPointerTo();
-        if(auto i = cast(ArrayIdentifier)id)
+        else if(auto i = cast(ArrayIdentifier)id)
             return typeOf(i.arrayOf, sc).getAsArray(i.size);
         return sc.findType(id);
     }
 
     Module[] modules;
+    Module current;
+    SmallArray!(bool) inFunctionBodyStack;
 }
 
+/**
+  Add scopes to everything, and add all identifiers that correspond to types.
+  Types/Symbols are added by ForwardReference.
+ **/
 class ScopeBuilder : Visitor!(void)
 {
     static ModuleHandler mHandle;
@@ -89,26 +135,43 @@
         fr.visit(modules);
     }
 
+    private void registerBasicTypeTo(char[] n, DType t, Scope sc, Module m)
+    {
+        sc.types[n] = t;
+        auto sym = m.symbol.createMember(n, t);
+        auto id = new Identifier(n);
+        id.env = sc;
+        auto decl = new DummyDecl();
+        decl.sym = sym;
+        decl.env = sc;
+        sc.put(id, decl);
+    }
+
     override void visitModule(Module m)
     {
-        table ~= new Scope;
-        table[table.length-1].types["void"]    = DType.Void;
-        table[table.length-1].types["bool"]    = DType.Bool;
-        table[table.length-1].types["byte"]    = DType.Byte;
-        table[table.length-1].types["ubyte"]   = DType.UByte;
-        table[table.length-1].types["short"]   = DType.Short;
-        table[table.length-1].types["ushort"]  = DType.UShort;
-        table[table.length-1].types["int"]     = DType.Int;
-        table[table.length-1].types["uint"]    = DType.UInt;
-        table[table.length-1].types["long"]    = DType.Long;
-        table[table.length-1].types["ulong"]   = DType.ULong;
-        table[table.length-1].types["char"]    = DType.Char;
-        table[table.length-1].types["wchar"]   = DType.WChar;
-        table[table.length-1].types["dchar"]   = DType.DChar;
+        auto root = new Scope;
+        table ~= root;
+
+        m.symbol = new Symbol;
 
-        table[table.length-1].types["float"]   = DType.Float;
-        table[table.length-1].types["double"]  = DType.Double;
-        table[table.length-1].types["real"]    = DType.Real;
+        registerBasicTypeTo("void",     DType.Void, root, m);
+        registerBasicTypeTo("bool",     DType.Bool, root, m);
+        registerBasicTypeTo("byte",     DType.Byte, root, m);
+        registerBasicTypeTo("ubyte",    DType.UByte, root, m);
+        registerBasicTypeTo("short",    DType.Short, root, m);
+        registerBasicTypeTo("ushort",   DType.UShort, root, m);
+        registerBasicTypeTo("int",      DType.Int, root, m);
+        registerBasicTypeTo("uint",     DType.UInt, root, m);
+        registerBasicTypeTo("long",     DType.Long, root, m);
+        registerBasicTypeTo("ulong",    DType.ULong, root, m);
+
+        registerBasicTypeTo("char",     DType.Char, root, m);
+        registerBasicTypeTo("wchar",    DType.WChar, root, m);
+        registerBasicTypeTo("dchar",    DType.DChar, root, m);
+
+        registerBasicTypeTo("float",    DType.Float, root, m);
+        registerBasicTypeTo("double",   DType.Double, root, m);
+        registerBasicTypeTo("real",     DType.Real, root, m);
 
         current().inModule = m;
         current().mHandle = mHandle;
@@ -145,7 +208,7 @@
 
     override void visitFuncDecl(FuncDecl d)
     {
-        current().add(d.identifier);
+        current().put(d.identifier, d);
         auto sc = push();
 
         visitExp(d.returnType);
@@ -173,7 +236,7 @@
         }
 
         auto sc = current();
-        sc.add(d.identifier);
+        sc.put(d.identifier, d);
         d.env = sc;
         visitExp(d.varType);
         visitExp(d.identifier);
@@ -182,10 +245,10 @@
     override void visitStructDecl(StructDecl s)
     {
         auto sc = current();
-        sc.add(s.identifier);
+        sc.put(s.identifier, s);
         s.env = sc;
         auto type = new DStruct(s.identifier);
-        
+
         sc.types[s.identifier.get] = type;
 
         sc = push();