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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }