| Index: compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java
 | 
| diff --git a/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java b/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java
 | 
| index eada1dc43ca7240265f9f00b1564682e25a171f0..00f462c0c001f8f5a8a991e9354f0df8a5e074d2 100644
 | 
| --- a/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java
 | 
| +++ b/compiler/javatests/com/google/dart/compiler/resolver/CompileTimeConstantTest.java
 | 
| @@ -6,32 +6,18 @@ package com.google.dart.compiler.resolver;
 | 
|  
 | 
|  import com.google.common.base.Joiner;
 | 
|  
 | 
| +
 | 
| +
 | 
|  /**
 | 
|   * Tests the code in {@link CompileTimeConstantVisitor}
 | 
|   */
 | 
| -public class CompileTimeConstantTest extends ResolverTestCase{
 | 
| -
 | 
| -  // TODO(zundel) This test should pass, but the compiler doesn't currently
 | 
| -  // recursively resolve types in CompileTimeConstVisitor
 | 
| -  public void disabledTestForwardLookupExpressions() {
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| -        "class Object {}",
 | 
| -        "class A {",
 | 
| -        "  static final value1 = value2 * 2;",
 | 
| -        "  static final value2 = value3 * 4;",
 | 
| -        "  static final value3 = 8;",
 | 
| -        "}"));
 | 
| -  }
 | 
| +public class CompileTimeConstantTest extends ResolverTestCase {
 | 
|  
 | 
| -  public void testConstantBinaryExpression() {
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantBinaryExpression1() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
|          " static final INT_LIT = 5;",
 | 
| -        " static final INT_LIT_REF = INT_LIT;",
 | 
| -        " static final DOUBLE_LIT = 1.5;",
 | 
| -        " static final BOOL_LIT = true;",
 | 
| -        " static final STRING_LIT = \"Hello\";",
 | 
|          " static final BOP1_0 = INT_LIT + 1;",
 | 
|          " static final BOP1_1 = 1 + INT_LIT;",
 | 
|          " static final BOP1_2 = INT_LIT - 1;",
 | 
| @@ -40,6 +26,87 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          " static final BOP1_5 = 1 * INT_LIT;",
 | 
|          " static final BOP1_6 = INT_LIT / 1;",
 | 
|          " static final BOP1_7 = 1 / INT_LIT;",
 | 
| +        "}"));
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantBinaryExpression10() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        "  static final INT_LIT = 5;",
 | 
| +        "  static final INT_LIT_REF = INT_LIT;",
 | 
| +        "  static final DOUBLE_LIT = 1.5;",
 | 
| +        "  static final BOOL_LIT = true;",
 | 
| +        "  // Multiple binary expresions",
 | 
| +        "  static final BOP1 = 1 * INT_LIT / 3 + INT_LIT + 9;",
 | 
| +        "  // Parenthized expression",
 | 
| +        "  static final BOP2 = ( 1 > 2 );",
 | 
| +        "  static final BOP3 = (1 * 2) + 3;",
 | 
| +        "  static final BOP4 = 3 + (1 * 2);",
 | 
| +        "}"));
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantBinaryExpression11() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        "  static final INT_LIT = 5;",
 | 
| +        "  static final DOUBLE_LIT = 1.5;",
 | 
| +        "  const A();",
 | 
| +        "  static final OBJECT_LIT = const A();",
 | 
| +        "  // Multiple binary expresions",
 | 
| +        "  static final BOP1_0 = 0 + 1 + OBJECT_LIT;",
 | 
| +        "  static final BOP1_1 = 0 + OBJECT_LIT + 1;",
 | 
| +        "  static final BOP1_2 = OBJECT_LIT + 3 + 9;",
 | 
| +        "}"),
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER);
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantBinaryExpression12() {
 | 
| +    // Multiple binary expressions
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        "  static final INT_LIT = 5;",
 | 
| +        "  static final DOUBLE_LIT = 1.5;",
 | 
| +        "  const A();",
 | 
| +        "  static final OBJECT_LIT = new A();",
 | 
| +        "  static final PP0 = 0 - (1 + OBJECT_LIT);",
 | 
| +        "  static final PP1 = 0 + (OBJECT_LIT + 1);",
 | 
| +        "  static final PP2 = (OBJECT_LIT + 3) + 9;",
 | 
| +        "  static final PP3 = (OBJECT_LIT) + 3 + 9;",
 | 
| +        "  static final PP4 = (OBJECT_LIT + 3 + 9);",
 | 
| +        "  static final PP5 = OBJECT_LIT + (3 + 9);",
 | 
| +        "}"),
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER);
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantBinaryExpression2() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        " static final DOUBLE_LIT = 1.5;",
 | 
