ExpressionAnalyzer fix for clinit field refs.

Fixes a bug in ExpressionAnalyzer were clinit-triggering field refs were not being considered.  This could cause bugs in the inliner where clinits would be dropped.

Found by: spoon
Review by: spoon

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7310 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java
index d8c9904..18005f0 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ExpressionAnalyzer.java
@@ -130,6 +130,10 @@
       accessesFieldNonFinal = true;
     }
 
+    if (x.hasClinit()) {
+      recordMethodCall();
+    }
+
     JExpression instance = x.getInstance();
     if (instance == null) {
       return;
@@ -159,15 +163,7 @@
 
   @Override
   public void endVisit(JMethodCall x, Context ctx) {
-    /*
-     * We can't assume anything about method calls right now, except that it
-     * can't assign to one of our locals or one of our parameters. It's possible
-     * that it could read from a field, assign to a field or throw an exception
-     * that we can't see.
-     */
-    assignmentToField = true;
-    accessesField = true;
-    canThrowException = true;
+    recordMethodCall();
   }
 
   @Override
@@ -297,4 +293,19 @@
       assignmentToLocal = true;
     }
   }
+
+  /**
+   * We can't assume anything about method calls right now, except that it can't
+   * access any of our locals or parameters.
+   * 
+   * TODO: what about accessing arrays? Should be treated like field refs I
+   * guess.
+   */
+  private void recordMethodCall() {
+    assignmentToField = true;
+    accessesField = true;
+    accessesFieldNonFinal = true;
+    canThrowException = true;
+    createsObject = true;
+  }
 }
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java
index 47bc7b3..ee0252e 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/ExpressionAnalyzerTest.java
@@ -116,6 +116,22 @@
     analyzeExpression("int", "0").check();
   }
 
+  public void testFieldAccessClinit() throws Exception {
+    sourceOracle.addOrReplace(new MockJavaResource("test.Foo") {
+      @Override
+      protected CharSequence getContent() {
+        StringBuffer code = new StringBuffer();
+        code.append("package test;\n");
+        code.append("public class Foo {\n");
+        code.append("  static final boolean value = trueMethod();");
+        code.append("  static boolean trueMethod() { return true; }");
+        code.append("}\n");
+        return code;
+      }
+    });
+    analyzeExpression("boolean", "Foo.value").accessesFieldNonFinal().canThrowException().createsObject().hasAssignmentToField().check();
+  }
+
   public void testFieldAccessInstance() throws Exception {
     sourceOracle.addOrReplace(new MockJavaResource("test.Foo") {
       @Override