Mercurial > projects > dang
annotate sema/BuildTypes.d @ 195:4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Tue, 29 Jul 2008 15:50:24 +0200 |
parents | |
children |
rev | line source |
---|---|
195
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
1 module sema.BuildTypes; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
2 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
3 import basic.LiteralParsing, |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
4 basic.Message; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
5 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
6 import sema.Visitor, |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
7 sema.Symbol, |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
8 sema.DType; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
9 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
10 import tango.io.Stdout; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
11 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
12 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
13 class BuildTypes : Visitor!(void) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
14 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
15 this(MessageHandler messages) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
16 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
17 this.messages = messages; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
18 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
19 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
20 override void visitCallExp(CallExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
21 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
22 super.visitCallExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
23 DFunction f = exp.exp.type.asCallable(); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
24 assert(f !is null, "Can only call functions"); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
25 exp.type = f.returnType; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
26 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
27 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
28 override void visitAssignExp(AssignExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
29 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
30 super.visitAssignExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
31 exp.type = exp.identifier.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
32 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
33 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
34 override void visitBinaryExp(BinaryExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
35 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
36 super.visitBinaryExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
37 if (exp.op == BinaryExp.Operator.Eq || |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
38 exp.op == BinaryExp.Operator.Ne || |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
39 exp.op == BinaryExp.Operator.Lt || |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
40 exp.op == BinaryExp.Operator.Le || |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
41 exp.op == BinaryExp.Operator.Gt || |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
42 exp.op == BinaryExp.Operator.Ge) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
43 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
44 exp.type = DType.Bool; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
45 return; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
46 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
47 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
48 DType l = exp.left.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
49 DType r = exp.right.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
50 if (l.isSame(r)) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
51 exp.type = l; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
52 else if (l.hasImplicitConversionTo(r)) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
53 exp.type = r; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
54 else if (r.hasImplicitConversionTo(l)) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
55 exp.type = l; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
56 else |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
57 exp.type = DType.Int; //FIXME: Throw error here. |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
58 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
59 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
60 override void visitNegateExp(NegateExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
61 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
62 super.visitNegateExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
63 exp.type = exp.exp.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
64 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
65 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
66 override void visitDerefExp(DerefExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
67 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
68 super.visitDerefExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
69 exp.type = exp.exp.type.asPointer().pointerOf; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
70 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
71 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
72 override void visitAddressOfExp(AddressOfExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
73 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
74 super.visitAddressOfExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
75 exp.type = exp.exp.type.getPointerTo; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
76 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
77 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
78 override void visitIntegerLit(IntegerLit exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
79 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
80 super.visitIntegerLit(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
81 switch(exp.number.type) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
82 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
83 case NumberType.Int: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
84 exp.type = DType.Int; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
85 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
86 case NumberType.Long: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
87 exp.type = DType.Long; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
88 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
89 case NumberType.ULong: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
90 exp.type = DType.ULong; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
91 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
92 case NumberType.Double: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
93 exp.type = DType.Double; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
94 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
95 case NumberType.Real: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
96 exp.type = DType.Real; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
97 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
98 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
99 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
100 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
101 override void visitMemberReference(MemberReference exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
102 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
103 super.visitMemberReference(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
104 if ( exp.target.type.isStruct ) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
105 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
106 Symbol st = exp.target.getSymbol; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
107 if (auto t = st.findMembers(exp.child.name)) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
108 exp.type = t[0].type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
109 // else assert(0, "Referencing non-existant member"); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
110 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
111 else if ( exp.target.type.isClass ) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
112 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
113 Symbol cl = exp.target.getSymbol; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
114 if (auto t = cl.findMembers(exp.child.name)) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
115 exp.type = t[0].type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
116 // else assert(0, "Referencing non-existant member"); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
117 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
118 else |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
119 assert(0, "Only structs and classes have members"); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
120 // no error reporting here |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
121 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
122 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
123 override void visitIndexExp(IndexExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
124 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
125 super.visitIndexExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
126 DType type = exp.target.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
127 if (type.isStaticArray()) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
128 exp.type = type.asStaticArray().arrayOf; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
129 else if (type.isPointer()) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
130 exp.type = type.asPointer().pointerOf; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
131 else assert(0, "Can only index pointers and arrays"); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
132 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
133 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
134 override void visitCastExp(CastExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
135 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
136 super.visitCastExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
137 exp.type = exp.env.findType(exp.castType.get); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
138 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
139 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
140 override void visitStringExp(StringExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
141 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
142 super.visitStringExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
143 switch (exp.data.type) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
144 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
145 case StringType.Char: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
146 exp.type = DType.Char.getAsStaticArray(exp.data.data.length); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
147 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
148 case StringType.WChar: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
149 exp.type = DType.WChar.getAsStaticArray(exp.data.data.length/2); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
150 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
151 case StringType.DChar: |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
152 exp.type = DType.DChar.getAsStaticArray(exp.data.data.length/4); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
153 break; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
154 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
155 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
156 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
157 override void visitNewExp(NewExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
158 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
159 super.visitNewExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
160 exp.type = exp.env.findType(exp.newType.get); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
161 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
162 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
163 override void visitNullExp(NullExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
164 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
165 super.visitNullExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
166 exp.type = new DPointer(DType.Int); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
167 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
168 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
169 override void visitIdentifier(Identifier exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
170 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
171 super.visitIdentifier(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
172 if (auto sym = exp.getSymbol) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
173 exp.type = sym.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
174 else |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
175 exp.type = DType.Int; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
176 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
177 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
178 /* override void visitIdentifierTypeExp(IdentifierTypeExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
179 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
180 if (auto sym = exp.getSymbol) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
181 exp.type = sym.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
182 else |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
183 exp.type = DType.Int; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
184 }*/ |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
185 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
186 override void visitPointerTypeExp(PointerTypeExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
187 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
188 super.visitPointerTypeExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
189 exp.type = exp.pointerOf.type.getPointerTo(); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
190 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
191 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
192 override void visitStaticArrayTypeExp(StaticArrayTypeExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
193 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
194 super.visitStaticArrayTypeExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
195 exp.type = exp.arrayOf.type.getAsStaticArray(exp.size); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
196 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
197 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
198 /* override void visitArrayTypeExp(ArrayTypeExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
199 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
200 exp.type = arrayOf.type.getAsArray(); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
201 }*/ |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
202 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
203 override void visitFunctionTypeExp(FunctionTypeExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
204 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
205 super.visitFunctionTypeExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
206 auto t = new DFunction(exp.returnType); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
207 t.returnType = exp.returnType.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
208 foreach (decl ; exp.decls) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
209 t.params ~= decl.varType.type; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
210 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
211 exp.type = t.getPointerTo; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
212 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
213 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
214 override void visitArrayLiteralExp(ArrayLiteralExp exp) |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
215 { |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
216 super.visitArrayLiteralExp(exp); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
217 exp.type = exp.exps[0].type.getAsStaticArray(exp.exps.length); |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
218 } |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
219 |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
220 MessageHandler messages; |
4e1a7265d620
Made a BuildTypes pass, to give all exp's a type.
Anders Johnsen <skabet@gmail.com>
parents:
diff
changeset
|
221 } |