|          " static final BOP2_0 = DOUBLE_LIT + 1.5;",
 | 
|          " static final BOP2_1 = 1.5 + DOUBLE_LIT;",
 | 
|          " static final BOP2_2 = DOUBLE_LIT - 1.5;",
 | 
| @@ -48,10 +115,25 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          " static final BOP2_5 = 1.5 * DOUBLE_LIT;",
 | 
|          " static final BOP2_6 = DOUBLE_LIT / 1.5;",
 | 
|          " static final BOP2_7 = 1.5 / DOUBLE_LIT;",
 | 
| +        "}"));
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantBinaryExpression3() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        " static final INT_LIT = 5;",
 | 
|          " static final BOP3_0 = 2 < INT_LIT;",
 | 
|          " static final BOP3_1 = INT_LIT < 2;",
 | 
|          " static final BOP3_2 = 2 > INT_LIT;",
 | 
|          " static final BOP3_3 = INT_LIT > 2;",
 | 
| +        "}"));
 | 
| +
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        " static final INT_LIT = 5;",
 | 
| +        " static final DOUBLE_LIT = 1.5;",
 | 
|          " static final BOP3_4 = 2 < DOUBLE_LIT;",
 | 
|          " static final BOP3_5 = DOUBLE_LIT < 2;",
 | 
|          " static final BOP3_6 = 2 > DOUBLE_LIT;",
 | 
| @@ -64,6 +146,18 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          " static final BOP3_13 = DOUBLE_LIT <= 2.0;",
 | 
|          " static final BOP3_14 = 2.0 >= DOUBLE_LIT;",
 | 
|          " static final BOP3_15 = DOUBLE_LIT >= 2;",
 | 
| +        "}"));
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantBinaryExpression4() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        " static final INT_LIT = 5;",
 | 
| +        " static final INT_LIT_REF = INT_LIT;",
 | 
| +        " static final DOUBLE_LIT = 1.5;",
 | 
| +        " static final BOOL_LIT = true;",
 | 
| +        " static final STRING_LIT = \"Hello\";",
 | 
|          " static final BOP4_0 = 5 % INT_LIT;",
 | 
|          " static final BOP4_1 = INT_LIT % 5;",
 | 
|          " static final BOP4_2 = 5.0 % DOUBLE_LIT;",
 | 
| @@ -81,8 +175,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          " static final BOP10 = INT_LIT === INT_LIT_REF;",
 | 
|          " static final BOP11 = BOOL_LIT !== true;",
 | 
|          "}"));
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantBinaryExpression5() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class int {}",
 | 
|          "class A {",
 | 
| @@ -96,8 +192,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER);
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantBinaryExpression6() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class int {}",
 | 
|          "class String {}",
 | 
| @@ -108,19 +206,19 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "class B {",
 | 
|          " static final BOP1 = 2 < A.foo();",
 | 
|          " static final BOP2 = A.foo() < 2;",
 | 
| -        " static final BOP3 = 2 < A.bar();",
 | 
| -        " static final BOP4 = A.bar() < 2;",
 | 
| +        " static final BOP3 = A.foo();",
 | 
| +        " static final BOP4 = A.bar();",
 | 
|          "}"),
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER);
 | 
| +        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantBinaryExpression7() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class int {}",
 | 
|          "class double {}",
 | 
| @@ -131,8 +229,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "}"),
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_INT,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_INT);
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantBinaryExpression8() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class bool {}",
 | 
|          "class int {}",
 | 
| @@ -153,8 +253,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_BOOLEAN,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_BOOLEAN);
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantBinaryExpression9() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class bool {}",
 | 
|          "class int {}",
 | 
| @@ -181,73 +283,11 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_STRING_NUMBER_BOOL,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_STRING_NUMBER_BOOL,
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_STRING_NUMBER_BOOL);
 | 
| -
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| -        "class Object {}",
 | 
| -        "class A {",
 | 
| -        "  static final INT_LIT = 5;",
 | 
| -        "  static final INT_LIT_REF = INT_LIT;",
 | 
| -        "  static final DOUBLE_LIT = 1.5;",
 | 
