diff dmd/CaseRangeStatement.d @ 64:4290d870944a

More fixes
author korDen
date Mon, 23 Aug 2010 20:29:15 +0400
parents b7d29f613539
children 2e2a5c3f943a
line wrap: on
line diff
--- a/dmd/CaseRangeStatement.d	Mon Aug 23 16:52:24 2010 +0400
+++ b/dmd/CaseRangeStatement.d	Mon Aug 23 20:29:15 2010 +0400
@@ -1,10 +1,17 @@
 module dmd.CaseRangeStatement;
 
 import dmd.Statement;
+import dmd.ArrayTypes;
 import dmd.Expression;
+import dmd.ExpStatement;
+import dmd.IntegerExp;
+import dmd.CaseStatement;
+import dmd.CompoundStatement;
 import dmd.Statement;
 import dmd.Loc;
 import dmd.OutBuffer;
+import dmd.WANT;
+import dmd.SwitchStatement;
 import dmd.HdrGenState;
 import dmd.Scope;
 
@@ -29,11 +36,60 @@
 	
     Statement semantic(Scope sc)
 	{
-		assert(false);
+		SwitchStatement sw = sc.sw;
+
+		//printf("CaseRangeStatement.semantic() %s\n", toChars());
+		if (sw.isFinal)
+			error("case ranges not allowed in final switch");
+
+		first = first.semantic(sc);
+		first = first.implicitCastTo(sc, sw.condition.type);
+		first = first.optimize(WANTvalue | WANTinterpret);
+		long fval = first.toInteger();
+
+		last = last.semantic(sc);
+		last = last.implicitCastTo(sc, sw.condition.type);
+		last = last.optimize(WANTvalue | WANTinterpret);
+		long lval = last.toInteger();
+
+		if (lval - fval > 256)
+		{	
+			error("more than 256 cases in case range");
+			lval = fval + 256;
+		}
+
+		/* This works by replacing the CaseRange with an array of Case's.
+		 *
+		 * case a: .. case b: s;
+		 *    =>
+		 * case a:
+		 *   [...]
+		 * case b:
+		 *   s;
+		 */
+
+		Statements statements = new Statements();
+		for (long i = fval; i <= lval; i++)
+		{
+			Statement s = statement;
+			if (i != lval)
+				s = new ExpStatement(loc, null);
+			Expression e = new IntegerExp(loc, i, first.type);
+			Statement cs = new CaseStatement(loc, e, s);
+			statements.push(cast(void*)cs);
+		}
+		Statement s = new CompoundStatement(loc, statements);
+		s = s.semantic(sc);
+		return s;
 	}
 	
     void toCBuffer(OutBuffer buf, HdrGenState* hgs)
 	{
-		assert(false);
+		buf.writestring("case ");
+		first.toCBuffer(buf, hgs);
+		buf.writestring(": .. case ");
+		last.toCBuffer(buf, hgs);
+		buf.writenl();
+		statement.toCBuffer(buf, hgs);
 	}
 }
\ No newline at end of file