view dmd/ConditionalStatement.d @ 114:e28b18c23469

added a module dmd.common for commonly used stuff it currently holds code for consistency checking of predefined versions also added a VisualD project file
author Trass3r
date Wed, 01 Sep 2010 18:21:58 +0200
parents 2e2a5c3f943a
children c77e9f4f1793
line wrap: on
line source

module dmd.ConditionalStatement;

import dmd.common;
import dmd.Statement;
import dmd.Condition;
import dmd.Loc;
import dmd.OutBuffer;
import dmd.Scope;
import dmd.HdrGenState;
import dmd.ArrayTypes;
import dmd.BE;

class ConditionalStatement : Statement
{
    Condition condition;
    Statement ifbody;
    Statement elsebody;

    this(Loc loc, Condition condition, Statement ifbody, Statement elsebody)
	{
		super(loc);
		this.condition = condition;
		this.ifbody = ifbody;
		this.elsebody = elsebody;
	}
	
    override Statement syntaxCopy()
	{
		Statement e = null;
		if (elsebody)
			e = elsebody.syntaxCopy();
		ConditionalStatement s = new ConditionalStatement(loc, condition.syntaxCopy(), ifbody.syntaxCopy(), e);
		return s;
	}
	
    override Statement semantic(Scope sc)
	{
		//printf("ConditionalStatement.semantic()\n");

		// If we can short-circuit evaluate the if statement, don't do the
		// semantic analysis of the skipped code.
		// This feature allows a limited form of conditional compilation.
		if (condition.include(sc, null))
		{
			ifbody = ifbody.semantic(sc);
			return ifbody;
		}
		else
		{
			if (elsebody)
				elsebody = elsebody.semantic(sc);
			return elsebody;
		}
	}
	
    override Statements flatten(Scope sc)
	{
		Statement s;

		if (condition.include(sc, null))
			s = ifbody;
		else
			s = elsebody;

		Statements a = new Statements();
		a.push(cast(void*)s);

		return a;
	}
	
    override bool usesEH()
	{
		assert(false);
	}
	
    override BE blockExit()
	{
		assert(false);
	}

    override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
	{
		assert(false);
	}
}