| -        "  static final BOOL_LIT = true;",
 | 
| -        "  // Multiple binary expresions",
 | 
| -        "  static final BOP1 = 1 * INT_LIT / 3 + INT_LIT + 9;",
 | 
| -        "  // Parenthized expression",
 | 
| -        "  static final BOP2 = ( 1 > 2 );",
 | 
| -        "  static final BOP3 = (1 * 2) + 3;",
 | 
| -        "  static final BOP4 = 3 + (1 * 2);",
 | 
| -        "}"));
 | 
| -
 | 
| -    // Negative Tests
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| -        "class Object {}",
 | 
| -        "class A {",
 | 
| -        "  static final INT_LIT = 5;",
 | 
| -        "  static final DOUBLE_LIT = 1.5;",
 | 
| -        "  const A();",
 | 
| -        "  static final OBJECT_LIT = const A();",
 | 
| -        "  // Multiple binary expresions",
 | 
| -        "  static final BOP1_0 = 0 + 1 + OBJECT_LIT;",
 | 
| -        "  static final BOP1_1 = 0 + OBJECT_LIT + 1;",
 | 
| -        "  static final BOP1_2 = OBJECT_LIT + 3 + 9;",
 | 
| -        "}"),
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER);
 | 
| -
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| -        "class Object {}",
 | 
| -        "class A {",
 | 
| -        "  static final INT_LIT = 5;",
 | 
| -        "  static final DOUBLE_LIT = 1.5;",
 | 
| -        "  const A();",
 | 
| -        "  static final OBJECT_LIT = new A();",
 | 
| -        "  // Multiple binary expresions",
 | 
| -        "  static final PP0 = 0 - (1 + OBJECT_LIT);",
 | 
| -        "  static final PP1 = 0 + (OBJECT_LIT + 1);",
 | 
| -        "  static final PP2 = (OBJECT_LIT + 3) + 9;",
 | 
| -        "  static final PP3 = (OBJECT_LIT) + 3 + 9;",
 | 
| -        "  static final PP4 = (OBJECT_LIT + 3 + 9);",
 | 
| -        "  static final PP5 = OBJECT_LIT + (3 + 9);",
 | 
| -        "}"),
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER,
 | 
| -        ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_NUMBER);
 | 
|    }
 | 
|  
 | 
| -  public void testConstantConstructorAssign() {
 | 
| +  public void testConstantConstructorAssign1() {
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
|          "  const A();",
 | 
| @@ -255,9 +295,11 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "class B {",
 | 
|          "  static final a = const A();", // Constant constructor
 | 
|          "}"));
 | 
| +  }
 | 
|  
 | 
| +  public void testConstantConstructorAssign2() {
 | 
|      // Negative tests
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
|          "  const A();",
 | 
| @@ -266,9 +308,8 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
|    }
 | 
|  
 | 
| -  public void testConstantLiteralAssign() {
 | 
| -
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantLiteralAssign1() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
|          "  static final b = true;",
 | 
| @@ -278,9 +319,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "  static final h = 0xf;", // hex literal
 | 
|          "  static final n = null;", // null
 | 
|          "}"));
 | 
| +  }
 | 
|  
 | 
| -    // Negative tests
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantLiteralAssign2() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
|          "  foo() { return \"Eve\";}",
 | 
| @@ -290,8 +332,8 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
|    }
 | 
|  
 | 
| -  public void testConstantTypedLiteralAssign() {
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantTypedLiteralAssign1() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class List<T> {}",
 | 
|          "class Map<K,V> {}",
 | 
| @@ -300,9 +342,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "  static final map = const { \"1\": \"one\", \"2\": \"banana\" };", // map literal
 | 
|          "  static final val = aList[2];",
 | 
|          "}"));
 | 
| +  }
 | 
|  
 | 
| -    // Negative tests, on literals that are not compile time constants.
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantTypedLiteralAssign2() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class List<T> {}",
 | 
|          "class A {",
 | 
| @@ -310,8 +353,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "  static final aList= [1, 2, 3];",
 | 
|          "}"),
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantTypedLiteralAssign3() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class List<T> {}",
 | 
|          "class A {",
 | 
| @@ -320,8 +365,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "  static final aList = const [foo(), 2, 3];",
 | 
|          "}"),
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantTypedLiteralAssign4() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class Map<K,V> {}",
 | 
|          "class A {",
 | 
