Mercurial > projects > ddmd
view dmd/StorageClassDeclaration.d @ 130:60bb0fe4563e
dmdfe 2.037 first main iteration
author | Eldar Insafutdinov <e.insafutdinov@gmail.com> |
---|---|
date | Thu, 09 Sep 2010 22:51:44 +0100 |
parents | e28b18c23469 |
children | 206db751bd4c |
line wrap: on
line source
module dmd.StorageClassDeclaration; import dmd.common; import dmd.AttribDeclaration; import dmd.Array; import dmd.TOK; import dmd.Token; import dmd.Scope; import dmd.Dsymbol; import dmd.OutBuffer; import dmd.HdrGenState; import dmd.STC; class StorageClassDeclaration: AttribDeclaration { STC stc; this(STC stc, Dsymbols decl) { super(decl); this.stc = stc; } override Dsymbol syntaxCopy(Dsymbol s) { StorageClassDeclaration scd; assert(!s); scd = new StorageClassDeclaration(stc, Dsymbol.arraySyntaxCopy(decl)); return scd; } override void setScope(Scope sc) { if (decl) { STC scstc = sc.stc; /* These sets of storage classes are mutually exclusive, * so choose the innermost or most recent one. */ if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest); if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared); if (stc & (STC.STCconst | STC.STCimmutable | STC.STCmanifest)) scstc &= ~(STC.STCconst | STC.STCimmutable | STC.STCmanifest); if (stc & (STC.STCgshared | STC.STCshared | STC.STCtls)) scstc &= ~(STC.STCgshared | STC.STCshared | STC.STCtls); if (stc & (STC.STCsafe | STC.STCtrusted | STC.STCsystem)) scstc &= ~(STC.STCsafe | STC.STCtrusted | STC.STCsystem); scstc |= stc; setScopeNewSc(sc, scstc, sc.linkage, sc.protection, sc.explicitProtection, sc.structalign); } } override void semantic(Scope sc) { if (decl) { STC scstc = sc.stc; /* These sets of storage classes are mutually exclusive, * so choose the innermost or most recent one. */ if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCextern | STC.STCmanifest); if (stc & (STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared)) scstc &= ~(STC.STCauto | STC.STCscope | STC.STCstatic | STC.STCtls | STC.STCmanifest | STC.STCgshared); if (stc & (STC.STCconst | STC.STCimmutable | STC.STCmanifest)) scstc &= ~(STC.STCconst | STC.STCimmutable | STC.STCmanifest); if (stc & (STC.STCgshared | STC.STCshared | STC.STCtls)) scstc &= ~(STC.STCgshared | STC.STCshared | STC.STCtls); if (stc & (STC.STCsafe | STC.STCtrusted | STC.STCsystem)) scstc &= ~(STC.STCsafe | STC.STCtrusted | STC.STCsystem); scstc |= stc; semanticNewSc(sc, scstc, sc.linkage, sc.protection, sc.explicitProtection, sc.structalign); } } override void toCBuffer(OutBuffer buf, HdrGenState* hgs) { assert(false); } static void stcToCBuffer(OutBuffer buf, int stc) { struct SCstring { int stc; TOK tok; }; static SCstring[] table = [ { STCauto, TOKauto }, { STCscope, TOKscope }, { STCstatic, TOKstatic }, { STCextern, TOKextern }, { STCconst, TOKconst }, { STCfinal, TOKfinal }, { STCabstract, TOKabstract }, { STCsynchronized, TOKsynchronized }, { STCdeprecated, TOKdeprecated }, { STCoverride, TOKoverride }, { STClazy, TOKlazy }, { STCalias, TOKalias }, { STCout, TOKout }, { STCin, TOKin }, /// version (DMDV2) { /// { STCimmutable, TOKimmutable }, /// { STCshared, TOKshared }, /// { STCnothrow, TOKnothrow }, /// { STCpure, TOKpure }, /// { STCref, TOKref }, /// { STCtls, TOKtls }, /// { STCgshared, TOKgshared }, /// { STCproperty, TOKat }, /// { STCsafe, TOKat }, /// { STCtrusted, TOKat }, /// } ]; for (int i = 0; i < table.length; i++) { if (stc & table[i].stc) { enum TOK tok = table[i].tok; if (tok == TOKat) { Identifier id; if (stc & STC.STCproperty) id = Id.property; else if (stc & STCsafe) id = Id.safe; else if (stc & STCtrusted) id = Id.trusted; else assert(0); buf.writestring(id.toChars()); } else buf.writestring(Token.toChars(tok)); buf.writeByte(' '); } } } }