Mercurial > projects > ddmd
annotate dmd/CompileDeclaration.d @ 18:f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
author | Robert Clipsham <robert@octarineparrot.com> |
---|---|
date | Mon, 05 Apr 2010 19:16:14 +0100 |
parents | 10317f0c89a5 |
children | 460959608115 |
rev | line source |
---|---|
0 | 1 module dmd.CompileDeclaration; |
2 | |
3 import dmd.AttribDeclaration; | |
4 import dmd.Expression; | |
5 import dmd.ScopeDsymbol; | |
6 import dmd.Dsymbol; | |
7 import dmd.Loc; | |
8 import dmd.Scope; | |
9 import dmd.OutBuffer; | |
10 import dmd.HdrGenState; | |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
11 import dmd.TOK; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
12 import dmd.WANT; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
13 import dmd.StringExp; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
14 import dmd.Parser; |
0 | 15 |
16 // Mixin declarations | |
17 | |
18 class CompileDeclaration : AttribDeclaration | |
19 { | |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
20 Expression exp; |
0 | 21 |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
22 ScopeDsymbol sd; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
23 int compiled; |
0 | 24 |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
25 this(Loc loc, Expression exp) |
0 | 26 { |
27 super(null); | |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
28 this.loc = loc; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
29 this.exp = exp; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
30 this.sd = null; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
31 this.compiled = 0; |
0 | 32 } |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
33 |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
34 Dsymbol syntaxCopy(Dsymbol s) |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
35 { |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
36 //printf("CompileDeclaration.syntaxCopy('%s')\n", toChars()); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
37 CompileDeclaration sc = new CompileDeclaration(loc, exp.syntaxCopy()); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
38 return sc; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
39 } |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
40 |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
41 bool addMember(Scope sc, ScopeDsymbol sd, int memnum) |
0 | 42 { |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
43 //printf("CompileDeclaration.addMember(sc = %p, memnum = %d)\n", sc, memnum); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
44 bool m = false; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
45 this.sd = sd; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
46 if (memnum == 0) |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
47 { /* No members yet, so parse the mixin now |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
48 */ |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
49 compileIt(sc); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
50 m |= AttribDeclaration.addMember(sc, sd, memnum); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
51 compiled = 1; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
52 } |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
53 return m; |
0 | 54 } |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
55 |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
56 void compileIt(Scope sc) |
0 | 57 { |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
58 //printf("CompileDeclaration.compileIt(loc = %d)\n", loc.linnum); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
59 exp = exp.semantic(sc); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
60 exp = resolveProperties(sc, exp); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
61 exp = exp.optimize(WANT.WANTvalue | WANT.WANTinterpret); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
62 if (exp.op != TOK.TOKstring) |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
63 { exp.error("argument to mixin must be a string, not (%s)", exp.toChars()); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
64 } |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
65 else |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
66 { |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
67 StringExp se = cast(StringExp)exp; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
68 se = se.toUTF8(sc); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
69 Parser p = new Parser(sc.module_, cast(ubyte *)se.string_, se.len, 0); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
70 p.loc = loc; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
71 p.nextToken(); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
72 decl = p.parseDeclDefs(0); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
73 if (p.token.value != TOK.TOKeof) |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
74 exp.error("incomplete mixin declaration (%s)", se.toChars()); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
75 } |
0 | 76 } |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
77 |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
78 void semantic(Scope sc) |
0 | 79 { |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
80 //printf("CompileDeclaration.semantic()\n"); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
81 |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
82 if (!compiled) |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
83 { |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
84 compileIt(sc); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
85 AttribDeclaration.addMember(sc, sd, 0); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
86 compiled = 1; |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
87 } |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
88 AttribDeclaration.semantic(sc); |
0 | 89 } |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
90 |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
91 void toCBuffer(OutBuffer buf, HdrGenState* hgs) |
0 | 92 { |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
93 buf.writestring("mixin("); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
94 exp.toCBuffer(buf, hgs); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
95 buf.writestring(");"); |
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
96 buf.writenl(); |
0 | 97 } |
18
f2413c9183d1
Implemented CompileDeclaration, UAddExp, UnionDeclaration.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
98 } |