Mercurial > projects > ddmd
comparison dmd/TypeEnum.d @ 0:10317f0c89a5
Initial commit
author | korDen |
---|---|
date | Sat, 24 Oct 2009 08:42:06 +0400 |
parents | |
children | ee3a9f34dc48 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:10317f0c89a5 |
---|---|
1 module dmd.TypeEnum; | |
2 | |
3 import dmd.Type; | |
4 import dmd.EnumDeclaration; | |
5 import dmd.Scope; | |
6 import dmd.Loc; | |
7 import dmd.Id; | |
8 import dmd.ErrorExp; | |
9 import dmd.Dsymbol; | |
10 import dmd.EnumMember; | |
11 import dmd.OutBuffer; | |
12 import dmd.HdrGenState; | |
13 import dmd.Expression; | |
14 import dmd.Identifier; | |
15 import dmd.MATCH; | |
16 import dmd.OutBuffer; | |
17 import dmd.CppMangleState; | |
18 import dmd.TypeInfoDeclaration; | |
19 import dmd.TypeInfoEnumDeclaration; | |
20 import dmd.ArrayTypes; | |
21 import dmd.TY; | |
22 import dmd.Util; | |
23 | |
24 import dmd.backend.TYPE; | |
25 | |
26 class TypeEnum : Type | |
27 { | |
28 EnumDeclaration sym; | |
29 | |
30 this(EnumDeclaration sym) | |
31 { | |
32 super(TY.Tenum); | |
33 this.sym = sym; | |
34 } | |
35 | |
36 version (DumbClone) { | |
37 } else { | |
38 Type clone() | |
39 { | |
40 assert(false); | |
41 } | |
42 } | |
43 Type syntaxCopy() | |
44 { | |
45 assert(false); | |
46 } | |
47 | |
48 ulong size(Loc loc) | |
49 { | |
50 if (!sym.memtype) | |
51 { | |
52 error(loc, "enum %s is forward referenced", sym.toChars()); | |
53 return 4; | |
54 } | |
55 return sym.memtype.size(loc); | |
56 } | |
57 | |
58 uint alignsize() | |
59 { | |
60 assert(false); | |
61 } | |
62 | |
63 string toChars() | |
64 { | |
65 assert(false); | |
66 } | |
67 | |
68 Type semantic(Loc loc, Scope sc) | |
69 { | |
70 //printf("TypeEnum::semantic() %s\n", toChars()); | |
71 //sym.semantic(sc); | |
72 return merge(); | |
73 } | |
74 | |
75 Dsymbol toDsymbol(Scope sc) | |
76 { | |
77 return sym; | |
78 } | |
79 | |
80 void toDecoBuffer(OutBuffer buf, int flag) | |
81 { | |
82 string name = sym.mangle(); | |
83 Type.toDecoBuffer(buf, flag); | |
84 buf.printf("%s", name); | |
85 } | |
86 | |
87 void toCBuffer2(OutBuffer buf, HdrGenState* hgs, int mod) | |
88 { | |
89 assert(false); | |
90 } | |
91 | |
92 Expression dotExp(Scope sc, Expression e, Identifier ident) | |
93 { | |
94 version (LOGDOTEXP) { | |
95 printf("TypeEnum::dotExp(e = '%s', ident = '%s') '%s'\n", e.toChars(), ident.toChars(), toChars()); | |
96 } | |
97 Dsymbol s = sym.search(e.loc, ident, 0); | |
98 if (!s) | |
99 { | |
100 if (ident is Id.max || | |
101 ident is Id.min || | |
102 ident is Id.init_ || | |
103 ident is Id.stringof_ || | |
104 !sym.memtype | |
105 ) | |
106 { | |
107 return getProperty(e.loc, ident); | |
108 } | |
109 | |
110 return sym.memtype.dotExp(sc, e, ident); | |
111 } | |
112 | |
113 EnumMember m = s.isEnumMember(); | |
114 Expression em = m.value.copy(); | |
115 em.loc = e.loc; | |
116 return em; | |
117 } | |
118 | |
119 Expression getProperty(Loc loc, Identifier ident) | |
120 { | |
121 assert(false); | |
122 } | |
123 | |
124 bool isintegral() | |
125 { | |
126 return true; | |
127 } | |
128 | |
129 bool isfloating() | |
130 { | |
131 return false; | |
132 } | |
133 | |
134 bool isscalar() | |
135 { | |
136 return true; | |
137 //return sym.memtype.isscalar(); | |
138 } | |
139 | |
140 bool isunsigned() | |
141 { | |
142 return sym.memtype.isunsigned(); | |
143 } | |
144 | |
145 MATCH implicitConvTo(Type to) | |
146 { | |
147 MATCH m; | |
148 | |
149 //printf("TypeEnum::implicitConvTo()\n"); | |
150 if (ty == to.ty && sym == (cast(TypeEnum)to).sym) | |
151 m = (mod == to.mod) ? MATCHexact : MATCHconst; | |
152 else if (sym.memtype.implicitConvTo(to)) | |
153 m = MATCHconvert; // match with conversions | |
154 else | |
155 m = MATCHnomatch; // no match | |
156 return m; | |
157 } | |
158 | |
159 MATCH constConv(Type to) | |
160 { | |
161 assert(false); | |
162 } | |
163 | |
164 Type toBasetype() | |
165 { | |
166 if (!sym.memtype) | |
167 { | |
168 debug writef("2: "); | |
169 error(sym.loc, "enum %s is forward referenced", sym.toChars()); | |
170 return tint32; | |
171 } | |
172 | |
173 return sym.memtype.toBasetype(); | |
174 } | |
175 | |
176 Expression defaultInit(Loc loc) | |
177 { | |
178 version (LOGDEFAULTINIT) { | |
179 printf("TypeEnum::defaultInit() '%s'\n", toChars()); | |
180 } | |
181 // Initialize to first member of enum | |
182 //printf("%s\n", sym.defaultval.type.toChars()); | |
183 if (!sym.defaultval) | |
184 { | |
185 error(loc, "forward reference of %s.init", toChars()); | |
186 return new ErrorExp(); | |
187 } | |
188 return sym.defaultval; | |
189 } | |
190 | |
191 bool isZeroInit(Loc loc) | |
192 { | |
193 if (!sym.defaultval) | |
194 { | |
195 debug writef("3: "); | |
196 error(loc, "enum %s is forward referenced", sym.toChars()); | |
197 return 0; | |
198 } | |
199 return sym.defaultval.isBool(false); | |
200 } | |
201 | |
202 MATCH deduceType(Scope sc, Type tparam, TemplateParameters parameters, Objects dedtypes) | |
203 { | |
204 assert(false); | |
205 } | |
206 | |
207 TypeInfoDeclaration getTypeInfoDeclaration() | |
208 { | |
209 return new TypeInfoEnumDeclaration(this); | |
210 } | |
211 | |
212 bool hasPointers() | |
213 { | |
214 return toBasetype().hasPointers(); | |
215 } | |
216 | |
217 version (CPP_MANGLE) { | |
218 void toCppMangle(OutBuffer buf, CppMangleState* cms) | |
219 { | |
220 assert(false); | |
221 } | |
222 } | |
223 | |
224 type* toCtype() | |
225 { | |
226 return sym.memtype.toCtype(); | |
227 } | |
228 } |