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