0
|
1 module dmd.ConditionalDeclaration;
|
|
2
|
|
3 import dmd.AttribDeclaration;
|
|
4 import dmd.Condition;
|
|
5 import dmd.Array;
|
|
6 import dmd.Dsymbol;
|
|
7 import dmd.Scope;
|
|
8 import dmd.ScopeDsymbol;
|
|
9 import dmd.OutBuffer;
|
|
10 import dmd.HdrGenState;
|
|
11
|
|
12 class ConditionalDeclaration : AttribDeclaration
|
|
13 {
|
|
14 Condition condition;
|
|
15 Array elsedecl; // array of Dsymbol's for else block
|
|
16
|
|
17 this(Condition condition, Array decl, Array elsedecl)
|
|
18 {
|
|
19 super(decl);
|
|
20 //printf("ConditionalDeclaration::ConditionalDeclaration()\n");
|
|
21 this.condition = condition;
|
|
22 this.elsedecl = elsedecl;
|
|
23 }
|
|
24
|
|
25 Dsymbol syntaxCopy(Dsymbol s)
|
|
26 {
|
|
27 assert(false);
|
|
28 }
|
|
29
|
|
30 bool oneMember(Dsymbol* ps)
|
|
31 {
|
|
32 assert(false);
|
|
33 }
|
|
34
|
|
35 void emitComment(Scope sc)
|
|
36 {
|
|
37 assert(false);
|
|
38 }
|
|
39
|
|
40 // Decide if 'then' or 'else' code should be included
|
|
41
|
|
42 Array include(Scope sc, ScopeDsymbol sd)
|
|
43 {
|
|
44 //printf("ConditionalDeclaration::include()\n");
|
|
45 assert(condition);
|
|
46 return condition.include(sc, sd) ? decl : elsedecl;
|
|
47 }
|
|
48
|
|
49 void addComment(ubyte* comment)
|
|
50 {
|
|
51 /* Because addComment is called by the parser, if we called
|
|
52 * include() it would define a version before it was used.
|
|
53 * But it's no problem to drill down to both decl and elsedecl,
|
|
54 * so that's the workaround.
|
|
55 */
|
|
56
|
|
57 if (comment)
|
|
58 {
|
|
59 Array d = decl;
|
|
60
|
|
61 for (int j = 0; j < 2; j++)
|
|
62 {
|
|
63 if (d)
|
|
64 {
|
|
65 for (uint i = 0; i < d.dim; i++)
|
|
66 {
|
|
67 Dsymbol s = cast(Dsymbol)d.data[i];
|
|
68 //printf("ConditionalDeclaration::addComment %s\n", s->toChars());
|
|
69 s.addComment(comment);
|
|
70 }
|
|
71 }
|
|
72 d = elsedecl;
|
|
73 }
|
|
74 }
|
|
75 }
|
|
76
|
|
77 void toCBuffer(OutBuffer buf, HdrGenState* hgs)
|
|
78 {
|
|
79 assert(false);
|
|
80 }
|
|
81 } |