Mercurial > projects > ddmd
annotate dmd/TemplateValueParameter.d @ 7:89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
author | dkoroskin <> |
---|---|
date | Mon, 14 Dec 2009 14:50:03 +0300 |
parents | 10317f0c89a5 |
children | d4825905adc2 |
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; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
15 import dmd.STC; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
16 import dmd.Util; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
17 import dmd.TY; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
18 import dmd.WANT; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
19 import dmd.TOK; |
0 | 20 |
21 class TemplateValueParameter : TemplateParameter | |
22 { | |
23 /* Syntax: | |
24 * valType ident : specValue = defaultValue | |
25 */ | |
26 | |
27 Type valType; | |
28 Expression specValue; | |
29 Expression defaultValue; | |
30 | |
31 static Expression edummy; | |
32 | |
33 this(Loc loc, Identifier ident, Type valType, Expression specValue, Expression defaultValue) | |
34 { | |
35 super(loc, ident); | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
36 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
37 this.valType = valType; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
38 this.specValue = specValue; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
39 this.defaultValue = defaultValue; |
0 | 40 } |
41 | |
42 TemplateValueParameter isTemplateValueParameter() | |
43 { | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
44 return this; |
0 | 45 } |
46 | |
47 TemplateParameter syntaxCopy() | |
48 { | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
49 TemplateValueParameter tp = new TemplateValueParameter(loc, ident, valType, specValue, defaultValue); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
50 tp.valType = valType.syntaxCopy(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
51 if (specValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
52 tp.specValue = specValue.syntaxCopy(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
53 if (defaultValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
54 tp.defaultValue = defaultValue.syntaxCopy(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
55 return tp; |
0 | 56 } |
57 | |
58 void declareParameter(Scope sc) | |
59 { | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
60 VarDeclaration v = new VarDeclaration(loc, valType, ident, null); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
61 v.storage_class = STC.STCtemplateparameter; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
62 if (!sc.insert(v)) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
63 error(loc, "parameter '%s' multiply defined", ident.toChars()); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
64 sparam = v; |
0 | 65 } |
66 | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
67 void semantic(Scope sc) |
0 | 68 { |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
69 sparam.semantic(sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
70 valType = valType.semantic(loc, sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
71 if (!(valType.isintegral() || valType.isfloating() || valType.isString()) && valType.ty != TY.Tident) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
72 error(loc, "arithmetic/string type expected for value-parameter, not %s", valType.toChars()); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
73 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
74 if (specValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
75 { |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
76 Expression e = specValue; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
77 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
78 e = e.semantic(sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
79 e = e.implicitCastTo(sc, valType); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
80 e = e.optimize(WANTvalue | WANTinterpret); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
81 if (e.op == TOKint64 || e.op == TOKfloat64 || |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
82 e.op == TOKcomplex80 || e.op == TOKnull || e.op == TOKstring) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
83 specValue = e; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
84 //e.toInteger(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
85 } |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
86 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
87 static if (false) { // defer semantic analysis to arg match |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
88 if (defaultValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
89 { |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
90 Expression e = defaultValue; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
91 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
92 e = e.semantic(sc); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
93 e = e.implicitCastTo(sc, valType); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
94 e = e.optimize(WANTvalue | WANTinterpret); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
95 if (e.op == TOKint64) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
96 defaultValue = e; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
97 //e.toInteger(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
98 } |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
99 } |
0 | 100 } |
101 | |
102 void print(Object oarg, Object oded) | |
103 { | |
104 assert(false); | |
105 } | |
106 | |
107 void toCBuffer(OutBuffer buf, HdrGenState* hgs) | |
108 { | |
109 assert(false); | |
110 } | |
111 | |
112 Object specialization() | |
113 { | |
114 assert(false); | |
115 } | |
116 | |
117 Object defaultArg(Loc loc, Scope sc) | |
118 { | |
119 assert(false); | |
120 } | |
121 | |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
122 bool overloadMatch(TemplateParameter tp) |
0 | 123 { |
7
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
124 TemplateValueParameter tvp = tp.isTemplateValueParameter(); |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
125 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
126 if (tvp) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
127 { |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
128 if (valType != tvp.valType) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
129 return false; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
130 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
131 if (valType && !valType.equals(tvp.valType)) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
132 return false; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
133 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
134 if (specValue != tvp.specValue) |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
135 return false; |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
136 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
137 return true; // match |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
138 } |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
139 |
89cc05dbdae1
Implementing TemplateAliasParameter and TemplateValueParameter
dkoroskin <>
parents:
0
diff
changeset
|
140 return false; |
0 | 141 } |
142 | |
143 MATCH matchArg(Scope sc, Objects tiargs, int i, TemplateParameters parameters, Objects dedtypes, Declaration* psparam, int flags) | |
144 { | |
145 assert(false); | |
146 } | |
147 | |
148 void* dummyArg() | |
149 { | |
150 assert(false); | |
151 } | |
152 } |