annotate dmd/TraitsExp.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 80f4806ffa13
children cd48cb899aee
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: 23
diff changeset
1 module dmd.TraitsExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
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: 23
diff changeset
4 import dmd.Expression;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
5 import dmd.Identifier;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
6 import dmd.ArrayTypes;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
7 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
8 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
9 import dmd.Scope;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
10 import dmd.HdrGenState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
11 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
12 import dmd.TY;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
13 import dmd.STC;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
14 import dmd.WANT;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
15 import dmd.Id;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
16 import dmd.Global;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
17 import dmd.Lexer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
18 import dmd.ArrayLiteralExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
19 import dmd.VarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
20 import dmd.StringExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
21 import dmd.DotIdExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
22 import dmd.DotVarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
23 import dmd.IntegerExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
24 import dmd.TupleExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
25 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
26 import dmd.Dsymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
27 import dmd.DsymbolExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
28 import dmd.ScopeDsymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
29 import dmd.FuncDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
30 import dmd.ClassDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
31 import dmd.TemplateDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
32 import dmd.TemplateInstance;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
33 import dmd.TypeClass;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
34 import dmd.Declaration;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
35 import dmd.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
36 import dmd.expression.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
37
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
38 import core.stdc.string : strcmp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
39
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
40 /************************************************
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
41 * Delegate to be passed to overloadApply() that looks
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
42 * for virtual functions.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
43 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
44
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
45 struct Pvirtuals
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
46 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
47 Expression e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
48 Expressions exps;
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
49
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
50 bool visit(FuncDeclaration f)
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
51 {
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
52 Pvirtuals* p = &this;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
53
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
54 if (f.isVirtual())
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
55 {
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
56 Expression e;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
57
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
58 if (p.e1.op == TOKdotvar)
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
59 {
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
60 DotVarExp dve = cast(DotVarExp)p.e1;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
61 e = new DotVarExp(Loc(0), dve.e1, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
62 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
63 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
64 e = new DsymbolExp(Loc(0), f);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
65 p.exps.push(e);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
66 }
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
67 return false;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
68 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
69 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
70
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
71
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
73 class TraitsExp : Expression
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
74 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
75 Identifier ident;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
76
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
77 Objects args;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
78
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
79 this(Loc loc, Identifier ident, Objects args)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
80 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 158
diff changeset
81 register();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
82 super(loc, TOK.TOKtraits, this.sizeof);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
83 this.ident = ident;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
84 this.args = args;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
85 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
86
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
87 override Expression syntaxCopy()
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
88 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
89 return new TraitsExp(loc, ident, TemplateInstance.arraySyntaxCopy(args));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
90 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
91
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
92 override Expression semantic(Scope sc)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
93 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
94 version (LOGSEMANTIC) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
95 printf("TraitsExp.semantic() %s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
96 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
97 if (ident != Id.compiles && ident != Id.isSame)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
98 TemplateInstance.semanticTiargs(loc, sc, args, 1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
99 size_t dim = args ? args.dim : 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
100 Object o;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
101 Declaration d;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
102 FuncDeclaration f;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
103
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
104 string ISTYPE(string cond)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
105 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
106 return `
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
107 for (size_t i = 0; i < dim; i++)
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
108 { Type t = getType(args[i]);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
109 if (!t)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
110 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
111 if (!(`~cond~`))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
112 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
113 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
114 if (!dim)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
115 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
116 goto Ltrue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
117 `;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
118 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
119
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
120 string ISDSYMBOL(string cond)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
121 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
122 return `for (size_t i = 0; i < dim; i++)
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
123 { Dsymbol s = getDsymbol(args[i]);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
124 if (!s)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
125 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
126 if (!(`~cond~`))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
127 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
128 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
129 if (!dim)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
130 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
131 goto Ltrue;`;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
132 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
133
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
134 if (ident == Id.isArithmetic)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
135 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
136 mixin(ISTYPE(`t.isintegral() || t.isfloating()`));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
137 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
138 else if (ident == Id.isFloating)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
139 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
140 mixin(ISTYPE(q{t.isfloating()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
141 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
142 else if (ident == Id.isIntegral)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
143 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
144 mixin(ISTYPE(q{t.isintegral()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
145 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
146 else if (ident == Id.isScalar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
147 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
148 mixin(ISTYPE(q{t.isscalar()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
149 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
150 else if (ident == Id.isUnsigned)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
151 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
152 mixin(ISTYPE(q{t.isunsigned()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
153 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
154 else if (ident == Id.isAssociativeArray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
155 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
156 mixin(ISTYPE(q{t.toBasetype().ty == TY.Taarray}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
157 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
158 else if (ident == Id.isStaticArray)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
159 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
160 mixin(ISTYPE(q{t.toBasetype().ty == TY.Tsarray}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
161 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
162 else if (ident == Id.isAbstractClass)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
163 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
164 mixin(ISTYPE(q{t.toBasetype().ty == TY.Tclass && (cast(TypeClass)t.toBasetype()).sym.isAbstract()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
165 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
166 else if (ident == Id.isFinalClass)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
167 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
168 mixin(ISTYPE(q{t.toBasetype().ty == TY.Tclass && (cast(TypeClass)t.toBasetype()).sym.storage_class & STC.STCfinal}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
169 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
170 else if (ident == Id.isAbstractFunction)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
171 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
172 mixin(ISDSYMBOL(q{(f = s.isFuncDeclaration()) !is null && f.isAbstract()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
173 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
174 else if (ident == Id.isVirtualFunction)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
175 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
176 mixin(ISDSYMBOL(q{(f = s.isFuncDeclaration()) !is null && f.isVirtual()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
177 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
178 else if (ident == Id.isFinalFunction)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
179 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
180 mixin(ISDSYMBOL(q{(f = s.isFuncDeclaration()) !is null && f.isFinal()}));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
181 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
182 //version(DMDV2) {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
183 else if (ident == Id.isRef)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
184 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
185 mixin(ISDSYMBOL(q{(d = s.isDeclaration()) !is null && d.isRef()}));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
186 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
187 else if (ident == Id.isOut)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
188 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
189 mixin(ISDSYMBOL(q{(d = s.isDeclaration()) !is null && d.isOut()}));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
190 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
191 else if (ident == Id.isLazy)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
192 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
193 mixin(ISDSYMBOL(q{(d = s.isDeclaration()) !is null && d.storage_class & STClazy}));
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
194 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
195 //}
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
196 else if (ident == Id.hasMember ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
197 ident == Id.getMember ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
198 ident == Id.getVirtualFunctions)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
199 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
200 if (dim != 2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
201 goto Ldimerror;
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
202 auto o_ = args[0];
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
203 Expression e = isExpression(args[1]);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
204 if (!e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
205 { error("expression expected as second argument of __traits %s", ident.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
206 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
207 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
208 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
209 if (e.op != TOKstring)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
210 { error("string expected as second argument of __traits %s instead of %s", ident.toChars(), e.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
211 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
212 }
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
213 auto se = cast(StringExp)e;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
214 se = se.toUTF8(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
215 if (se.sz != 1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
216 { error("string must be chars");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
217 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
218 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
219 Identifier id = Lexer.idPool(fromStringz(cast(char*)se.string_));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
220
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
221 Type t = isType(o_);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
222 e = isExpression(o_);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
223 Dsymbol s = isDsymbol(o_);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
224 if (t)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
225 e = typeDotIdExp(loc, t, id);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
226 else if (e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
227 e = new DotIdExp(loc, e, id);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
228 else if (s)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
229 { e = new DsymbolExp(loc, s);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
230 e = new DotIdExp(loc, e, id);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
231 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
232 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
233 { error("invalid first argument");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
234 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
235 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
236
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
237 if (ident == Id.hasMember)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
238 { /* Take any errors as meaning it wasn't found
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
239 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
240 e = e.trySemantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
241 if (!e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
242 { if (global.gag)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
243 global.errors++;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
244 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
245 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
246 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
247 goto Ltrue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
248 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
249 else if (ident == Id.getMember)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
250 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
251 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
252 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
253 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
254 else if (ident == Id.getVirtualFunctions)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
255 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
256 uint errors = global.errors;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
257 Expression ex = e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
258 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
259 if (errors < global.errors)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
260 error("%s cannot be resolved", ex.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
261
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
262 /* Create tuple of virtual function overloads of e
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
263 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
264 //e.dump(0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
265 Expressions exps = new Expressions();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
266 FuncDeclaration f_;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
267 if (e.op == TOKvar)
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
268 {
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
269 VarExp ve = cast(VarExp)e;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
270 f_ = ve.var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
271 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
272 else if (e.op == TOKdotvar)
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
273 {
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
274 DotVarExp dve = cast(DotVarExp)e;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
275 f_ = dve.var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
276 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
277 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
278 f_ = null;
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
279
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
280 Pvirtuals p;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
281 p.exps = exps;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
282 p.e1 = e;
158
80f4806ffa13 overloadApply fixes
korDen
parents: 135
diff changeset
283 overloadApply(f_, p);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
284
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
285 TupleExp tup = new TupleExp(loc, exps);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
286 return tup.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
287 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
288 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
289 assert(0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
290 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
291 else if (ident == Id.classInstanceSize)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
292 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
293 if (dim != 1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
294 goto Ldimerror;
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
295 Object o_ = args[0];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
296 Dsymbol s = getDsymbol(o_);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
297 ClassDeclaration cd;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
298 if (!s || (cd = s.isClassDeclaration()) is null)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
299 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
300 error("first argument is not a class");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
301 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
302 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
303 return new IntegerExp(loc, cd.structsize, Type.tsize_t);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
304 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
305 else if (ident == Id.allMembers || ident == Id.derivedMembers)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
306 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
307 if (dim != 1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
308 goto Ldimerror;
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
309 Object o_ = args[0];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
310 Dsymbol s = getDsymbol(o_);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
311 ScopeDsymbol sd;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
312 if (!s)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
313 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
314 error("argument has no members");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
315 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
316 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
317 if ((sd = s.isScopeDsymbol()) is null)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
318 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
319 error("%s %s has no members", s.kind(), s.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
320 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
321 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
322 Expressions exps = new Expressions;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
323 while (1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
324 { size_t dim_ = ScopeDsymbol.dim(sd.members);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
325 for (size_t i = 0; i < dim_; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
326 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
327 Dsymbol sm = ScopeDsymbol.getNth(sd.members, i);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
328 //printf("\t[%i] %s %s\n", i, sm.kind(), sm.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
329 if (sm.ident)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
330 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
331 //printf("\t%s\n", sm.ident.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
332 auto str = sm.ident.toChars();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
333
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
334 /* Skip if already present in exps[]
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
335 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
336 for (size_t j = 0; j < exps.dim; j++)
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
337 { auto se2 = cast(StringExp)exps[j];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
338 if (strcmp(toStringz(str), cast(char*)se2.string_) == 0)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
339 goto Lnext;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
340 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
341
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
342 auto se = new StringExp(loc, str);
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
343 exps.push(se);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
344 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
345 Lnext:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
346 ;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
347 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
348 ClassDeclaration cd = sd.isClassDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
349 if (cd && cd.baseClass && ident == Id.allMembers)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
350 sd = cd.baseClass; // do again with base class
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
351 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
352 break;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
353 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
354 Expression e = new ArrayLiteralExp(loc, exps);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
355 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
356 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
357 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
358 else if (ident == Id.compiles)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
359 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
360 /* Determine if all the objects - types, expressions, or symbols -
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
361 * compile without error
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
362 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
363 if (!dim)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
364 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
365
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
366 for (size_t i = 0; i < dim; i++)
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
367 { Object o_ = args[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
368 Expression e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
369
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
370 uint errors = global.errors;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
371 global.gag++;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
372
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
373 Type t = isType(o_);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
374 if (t)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
375 { Dsymbol s;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
376 t.resolve(loc, sc, &e, &t, &s);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
377 if (t)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
378 t.semantic(loc, sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
379 else if (e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
380 e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
381 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
382 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
383 { e = isExpression(o);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
384 if (e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
385 e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
386 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
387
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
388 global.gag--;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
389 if (errors != global.errors)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
390 { if (global.gag == 0)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
391 global.errors = errors;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
392 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
393 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
394 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
395 goto Ltrue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
396 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
397 else if (ident == Id.isSame)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
398 { /* Determine if two symbols are the same
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
399 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
400 if (dim != 2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
401 goto Ldimerror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
402 TemplateInstance.semanticTiargs(loc, sc, args, 0);
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
403 Object o1 = args[0];
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
404 Object o2 = args[1];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
405 Dsymbol s1 = getDsymbol(o1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
406 Dsymbol s2 = getDsymbol(o2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
407
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 90
diff changeset
408 // writef("isSame: %s, %s\n", o1.toChars(), o2.toChars());
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 90
diff changeset
409 static if (0)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 90
diff changeset
410 {
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 90
diff changeset
411 writef("o1: %p\n", o1);
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 90
diff changeset
412 writef("o2: %p\n", o2);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
413 if (!s1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
414 { Expression ea = isExpression(o1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
415 if (ea)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
416 printf("%s\n", ea.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
417 Type ta = isType(o1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
418 if (ta)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
419 printf("%s\n", ta.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
420 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
421 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
422 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
423 printf("%s %s\n", s1.kind(), s1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
424 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
425 if (!s1 && !s2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
426 { Expression ea1 = isExpression(o1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
427 Expression ea2 = isExpression(o2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
428 if (ea1 && ea2 && ea1.equals(ea2))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
429 goto Ltrue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
430 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
431
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
432 if (!s1 || !s2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
433 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
434
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
435 s1 = s1.toAlias();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
436 s2 = s2.toAlias();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
437
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
438 if (s1 == s2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
439 goto Ltrue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
440 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
441 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
442 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
443 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
444 { error("unrecognized trait %s", ident.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
445 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
446 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
447
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
448 return null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
449
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
450 Lnottype:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
451 error("%s is not a type", o/*.toChars()*/); // BUG: o is Object, no member toChars()
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
452 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
453
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
454 Ldimerror:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
455 error("wrong number of arguments %d", dim);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
456 goto Lfalse;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
457
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
458
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
459 Lfalse:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
460 return new IntegerExp(loc, 0, Type.tbool);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
461
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
462 Ltrue:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
463 return new IntegerExp(loc, 1, Type.tbool);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
464 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
465
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
466 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
467 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
468 buf.writestring("__traits(");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
469 buf.writestring(ident.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
470 if (args)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
471 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
472 for (int i = 0; i < args.dim; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
473 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
474 buf.writeByte(',');
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 95
diff changeset
475 Object oarg = args[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
476 ObjectToCBuffer(buf, hgs, oarg);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
477 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
478 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
479 buf.writeByte(')');
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
480 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 23
diff changeset
481 }