Mercurial > projects > dang
comparison 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 |
comparison
equal
deleted
inserted
replaced
91:1a24e61eb104 | 92:771ac63898e2 |
---|---|
1 module sema.ScopeCheck; | |
2 | |
3 import sema.Visitor, | |
4 sema.DType; | |
5 | |
6 import tango.io.Stdout; | |
7 | |
8 import misc.Error; | |
9 | |
10 class ScopeCheck : Visitor!(void) | |
11 { | |
12 int[char[]] types; | |
13 | |
14 private Error error(uint line, char[] msg) | |
15 { | |
16 return new Error(msg); | |
17 } | |
18 | |
19 override void visitIdentifier(Identifier i) | |
20 { | |
21 auto symbol = i.env.find(i); | |
22 | |
23 if(symbol is null) | |
24 throw error(__LINE__, "Undefined identifier: '%0'") | |
25 .arg(i.get); | |
26 //.loc(i.token.location); | |
27 } | |
28 | |
29 override void visitVarDecl(VarDecl d) | |
30 { | |
31 if(!d.env.findType(d.varType)) | |
32 throw error(__LINE__, "Undefined type: '%0'") | |
33 .arg(d.varType.get); | |
34 //.loc(d.varType.token.location); | |
35 | |
36 visitExp(d.identifier); | |
37 if (d.init) | |
38 visitExp(d.init); | |
39 } | |
40 | |
41 override void visitFuncDecl(FuncDecl f) | |
42 { | |
43 visitExp(f.identifier); | |
44 | |
45 foreach (stmt; f.statements) | |
46 visitStmt(stmt); | |
47 } | |
48 | |
49 override void visitCastExp(CastExp exp) | |
50 { | |
51 visitExp(exp.exp); | |
52 } | |
53 | |
54 override void visitMemberReference(MemberReference m) | |
55 { | |
56 switch(m.target.expType) | |
57 { | |
58 case ExpType.Identifier: | |
59 auto target = cast(Identifier)m.target; | |
60 auto child = m.child; | |
61 auto st = cast(DStruct)(target.env.find(target).type); | |
62 if((child.get in st.members) is null) | |
63 throw error(__LINE__, "%0 %1 has no member %2") | |
64 .arg(st.name) | |
65 .arg(target.get) | |
66 .arg(child.get); | |
67 //.tok(child.token); | |
68 break; | |
69 case ExpType.MemberReference: | |
70 break; | |
71 } | |
72 } | |
73 | |
74 private bool isType(char[] s) | |
75 { | |
76 return (s in types? true : false); | |
77 } | |
78 } | |
79 |