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