Mercurial > projects > ddmd
view dmd/StaticIfDeclaration.d @ 187:b0d41ff5e0df
Added expandability scheme outlined in http://www.dsource.org/forums/viewtopic.php?t=5659&sid=6f2150ff5b0bffcd47512a6a7608d218
author | Abscissa |
---|---|
date | Tue, 07 Jun 2011 23:37:34 -0400 |
parents | e3afd1303184 |
children |
line wrap: on
line source
module dmd.StaticIfDeclaration; import dmd.common; import dmd.ConditionalDeclaration; import dmd.ScopeDsymbol; import dmd.AttribDeclaration; import dmd.Scope; import dmd.Condition; import dmd.Array; import dmd.Dsymbol; import dmd.DDMDExtensions; class StaticIfDeclaration : ConditionalDeclaration { mixin insertMemberExtension!(typeof(this)); ScopeDsymbol sd; int addisdone; this(Condition condition, Dsymbols decl, Dsymbols elsedecl) { register(); super(condition, decl, elsedecl); //printf("StaticIfDeclaration::StaticIfDeclaration()\n"); } override Dsymbol syntaxCopy(Dsymbol s) { StaticIfDeclaration dd; assert(!s); dd = new StaticIfDeclaration(condition.syntaxCopy(), Dsymbol.arraySyntaxCopy(decl), Dsymbol.arraySyntaxCopy(elsedecl)); return dd; } override bool addMember(Scope sc, ScopeDsymbol sd, bool memnum) { //printf("StaticIfDeclaration.addMember() '%s'\n",toChars()); /* This is deferred until semantic(), so that * expressions in the condition can refer to declarations * in the same scope, such as: * * template Foo(int i) * { * const int j = i + 1; * static if (j == 3) * const int k; * } */ this.sd = sd; bool m = false; if (!memnum) { m = AttribDeclaration.addMember(sc, sd, memnum); addisdone = 1; } return m; } override void importAll(Scope sc) { // do not evaluate condition before semantic pass } override void setScope(Scope sc) { // do not evaluate condition before semantic pass } override void semantic(Scope sc) { auto d = include(sc, sd); //printf("\tStaticIfDeclaration.semantic '%s', d = %p\n",toChars(), d); if (d) { if (!addisdone) { AttribDeclaration.addMember(sc, sd, true); addisdone = 1; } foreach(Dsymbol s; d) s.semantic(sc); } } override string kind() { assert(false); } }