| @@ -329,8 +376,9 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "  static final aMap = { \"1\": \"one\", \"2\": \"banana\" };",
 | 
|          "}"),
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
| -
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  }
 | 
| +  public void testConstantTypedLiteralAssign5() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class String {}",
 | 
|          "class Map<K,V> {}",
 | 
| @@ -345,22 +393,38 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
|    }
 | 
|  
 | 
| -  public void testConstantUnaryExpression() {
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantUnaryExpression1() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
| -        "  // Unary expression",
 | 
|          "  static final BOOL_LIT = true;",
 | 
| -        "  static final INT_LIT = 123;",
 | 
| -        "  static final DOUBLE_LIT = 12.3;",
 | 
|          "  static final UOP1_0 = !BOOL_LIT;",
 | 
|          "  static final UOP1_1 = BOOL_LIT || !true;",
 | 
|          "  static final UOP1_2 = !BOOL_LIT || true;",
 | 
|          "  static final UOP1_3 = !(BOOL_LIT && true);",
 | 
| +        "}"));
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantUnaryExpression2() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        "  static final BOOL_LIT = true;",
 | 
| +        "  static final INT_LIT = 123;",
 | 
| +        "  static final DOUBLE_LIT = 12.3;",
 | 
|          "  static final UOP2_0 = ~0xf0;",
 | 
|          "  static final UOP2_1 = ~INT_LIT;",
 | 
|          "  static final UOP2_2 = ~INT_LIT & 123;",
 | 
|          "  static final UOP2_3 = ~(INT_LIT | 0xff);",
 | 
| +        "}"));
 | 
| +  }
 | 
| +
 | 
| +  public void testConstantUnaryExpression3() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
| +        "class Object {}",
 | 
| +        "class A {",
 | 
| +        "  static final INT_LIT = 123;",
 | 
| +        "  static final DOUBLE_LIT = 12.3;",
 | 
|          "  static final UOP3_0 = -0xf0;",
 | 
|          "  static final UOP3_1 = -INT_LIT;",
 | 
|          "  static final UOP3_2 = -INT_LIT + 123;",
 | 
| @@ -370,8 +434,10 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "  static final UOP3_6 = -DOUBLE_LIT + 123;",
 | 
|          "  static final UOP3_7 = -(DOUBLE_LIT * 0xff);",
 | 
|          "}"));
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantUnaryExpression4() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class int {}",
 | 
|          "class A {",
 | 
| @@ -391,8 +457,8 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION_BOOLEAN);
 | 
|    }
 | 
|  
 | 
| -  public void testConstantVariableAssign() {
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantVariableAssign1() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
|          "  static final a = 1;",
 | 
| @@ -402,21 +468,35 @@ public class CompileTimeConstantTest extends ResolverTestCase{
 | 
|          "  static final j = i;", // variable that is a compile-time constant
 | 
|          "  static final k = A.a;", // variable that is a compile-time constant
 | 
|          "}"));
 | 
| +  }
 | 
|  
 | 
| -    // Negative tests
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantVariableAssign2() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
|          " static foo() {return 1;}",
 | 
|          " static final i = foo();",  // Error: not a constant integer
 | 
|          "}"),
 | 
|          ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION);
 | 
| +  }
 | 
|  
 | 
| -    resolveAndTest(Joiner.on("\n").join(
 | 
| +  public void testConstantVariableAssign3() {
 | 
| +      // Part of the regular resolver pass
 | 
| +      resolveAndTest(Joiner.on("\n").join(
 | 
| +          "class Object {}",
 | 
| +          "class A {",
 | 
| +          "  static final foo;",
 | 
| +          "}"),
 | 
| +          ResolverErrorCode.STATIC_FINAL_REQUIRES_VALUE);
 | 
| +  }
 | 
| +
 | 
| +  public void testForwardLookupExpressions() {
 | 
| +    resolveAndTestCtConst(Joiner.on("\n").join(
 | 
|          "class Object {}",
 | 
|          "class A {",
 | 
| -        "  static final foo;",
 | 
| -        "}"),
 | 
| -        ResolverErrorCode.STATIC_FINAL_REQUIRES_VALUE);
 | 
| +        "  static final value1 = value2 * 2;",
 | 
| +        "  static final value2 = value3 * 4;",
 | 
| +        "  static final value3 = 8;",
 | 
| +        "}"));
 | 
|    }
 | 
|  }
 | 
| 
 |