view dmd/StaticIfDeclaration.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children 427f8aa74d28 1628b221808d
line wrap: on
line source

module dmd.StaticIfDeclaration;

import dmd.ConditionalDeclaration;
import dmd.ScopeDsymbol;
import dmd.AttribDeclaration;
import dmd.Scope;
import dmd.Condition;
import dmd.Array;
import dmd.Dsymbol;

class StaticIfDeclaration : ConditionalDeclaration
{
    ScopeDsymbol sd;
    int addisdone;

    this(Condition condition, Array decl, Array elsedecl)
	{
		super(condition, decl, elsedecl);
		//printf("StaticIfDeclaration::StaticIfDeclaration()\n");
	}
	
    Dsymbol syntaxCopy(Dsymbol s)
	{
		assert(false);
	}

    bool addMember(Scope sc, ScopeDsymbol sd, int 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 == 0)
		{	
			m = AttribDeclaration.addMember(sc, sd, memnum);
			addisdone = 1;
		}
		return m;
	}
	
    void semantic(Scope sc)
	{
		Array d = include(sc, sd);

		//printf("\tStaticIfDeclaration.semantic '%s', d = %p\n",toChars(), d);
		if (d)
		{
			if (!addisdone)
			{   
				AttribDeclaration.addMember(sc, sd, 1);
				addisdone = 1;
			}

			for (uint i = 0; i < d.dim; i++)
			{
				Dsymbol s = cast(Dsymbol)d.data[i];

				s.semantic(sc);
			}
		}
	}

    string kind()
	{
		assert(false);
	}
}