Mercurial > projects > dil
annotate trunk/src/Types.d @ 153:66790fc2c0a2
- Added method parseIdentifierListType().
- Added code for parsing DotTemplateInstanceExpression.
- Added code for parsing TemplateInstanceExpression.
- Calling parseIdentifierListType() in parseBasicType().
- Added IdentifierListType and TemplateInstanceType.
author | aziz |
---|---|
date | Thu, 12 Jul 2007 22:30:01 +0000 |
parents | 753bc07bf3a0 |
children | 0e7cefb15e43 |
rev | line source |
---|---|
94 | 1 /++ |
2 Author: Aziz Köksal | |
3 License: GPL2 | |
4 +/ | |
5 module Types; | |
6 import Token; | |
7 import Expressions; | |
8 | |
95 | 9 enum StorageClass |
10 { | |
11 None = 0, | |
12 Abstract = 1, | |
13 Auto = 1<<2, | |
14 Const = 1<<3, | |
15 Deprecated = 1<<4, | |
16 Extern = 1<<5, | |
17 Final = 1<<6, | |
18 Invariant = 1<<7, | |
19 Override = 1<<8, | |
20 Scope = 1<<9, | |
21 Static = 1<<10, | |
22 Synchronized = 1<<11, | |
23 In = 1<<12, | |
24 Out = 1<<13, | |
25 Ref = 1<<14, | |
26 Lazy = 1<<15, | |
27 Variadic = 1<<16, | |
28 } | |
29 | |
117
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
30 class Parameter |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
31 { |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
32 StorageClass stc; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
33 Type type; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
34 string ident; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
35 Expression assignExpr; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
36 |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
37 this(StorageClass stc, Type type, string ident, Expression assignExpr) |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
38 { |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
39 this.stc = stc; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
40 this.type = type; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
41 this.ident = ident; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
42 this.assignExpr = assignExpr; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
43 } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
44 |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
45 bool isVariadic() |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
46 { |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
47 return !!(stc & StorageClass.Variadic); |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
48 } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
49 |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
50 bool isOnlyVariadic() |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
51 { |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
52 return stc == StorageClass.Variadic; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
53 } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
54 } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
55 |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
56 struct Parameters |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
57 { |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
58 Parameter[] items; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
59 |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
60 bool hasVariadic() |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
61 { |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
62 if (items.length != 0) |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
63 return items[$-1].isVariadic(); |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
64 return false; |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
65 } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
66 |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
67 void opCatAssign(Parameter param) |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
68 { items ~= param; } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
69 |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
70 size_t length() |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
71 { return items.length; } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
72 } |
79857de26e86
- Moved class Parameter to module Types. Added struct Parameters.
aziz
parents:
106
diff
changeset
|
73 |
137 | 74 enum TP |
75 { | |
76 Type, | |
77 Value, | |
78 Alias, | |
79 Tuple | |
80 } | |
81 | |
82 class TemplateParameter | |
83 { | |
84 TP tp; | |
85 Type valueType; | |
150
753bc07bf3a0
- Forgot to pass ident to constructor of TemplateArgument.
aziz
parents:
137
diff
changeset
|
86 string ident; |
137 | 87 Type specType, defType; |
88 Expression specValue, defValue; | |
150
753bc07bf3a0
- Forgot to pass ident to constructor of TemplateArgument.
aziz
parents:
137
diff
changeset
|
89 this(TP tp, Type valueType, string ident, Type specType, Type defType, Expression specValue, Expression defValue) |
137 | 90 { |
91 this.tp = tp; | |
92 this.valueType = valueType; | |
150
753bc07bf3a0
- Forgot to pass ident to constructor of TemplateArgument.
aziz
parents:
137
diff
changeset
|
93 this.ident = ident; |
137 | 94 this.specType = specType; |
95 this.defType = defType; | |
96 this.specValue = specValue; | |
97 this.defValue = defValue; | |
98 } | |
99 } | |
100 | |
150
753bc07bf3a0
- Forgot to pass ident to constructor of TemplateArgument.
aziz
parents:
137
diff
changeset
|
101 typedef Object[] TemplateArguments; |
753bc07bf3a0
- Forgot to pass ident to constructor of TemplateArgument.
aziz
parents:
137
diff
changeset
|
102 |
135 | 103 enum TID |
104 { | |
105 Void = TOK.Void, | |
106 Char = TOK.Char, | |
107 Wchar = TOK.Wchar, | |
108 Dchar = TOK.Dchar, | |
109 Bool = TOK.Bool, | |
110 Byte = TOK.Byte, | |
111 Ubyte = TOK.Ubyte, | |
112 Short = TOK.Short, | |
113 Ushort = TOK.Ushort, | |
114 Int = TOK.Int, | |
115 Uint = TOK.Uint, | |
116 Long = TOK.Long, | |
117 Ulong = TOK.Ulong, | |
118 Float = TOK.Float, | |
119 Double = TOK.Double, | |
120 Real = TOK.Real, | |
121 Ifloat = TOK.Ifloat, | |
122 Idouble = TOK.Idouble, | |
123 Ireal = TOK.Ireal, | |
124 Cfloat = TOK.Cfloat, | |
125 Cdouble = TOK.Cdouble, | |
126 Creal = TOK.Creal, | |
127 | |
128 Undefined, | |
129 Function, | |
130 Delegate, | |
131 Pointer, | |
132 Array, | |
153 | 133 IdentifierList, |
135 | 134 Identifier, |
135 Typeof, | |
153 | 136 TemplateInstance, |
135 | 137 Specialization, |
138 } | |
139 | |
94 | 140 class Type |
141 { | |
135 | 142 TID tid; |
95 | 143 Type next; |
144 | |
135 | 145 this(TOK tok) |
146 { | |
147 this.tid = cast(TID)tok; | |
148 } | |
95 | 149 |
135 | 150 this(TID tid) |
151 { this(tid, null); } | |
152 | |
153 this(TID tid, Type next) | |
94 | 154 { |
135 | 155 this.tid = tid; |
95 | 156 this.next = next; |
94 | 157 } |
158 } | |
159 | |
134
a31aa0d6dd5e
- Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents:
130
diff
changeset
|
160 class UndefinedType : Type |
a31aa0d6dd5e
- Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents:
130
diff
changeset
|
161 { |
a31aa0d6dd5e
- Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents:
130
diff
changeset
|
162 this() |
a31aa0d6dd5e
- Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents:
130
diff
changeset
|
163 { |
135 | 164 super(TID.Undefined, null); |
134
a31aa0d6dd5e
- Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents:
130
diff
changeset
|
165 } |
a31aa0d6dd5e
- Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents:
130
diff
changeset
|
166 } |
a31aa0d6dd5e
- Added class UndefinedType. Returning it in parseBasicType() when no token matched the basic type list.
aziz
parents:
130
diff
changeset
|
167 |
153 | 168 class IdentifierListType : Type |
169 { | |
170 Type[] identList; | |
171 this(Type[] identList) | |
172 { | |
173 super(TID.IdentifierList, null); | |
174 } | |
175 } | |
176 | |
94 | 177 class IdentifierType : Type |
178 { | |
179 string[] idents; | |
180 | |
181 this(string[] idents) | |
182 { | |
135 | 183 super(TID.Identifier, null); |
94 | 184 this.idents = idents; |
185 } | |
186 | |
153 | 187 this(string ident) |
188 { | |
189 super(TID.Identifier, null); | |
190 } | |
191 | |
135 | 192 this(TID tid) |
94 | 193 { |
135 | 194 super(tid); |
94 | 195 } |
196 | |
197 void opCatAssign(string ident) | |
198 { | |
199 this.idents ~= ident; | |
200 } | |
201 } | |
202 | |
203 class TypeofType : IdentifierType | |
204 { | |
205 Expression e; | |
206 this(Expression e) | |
207 { | |
135 | 208 super(TID.Typeof); |
94 | 209 this.e = e; |
210 } | |
211 } | |
95 | 212 |
153 | 213 class TemplateInstanceType : Type |
214 { | |
215 string ident; | |
216 TemplateArguments targs; | |
217 this(string ident, TemplateArguments targs) | |
218 { | |
219 super(TID.TemplateInstance, null); | |
220 this.ident = ident; | |
221 this.targs = targs; | |
222 } | |
223 } | |
224 | |
95 | 225 class PointerType : Type |
226 { | |
227 this(Type t) | |
228 { | |
135 | 229 super(TID.Pointer, t); |
95 | 230 } |
231 } | |
232 | |
233 class ArrayType : Type | |
234 { | |
106 | 235 Expression e, e2; |
236 Type assocType; | |
237 this(Type t) | |
95 | 238 { |
135 | 239 super(TID.Array, t); |
106 | 240 } |
241 this(Type t, Expression e, Expression e2) | |
242 { | |
243 this(t); | |
95 | 244 this.e = e; |
106 | 245 this.e2 = e2; |
246 } | |
247 this(Type t, Type assocType) | |
248 { | |
249 this(t); | |
250 this.assocType = assocType; | |
95 | 251 } |
252 } | |
100 | 253 |
254 class SpecializationType : Type | |
255 { | |
106 | 256 TOK specTok; // Colon|Equal |
100 | 257 Type type; |
106 | 258 TOK tokType; // Typedef|Struct|Union|Class|Interface| |
259 // Enum|Function|Delegate|Super|Return | |
100 | 260 |
261 this(TOK specTok, TOK tokType) | |
262 { | |
135 | 263 super(TID.Specialization, null); |
100 | 264 this.specTok = specTok; |
265 this.tokType = tokType; | |
266 } | |
267 | |
268 this(TOK specTok, Type type) | |
269 { | |
135 | 270 super(TID.Specialization, null); |
100 | 271 this.specTok = specTok; |
272 this.type = type; | |
273 } | |
274 } | |
130 | 275 |
276 class FunctionType : Type | |
277 { | |
278 Type returnType; | |
279 Parameters parameters; | |
280 this(Type returnType, Parameters parameters) | |
281 { | |
135 | 282 super(TID.Function, null); |
130 | 283 this.returnType = returnType; |
284 this.parameters = parameters; | |
285 } | |
286 } | |
135 | 287 |
288 class DelegateType : Type | |
289 { | |
290 this(Type func) | |
291 { | |
292 super(TID.Delegate, func); | |
293 } | |
294 } |