annotate dmd/IdentifierExp.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 e28b18c23469
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: 68
diff changeset
1 module dmd.IdentifierExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 72
diff changeset
3 import dmd.common;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
4 import dmd.Expression;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
5 import dmd.Declaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
6 import dmd.TY;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
7 import dmd.TypePointer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
8 import dmd.FuncDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
9 import dmd.TemplateInstance;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
10 import dmd.TemplateDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
11 import dmd.TemplateExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
12 import dmd.DsymbolExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
13 import dmd.Identifier;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
14 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
15 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
16 import dmd.Scope;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
17 import dmd.Dsymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
18 import dmd.WithScopeSymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
19 import dmd.VarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
20 import dmd.DotIdExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
21 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
22 import dmd.HdrGenState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
23 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
24
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 class IdentifierExp : Expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 Identifier ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 Declaration var;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 this(Loc loc, Identifier ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 114
diff changeset
33 register();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
34 super(loc, TOK.TOKidentifier, IdentifierExp.sizeof);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 this.ident = ident;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 this(Loc loc, Declaration var)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 114
diff changeset
40 register();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
41 assert(false);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 super(loc, TOK.init, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
45 override Expression semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
47 Dsymbol s;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
48 Dsymbol scopesym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
49
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
50 version (LOGSEMANTIC) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
51 printf("IdentifierExp.semantic('%s')\n", ident.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
52 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
53 s = sc.search(loc, ident, &scopesym);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
54 if (s)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
55 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
56 Expression e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
57 WithScopeSymbol withsym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
58
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
59 /* See if the symbol was a member of an enclosing 'with'
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
60 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
61 withsym = scopesym.isWithScopeSymbol();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
62 if (withsym)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
63 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
64 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
65 /* Disallow shadowing
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
66 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
67 // First find the scope of the with
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
68 Scope scwith = sc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
69 while (scwith.scopesym !is scopesym)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
70 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
71 scwith = scwith.enclosing;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
72 assert(scwith);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
73 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
74
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
75 // Look at enclosing scopes for symbols with the same name,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
76 // in the same function
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
77 for (Scope scx = scwith; scx && scx.func == scwith.func; scx = scx.enclosing)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
78 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
79 Dsymbol s2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
80
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
81 if (scx.scopesym && scx.scopesym.symtab && (s2 = scx.scopesym.symtab.lookup(s.ident)) !is null && s !is s2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
82 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
83 error("with symbol %s is shadowing local symbol %s", s.toPrettyChars(), s2.toPrettyChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
84 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
85 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
86 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
87 s = s.toAlias();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
88
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
89 // Same as wthis.ident
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
90 if (s.needThis() || s.isTemplateDeclaration())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
91 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
92 e = new VarExp(loc, withsym.withstate.wthis);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
93 e = new DotIdExp(loc, e, ident);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
94 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
95 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
96 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
97 Type t = withsym.withstate.wthis.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
98 if (t.ty == TY.Tpointer)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
99 t = (cast(TypePointer)t).next;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
100 e = typeDotIdExp(loc, t, ident);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
101 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
102 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
103 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
104 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
105 /* If f is really a function template,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
106 * then replace f with the function template declaration.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
107 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
108 FuncDeclaration f = s.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
109 if (f && f.parent)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
110 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
111 TemplateInstance ti = f.parent.isTemplateInstance();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
112
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
113 if (ti && !ti.isTemplateMixin() &&
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
114 (ti.name == f.ident || ti.toAlias().ident == f.ident) &&
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
115 ti.tempdecl && ti.tempdecl.onemember)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
116 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
117 TemplateDeclaration tempdecl = ti.tempdecl;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
118
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
119 if (tempdecl.overroot) // if not start of overloaded list of TemplateDeclaration's
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
120 tempdecl = tempdecl.overroot; // then get the start
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
121
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
122 e = new TemplateExp(loc, tempdecl);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
123 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
124
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
125 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
126 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
127 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
128
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
129 // Haven't done overload resolution yet, so pass 1
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
130 e = new DsymbolExp(loc, s, 1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
131 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
132
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
133 return e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
134 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
135
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
136 error("undefined identifier %s", ident.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
137 type = Type.terror;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
141 override string toChars()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 return ident.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
146 override void dump(int indent)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
151 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
153 if (hgs.hdrgen)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
154 buf.writestring(ident.toHChars2());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
155 else
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 buf.writestring(ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
159 override int isLvalue()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 {
68
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 0
diff changeset
161 return 1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
164 override Expression toLvalue(Scope sc, Expression e)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
166 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
167 tym = tybasic(e1.ET.Tty);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
168 if (!(tyscalar(tym) || tym == TYM.TYstruct || tym == TYM.TYarray && e.Eoper == TOK.TOKaddr))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
169 synerr(EM_lvalue); // lvalue expected
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
170 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174