Mercurial > projects > ddmd
comparison dmd/StaticIfCondition.d @ 0:10317f0c89a5
Initial commit
author | korDen |
---|---|
date | Sat, 24 Oct 2009 08:42:06 +0400 |
parents | |
children | 1628b221808d |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:10317f0c89a5 |
---|---|
1 module dmd.StaticIfCondition; | |
2 | |
3 import dmd.Expression; | |
4 import dmd.ScopeDsymbol; | |
5 import dmd.OutBuffer; | |
6 import dmd.Loc; | |
7 import dmd.Scope; | |
8 import dmd.Condition; | |
9 import dmd.HdrGenState; | |
10 import dmd.WANT; | |
11 import dmd.Util; | |
12 | |
13 class StaticIfCondition : Condition | |
14 { | |
15 Expression exp; | |
16 | |
17 this(Loc loc, Expression exp) | |
18 { | |
19 super(loc); | |
20 this.exp = exp; | |
21 } | |
22 | |
23 Condition syntaxCopy() | |
24 { | |
25 assert(false); | |
26 } | |
27 | |
28 bool include(Scope sc, ScopeDsymbol s) | |
29 { | |
30 static if (false) { | |
31 printf("StaticIfCondition.include(sc = %p, s = %p)\n", sc, s); | |
32 if (s) | |
33 { | |
34 printf("\ts = '%s', kind = %s\n", s.toChars(), s.kind()); | |
35 } | |
36 } | |
37 if (inc == 0) | |
38 { | |
39 if (!sc) | |
40 { | |
41 error(loc, "static if conditional cannot be at global scope"); | |
42 inc = 2; | |
43 return 0; | |
44 } | |
45 | |
46 sc = sc.push(sc.scopesym); | |
47 sc.sd = s; // s gets any addMember() | |
48 sc.flags |= SCOPE.SCOPEstaticif; | |
49 Expression e = exp.semantic(sc); | |
50 sc.pop(); | |
51 e = e.optimize(WANTvalue | WANTinterpret); | |
52 if (e.isBool(true)) | |
53 inc = 1; | |
54 else if (e.isBool(false)) | |
55 inc = 2; | |
56 else | |
57 { | |
58 e.error("expression %s is not constant or does not evaluate to a bool", e.toChars()); | |
59 inc = 2; | |
60 } | |
61 } | |
62 return (inc == 1); | |
63 } | |
64 | |
65 void toCBuffer(OutBuffer buf, HdrGenState* hgs) | |
66 { | |
67 assert(false); | |
68 } | |
69 } | |
70 |