# HG changeset patch # User Anders Johnsen # Date 1214832125 -7200 # Node ID 6545a8d59596c0b02f61cd0cbc4af29ea5411fac # Parent ed815b31479bb4c60d169e152979fea7f83be19c Recursive member-lookup. diff -r ed815b31479b -r 6545a8d59596 sema/ScopeBuilder.d --- 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); } diff -r ed815b31479b -r 6545a8d59596 sema/ScopeCheck.d --- 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; } }