Mercurial > projects > dang
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); + } +} +