diff sema/ScopeCheck.d @ 92:771ac63898e2 new_gen

A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
author Anders Johnsen <skabet@gmail.com>
date Mon, 05 May 2008 18:44:20 +0200
parents sema/Declarations.d@eb5b2c719a39
children 857f0d530789
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sema/ScopeCheck.d	Mon May 05 18:44:20 2008 +0200
@@ -0,0 +1,79 @@
+module sema.ScopeCheck;
+
+import sema.Visitor,
+       sema.DType;
+
+import tango.io.Stdout;
+
+import misc.Error;
+
+class ScopeCheck : Visitor!(void)
+{
+    int[char[]] types;
+
+    private Error error(uint line, char[] msg)
+    {
+        return new Error(msg);
+    }
+
+    override void visitIdentifier(Identifier i)
+    {
+        auto symbol = i.env.find(i);
+
+        if(symbol is null)
+            throw error(__LINE__, "Undefined identifier: '%0'")
+                .arg(i.get);
+                //.loc(i.token.location);
+    }
+
+    override void visitVarDecl(VarDecl d)
+    {
+        if(!d.env.findType(d.varType))
+            throw error(__LINE__, "Undefined type: '%0'")
+                .arg(d.varType.get);
+                //.loc(d.varType.token.location);
+
+        visitExp(d.identifier);
+        if (d.init)
+            visitExp(d.init);
+    }
+
+    override void visitFuncDecl(FuncDecl f)
+    {
+        visitExp(f.identifier);
+
+        foreach (stmt; f.statements)
+            visitStmt(stmt);
+    }
+
+    override void visitCastExp(CastExp exp)
+    {
+        visitExp(exp.exp);
+    }
+
+    override void visitMemberReference(MemberReference m)
+    {
+        switch(m.target.expType)
+        {
+            case ExpType.Identifier:
+                auto target = cast(Identifier)m.target;
+                auto child = m.child;
+                auto st = cast(DStruct)(target.env.find(target).type);
+                if((child.get in st.members) is null)
+                    throw error(__LINE__, "%0 %1 has no member %2")
+                        .arg(st.name)
+                        .arg(target.get)
+                        .arg(child.get);
+                        //.tok(child.token);
+                break;
+            case ExpType.MemberReference:
+                break;
+        }
+    }
+
+    private bool isType(char[] s)
+    {
+        return (s in types? true : false);
+    }
+}
+