Mercurial > projects > ddmd
comparison dmd/StaticIfDeclaration.d @ 0:10317f0c89a5
Initial commit
author | korDen |
---|---|
date | Sat, 24 Oct 2009 08:42:06 +0400 |
parents | |
children | 427f8aa74d28 1628b221808d |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:10317f0c89a5 |
---|---|
1 module dmd.StaticIfDeclaration; | |
2 | |
3 import dmd.ConditionalDeclaration; | |
4 import dmd.ScopeDsymbol; | |
5 import dmd.AttribDeclaration; | |
6 import dmd.Scope; | |
7 import dmd.Condition; | |
8 import dmd.Array; | |
9 import dmd.Dsymbol; | |
10 | |
11 class StaticIfDeclaration : ConditionalDeclaration | |
12 { | |
13 ScopeDsymbol sd; | |
14 int addisdone; | |
15 | |
16 this(Condition condition, Array decl, Array elsedecl) | |
17 { | |
18 super(condition, decl, elsedecl); | |
19 //printf("StaticIfDeclaration::StaticIfDeclaration()\n"); | |
20 } | |
21 | |
22 Dsymbol syntaxCopy(Dsymbol s) | |
23 { | |
24 assert(false); | |
25 } | |
26 | |
27 bool addMember(Scope sc, ScopeDsymbol sd, int memnum) | |
28 { | |
29 //printf("StaticIfDeclaration.addMember() '%s'\n",toChars()); | |
30 /* This is deferred until semantic(), so that | |
31 * expressions in the condition can refer to declarations | |
32 * in the same scope, such as: | |
33 * | |
34 * template Foo(int i) | |
35 * { | |
36 * const int j = i + 1; | |
37 * static if (j == 3) | |
38 * const int k; | |
39 * } | |
40 */ | |
41 this.sd = sd; | |
42 bool m = false; | |
43 | |
44 if (memnum == 0) | |
45 { | |
46 m = AttribDeclaration.addMember(sc, sd, memnum); | |
47 addisdone = 1; | |
48 } | |
49 return m; | |
50 } | |
51 | |
52 void semantic(Scope sc) | |
53 { | |
54 Array d = include(sc, sd); | |
55 | |
56 //printf("\tStaticIfDeclaration.semantic '%s', d = %p\n",toChars(), d); | |
57 if (d) | |
58 { | |
59 if (!addisdone) | |
60 { | |
61 AttribDeclaration.addMember(sc, sd, 1); | |
62 addisdone = 1; | |
63 } | |
64 | |
65 for (uint i = 0; i < d.dim; i++) | |
66 { | |
67 Dsymbol s = cast(Dsymbol)d.data[i]; | |
68 | |
69 s.semantic(sc); | |
70 } | |
71 } | |
72 } | |
73 | |
74 string kind() | |
75 { | |
76 assert(false); | |
77 } | |
78 } |