Mercurial > projects > ddmd
annotate dmd/TemplateValueParameter.d @ 40:caa9bdb08ae6
TemplateValueParameter.matchArg implemented
author | korDen |
---|---|
date | Sat, 21 Aug 2010 07:10:53 +0400 |
parents | d4825905adc2 |
children | ea4769860460 |
rev | line source |
---|---|
0 | 1 module dmd.TemplateValueParameter; |
2 | |
3 import dmd.TemplateParameter; | |
4 import dmd.Scope; | |
5 import dmd.Declaration; | |
6 import dmd.ArrayTypes; | |
7 import dmd.Type; | |
8 import dmd.Expression; | |
9 import dmd.Loc; | |
10 import dmd.Identifier; | |
11 import dmd.OutBuffer; | |
12 import dmd.HdrGenState; | |
13 import dmd.MATCH; | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
14 import dmd.VarDeclaration; |
40 | 15 import dmd.Initializer; |
16 import dmd.ExpInitializer; | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
17 import dmd.STC; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
18 import dmd.Util; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
19 import dmd.TY; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
20 import dmd.WANT; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
21 import dmd.TOK; |
0 | 22 |
40 | 23 import dmd.Dsymbol : isExpression; |
24 | |
0 | 25 class TemplateValueParameter : TemplateParameter |
26 { | |
27 /* Syntax: | |
28 * valType ident : specValue = defaultValue | |
29 */ | |
30 | |
31 Type valType; | |
32 Expression specValue; | |
33 Expression defaultValue; | |
34 | |
35 static Expression edummy; | |
36 | |
37 this(Loc loc, Identifier ident, Type valType, Expression specValue, Expression defaultValue) | |
38 { | |
39 super(loc, ident); | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
40 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
41 this.valType = valType; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
42 this.specValue = specValue; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
43 this.defaultValue = defaultValue; |
0 | 44 } |
45 | |
46 TemplateValueParameter isTemplateValueParameter() | |
47 { | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
48 return this; |
0 | 49 } |
50 | |
51 TemplateParameter syntaxCopy() | |
52 { | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
53 TemplateValueParameter tp = new TemplateValueParameter(loc, ident, valType, specValue, defaultValue); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
54 tp.valType = valType.syntaxCopy(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
55 if (specValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
56 tp.specValue = specValue.syntaxCopy(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
57 if (defaultValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
58 tp.defaultValue = defaultValue.syntaxCopy(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
59 return tp; |
0 | 60 } |
61 | |
62 void declareParameter(Scope sc) | |
63 { | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
64 VarDeclaration v = new VarDeclaration(loc, valType, ident, null); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
65 v.storage_class = STC.STCtemplateparameter; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
66 if (!sc.insert(v)) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
67 error(loc, "parameter '%s' multiply defined", ident.toChars()); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
68 sparam = v; |
0 | 69 } |
70 | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
71 void semantic(Scope sc) |
0 | 72 { |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
73 sparam.semantic(sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
74 valType = valType.semantic(loc, sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
75 if (!(valType.isintegral() || valType.isfloating() || valType.isString()) && valType.ty != TY.Tident) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
76 error(loc, "arithmetic/string type expected for value-parameter, not %s", valType.toChars()); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
77 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
78 if (specValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
79 { |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
80 Expression e = specValue; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
81 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
82 e = e.semantic(sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
83 e = e.implicitCastTo(sc, valType); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
84 e = e.optimize(WANTvalue | WANTinterpret); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
85 if (e.op == TOKint64 || e.op == TOKfloat64 || |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
86 e.op == TOKcomplex80 || e.op == TOKnull || e.op == TOKstring) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
87 specValue = e; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
88 //e.toInteger(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
89 } |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
90 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
91 static if (false) { // defer semantic analysis to arg match |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
92 if (defaultValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
93 { |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
94 Expression e = defaultValue; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
95 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
96 e = e.semantic(sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
97 e = e.implicitCastTo(sc, valType); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
98 e = e.optimize(WANTvalue | WANTinterpret); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
99 if (e.op == TOKint64) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
100 defaultValue = e; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
101 //e.toInteger(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
102 } |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
103 } |
0 | 104 } |
105 | |
106 void print(Object oarg, Object oded) | |
107 { | |
108 assert(false); | |
109 } | |
110 | |
111 void toCBuffer(OutBuffer buf, HdrGenState* hgs) | |
112 { | |
113 assert(false); | |
114 } | |
115 | |
116 Object specialization() | |
117 { | |
39 | 118 return specValue; |
0 | 119 } |
120 | |
121 Object defaultArg(Loc loc, Scope sc) | |
122 { | |
123 assert(false); | |
124 } | |
125 | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
126 bool overloadMatch(TemplateParameter tp) |
0 | 127 { |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
128 TemplateValueParameter tvp = tp.isTemplateValueParameter(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
129 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
130 if (tvp) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
131 { |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
132 if (valType != tvp.valType) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
133 return false; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
134 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
135 if (valType && !valType.equals(tvp.valType)) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
136 return false; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
137 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
138 if (specValue != tvp.specValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
139 return false; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
140 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
141 return true; // match |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
142 } |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
143 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
144 return false; |
0 | 145 } |
146 | |
147 MATCH matchArg(Scope sc, Objects tiargs, int i, TemplateParameters parameters, Objects dedtypes, Declaration* psparam, int flags) | |
148 { | |
40 | 149 //printf("TemplateValueParameter.matchArg()\n"); |
150 | |
151 Initializer init; | |
152 Declaration sparam; | |
153 MATCH m = MATCHexact; | |
154 Expression ei; | |
155 Object oarg; | |
156 | |
157 if (i < tiargs.dim) | |
158 oarg = cast(Object)tiargs.data[i]; | |
159 else | |
160 { | |
161 // Get default argument instead | |
162 oarg = defaultArg(loc, sc); | |
163 if (!oarg) | |
164 { | |
165 assert(i < dedtypes.dim); | |
166 // It might have already been deduced | |
167 oarg = cast(Object)dedtypes.data[i]; | |
168 if (!oarg) | |
169 goto Lnomatch; | |
170 } | |
171 } | |
172 | |
173 ei = isExpression(oarg); | |
174 Type vt; | |
175 | |
176 if (!ei && oarg) | |
177 goto Lnomatch; | |
178 | |
179 if (ei && ei.op == TOKvar) | |
180 { | |
181 // Resolve const variables that we had skipped earlier | |
182 ei = ei.optimize(WANTvalue | WANTinterpret); | |
183 } | |
184 | |
185 if (specValue) | |
186 { | |
187 if (!ei || ei == edummy) | |
188 goto Lnomatch; | |
189 | |
190 Expression e = specValue; | |
191 | |
192 e = e.semantic(sc); | |
193 e = e.implicitCastTo(sc, valType); | |
194 e = e.optimize(WANTvalue | WANTinterpret); | |
195 //e.type = e.type.toHeadMutable(); | |
196 | |
197 ei = ei.syntaxCopy(); | |
198 ei = ei.semantic(sc); | |
199 ei = ei.optimize(WANTvalue | WANTinterpret); | |
200 //ei.type = ei.type.toHeadMutable(); | |
201 //printf("\tei: %s, %s\n", ei.toChars(), ei.type.toChars()); | |
202 //printf("\te : %s, %s\n", e.toChars(), e.type.toChars()); | |
203 if (!ei.equals(e)) | |
204 goto Lnomatch; | |
205 } | |
206 else if (dedtypes.data[i]) | |
207 { // Must match already deduced value | |
208 Expression e = cast(Expression)dedtypes.data[i]; | |
209 | |
210 if (!ei || !ei.equals(e)) | |
211 goto Lnomatch; | |
212 } | |
213 Lmatch: | |
214 //printf("\tvalType: %s, ty = %d\n", valType.toChars(), valType.ty); | |
215 vt = valType.semantic(Loc(0), sc); | |
216 //printf("ei: %s, ei.type: %s\n", ei.toChars(), ei.type.toChars()); | |
217 //printf("vt = %s\n", vt.toChars()); | |
218 if (ei.type) | |
219 { | |
220 m = cast(MATCH)ei.implicitConvTo(vt); | |
221 //printf("m: %d\n", m); | |
222 if (!m) | |
223 goto Lnomatch; | |
224 } | |
225 dedtypes.data[i] = cast(void*)ei; | |
226 | |
227 init = new ExpInitializer(loc, ei); | |
228 sparam = new VarDeclaration(loc, vt, ident, init); | |
229 sparam.storage_class = STCmanifest; | |
230 *psparam = sparam; | |
231 return m; | |
232 | |
233 Lnomatch: | |
234 //printf("\tno match\n"); | |
235 *psparam = null; | |
236 return MATCHnomatch; | |
0 | 237 } |
238 | |
239 void* dummyArg() | |
240 { | |
241 assert(false); | |
242 } | |
243 } |