changeset 130:6545a8d59596

Recursive member-lookup.
author Anders Johnsen <skabet@gmail.com>
date Mon, 30 Jun 2008 15:22:05 +0200
parents ed815b31479b
children 3635fc5428b1
files sema/ScopeBuilder.d sema/ScopeCheck.d
diffstat 2 files changed, 28 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/sema/ScopeBuilder.d	Sat Jun 21 20:41:18 2008 +0200
+++ b/sema/ScopeBuilder.d	Mon Jun 30 15:22:05 2008 +0200
@@ -51,15 +51,12 @@
             visitExp(d.init);
 
         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);
     }
 
--- a/sema/ScopeCheck.d	Sat Jun 21 20:41:18 2008 +0200
+++ b/sema/ScopeCheck.d	Mon Jun 30 15:22:05 2008 +0200
@@ -1,6 +1,7 @@
 module sema.ScopeCheck;
 
 import sema.Visitor,
+       sema.Symbol,
        sema.DType;
 
 import basic.Message;
@@ -22,7 +23,6 @@
         if(symbol is null)
             messages.report(UndefinedIdentifier, i.loc)
                 .arg(i.get);
-                //.loc(i.token.location);
     }
 
     override void visitVarDecl(VarDecl d)
@@ -30,7 +30,6 @@
         if(!d.env.findType(d.varType))
             messages.report(UndefinedType, d.varType.loc)
                 .arg(d.varType.get);
-                //.loc(d.varType.token.location);
 
         visitExp(d.identifier);
         if (d.init)
@@ -54,21 +53,42 @@
 
     override void visitMemberReference(MemberReference m)
     {
+        internalVisitMemberRef(m);
+    }
+
+    private Symbol internalVisitMemberRef(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)
+                auto st = target.getSymbol;
+                auto res = st.findMember(child.get);
+                Stdout(st.type.asStruct.members).newline;
+
+                if(!res)
                     messages.report(MissingMember, m.loc)
-                        .arg(st.name)
+                        .arg(st.type.name)
                         .arg(target.get)
                         .arg(child.get);
-                        //.tok(child.token);
-                break;
+
+                return res;
             case ExpType.MemberReference:
-                break;
+                Symbol s = internalVisitMemberRef(cast(MemberReference)m.target);
+                if(!s)
+                    return null;
+                auto target = cast(Identifier)m.target;
+                auto child = m.child;
+                auto res = s.findMember(child.get);
+
+                if(!res)
+                    messages.report(MissingMember, m.loc)
+                        .arg(s.type.name)
+                        .arg(s.getFQN)
+                        .arg(child.get);
+
+                return res;
         }
     }