annotate dmd/IsExp.d @ 135:af1bebfd96a4 dmd2037

dmd 2.038
author Eldar Insafutdinov <e.insafutdinov@gmail.com>
date Mon, 13 Sep 2010 22:19:42 +0100
parents 60bb0fe4563e
children e3afd1303184
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
1 module dmd.IsExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 113
diff changeset
3 import dmd.common;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
4 import dmd.Expression;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
5 import dmd.Identifier;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
6 import dmd.ArrayTypes;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
7 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
8 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
9 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
10 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
11 import dmd.Scope;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.TypeEnum;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.TypeClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.TemplateParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.BaseClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.TypeStruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.TypeTypedef;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.AliasDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.TypeTuple;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.TypeDelegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.Declaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.TypeFunction;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.MATCH;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.TypePointer;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
31 import dmd.Parameter;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
32 import dmd.Token;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
33
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 class IsExp : Expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 /* is(targ id tok tspec)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 * is(targ id == tok2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 Type targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 Identifier id; // can be null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 TOK tok; // ':' or '=='
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 Type tspec; // can be null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 TOK tok2; // 'struct', 'union', 'typedef', etc.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 TemplateParameters parameters;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 this(Loc loc, Type targ, Identifier id, TOK tok, Type tspec, TOK tok2, TemplateParameters parameters)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 super(loc, TOK.TOKis, IsExp.sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 this.targ = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 this.id = id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 this.tok = tok;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 this.tspec = tspec;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 this.tok2 = tok2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 this.parameters = parameters;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
58 override Expression syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
60 // This section is identical to that in TemplateDeclaration.syntaxCopy()
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
61 TemplateParameters p = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
62 if (parameters)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
63 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
64 p = new TemplateParameters();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
65 p.setDim(parameters.dim);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
66 for (int i = 0; i < p.dim; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
67 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
68 auto tp = parameters[i];
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
69 p[i] = tp.syntaxCopy();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
70 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
71 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
73 return new IsExp(loc,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
74 targ.syntaxCopy(),
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
75 id,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
76 tok,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
77 tspec ? tspec.syntaxCopy() : null,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
78 tok2,
42
24674203f62c IsExp.syntaxCopy implemented
korDen
parents: 13
diff changeset
79 p);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
82 override Expression semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 Type tded;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 /* is(targ id tok tspec)
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 72
diff changeset
87 * is(targ id : tok2)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 * is(targ id == tok2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 //printf("IsExp.semantic(%s)\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 if (id && !(sc.flags & SCOPE.SCOPEstaticif))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 error("can only declare type aliases within static if conditionals");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 Type t = targ.trySemantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 if (!t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 goto Lno; // errors, so condition is false
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 targ = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 if (tok2 != TOK.TOKreserved)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101 switch (tok2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 case TOKtypedef:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 if (targ.ty != Ttypedef)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 tded = (cast(TypeTypedef)targ).sym.basetype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 case TOKstruct:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 if (targ.ty != Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 if ((cast(TypeStruct)targ).sym.isUnionDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 case TOKunion:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 if (targ.ty != Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 if (!(cast(TypeStruct)targ).sym.isUnionDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 case TOKclass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 if (targ.ty != Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 if ((cast(TypeClass)targ).sym.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 case TOKinterface:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 if (targ.ty != Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 if (!(cast(TypeClass)targ).sym.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 case TOKconst:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 if (!targ.isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 case TOKinvariant:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 case TOKimmutable:
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
149 if (!targ.isImmutable())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 case TOKshared:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 if (!targ.isShared())
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
156 goto Lno;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
157 tded = targ;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
158 break;
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
159
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
160 case TOKwild:
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
161 if (!targ.isWild())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 case TOKsuper:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 // If class or interface, get the base class and interfaces
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 if (targ.ty != Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 { ClassDeclaration cd = (cast(TypeClass)targ).sym;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
173 auto args = new Parameters;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 args.reserve(cd.baseclasses.dim);
125
767a01c2a272 BaseClasses -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
175 foreach (b; cd.baseclasses)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
177 args.push(new Parameter(STCin, b.type, null, null));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 tded = new TypeTuple(args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 case TOKenum:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 if (targ.ty != Tenum)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 tded = (cast(TypeEnum)targ).sym.memtype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 case TOKdelegate:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 if (targ.ty != Tdelegate)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 tded = (cast(TypeDelegate)targ).next; // the underlying function type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 case TOKfunction:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 if (targ.ty != Tfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 /* Generate tuple from function parameter types.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 assert(tded.ty == Tfunction);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
204 auto params = (cast(TypeFunction)tded).parameters;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
205 size_t dim = Parameter.dim(params);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
206 auto args = new Parameters;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 args.reserve(dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 for (size_t i = 0; i < dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
210 auto arg = Parameter.getNth(params, i);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 assert(arg && arg.type);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
212 args.push(new Parameter(arg.storageClass, arg.type, null, null));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 tded = new TypeTuple(args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 case TOKreturn:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 /* Get the 'return type' for the function,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 * delegate, or pointer to function.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 if (targ.ty == Tfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 tded = (cast(TypeFunction)targ).next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 else if (targ.ty == Tdelegate)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 { tded = (cast(TypeDelegate)targ).next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 tded = (cast(TypeFunction)tded).next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 else if (targ.ty == Tpointer &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 (cast(TypePointer)targ).next.ty == Tfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 { tded = (cast(TypePointer)targ).next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 tded = (cast(TypeFunction)tded).next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 goto Lyes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 else if (id && tspec)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 /* Evaluate to true if targ matches tspec.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 * If true, declare id as an alias for the specialized type.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 assert(parameters && parameters.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
250 scope dedtypes = new Objects();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 dedtypes.setDim(parameters.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 dedtypes.zero();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 72
diff changeset
254 MATCH m = targ.deduceType(null, tspec, parameters, dedtypes);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 if (m == MATCHnomatch ||
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 (m != MATCHexact && tok == TOKequal))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 {
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
262 tded = cast(Type)dedtypes[0];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 if (!tded)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 scope Objects tiargs = new Objects();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 tiargs.setDim(1);
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
268 tiargs[0] = targ;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 /* Declare trailing parameters
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 for (int i = 1; i < parameters.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
274 auto tp = parameters[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 Declaration s = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 m = tp.matchArg(sc, tiargs, i, parameters, dedtypes, &s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 if (m == MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 s.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 if (!sc.insert(s))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 error("declaration %s is already defined", s.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 Object o = cast(Object)dedtypes.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 Dsymbol s = TemplateDeclaration.declareParameter(loc, sc, tp, o);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 if (sc.sd)
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
288 s.addMember(sc, sc.sd, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 goto Lyes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 else if (id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 /* Declare id as an alias for type targ. Evaluate to true
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 tded = targ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 goto Lyes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 else if (tspec)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 /* Evaluate to true if targ matches tspec
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 * is(targ == tspec)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 * is(targ : tspec)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 tspec = tspec.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 //printf("targ = %s\n", targ.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 //printf("tspec = %s\n", tspec.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 if (tok == TOKcolon)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 if (targ.implicitConvTo(tspec))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 goto Lyes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 else /* == */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 if (targ.equals(tspec))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 goto Lyes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 Lyes:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 if (id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 Dsymbol s = new AliasDeclaration(loc, id, tded);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 s.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 if (!sc.insert(s))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 error("declaration %s is already defined", s.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 if (sc.sd)
13
427f8aa74d28 On the road to make Phobos compilable
korDen
parents: 0
diff changeset
334 s.addMember(sc, sc.sd, true);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 //printf("Lyes\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 return new IntegerExp(loc, 1, Type.tbool);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 Lno:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 //printf("Lno\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 return new IntegerExp(loc, 0, Type.tbool);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
344 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
346 buf.writestring("is(");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
347 targ.toCBuffer(buf, id, hgs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
348 if (tok2 != TOKreserved)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
349 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
350 buf.printf(" %s %s", Token.toChars(tok), Token.toChars(tok2));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
351 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
352 else if (tspec)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
353 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
354 if (tok == TOKcolon)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
355 buf.writestring(" : ");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
356 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
357 buf.writestring(" == ");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
358 tspec.toCBuffer(buf, null, hgs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
359 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
360 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
361 if (parameters)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
362 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
363 // First parameter is already output, so start with second
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
364 for (int i = 1; i < parameters.dim; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
365 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
366 buf.writeByte(',');
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
367 auto tp = parameters[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
368 tp.toCBuffer(buf, hgs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
369 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
370 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 50
diff changeset
371 }
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 42
diff changeset
372 buf.writeByte(')');
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375