Reviewers: cromwellian, jbrosenberg,

Message:
Helps with my GwtAstBuilder work.



Please review this at http://gwt-code-reviews.appspot.com/1442802/

Affected files:
  M dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
  M dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
  M dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
  M dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniClassLiteral.java
  M dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniFieldRef.java
  M dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodRef.java
  M dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
M dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java


Index: dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java index 412198f762ef5c19656ce4045f34e5469a6b5306..9eb6b29bc397f56c71e7939ea8879551982b2c8c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
@@ -67,6 +67,17 @@ public class JField extends JVariable implements CanBeStatic, HasEnclosingType {
     }
   }

+ private static class ExternalSerializedNullField implements Serializable { + public static final ExternalSerializedNullField INSTANCE = new ExternalSerializedNullField();
+
+    private Object readResolve() {
+      return NULL_FIELD;
+    }
+  }
+
+ public static final JField NULL_FIELD = new JField(SourceOrigin.UNKNOWN, "nullField", null,
+      JNullType.INSTANCE, false, Disposition.FINAL);
+
   private final JDeclaredType enclosingType;
   private final boolean isCompileTimeConstant;
   private final boolean isStatic;
@@ -153,6 +164,8 @@ public class JField extends JVariable implements CanBeStatic, HasEnclosingType {
   protected Object writeReplace() {
     if (enclosingType != null && enclosingType.isExternal()) {
       return new ExternalSerializedForm(this);
+    } else if (this == NULL_FIELD) {
+      return ExternalSerializedNullField.INSTANCE;
     } else {
       return this;
     }
Index: dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java index 4b5172e341e89b35ec47f1b1032a16ab60f3f726..faa14bc4024ff4f6291e09d066c044d60979728f 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
@@ -55,8 +55,24 @@ public class JMethod extends JNode implements HasEnclosingType, HasName, HasType
     }
   }

+ private static class ExternalSerializedNullMethod implements Serializable { + public static final ExternalSerializedNullMethod INSTANCE = new ExternalSerializedNullMethod();
+
+    private Object readResolve() {
+      return NULL_METHOD;
+    }
+  }
+
+ public static final JMethod NULL_METHOD = new JMethod(SourceOrigin.UNKNOWN, "nullMethod", null,
+      JNullType.INSTANCE, false, false, true, false);
+
   private static final String TRACE_METHOD_WILDCARD = "*";

+  static {
+    NULL_METHOD.setSynthetic();
+    NULL_METHOD.freezeParamTypes();
+  }
+
   private static void trace(String title, String code) {
     System.out.println("---------------------------");
     System.out.println(title + ":");
@@ -352,6 +368,8 @@ public class JMethod extends JNode implements HasEnclosingType, HasName, HasType
   protected Object writeReplace() {
     if (enclosingType != null && enclosingType.isExternal()) {
       return new ExternalSerializedForm(this);
+    } else if (this == NULL_METHOD) {
+      return ExternalSerializedNullMethod.INSTANCE;
     } else {
       return this;
     }
Index: dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java index ca36e8564cdafcbeda229b08c799a5a36b4922e6..7af2bd8dd17ff66faa37b381f862f34cf13fd3d6 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JProgram.java
@@ -335,10 +335,6 @@ public class JProgram extends JNode {

private final Map<JMethod, JMethod> instanceToStaticMap = new IdentityHashMap<JMethod, JMethod>();

-  private JField nullField;
-
-  private JMethod nullMethod;
-
   private Map<JReferenceType, Integer> queryIds;

   /**
@@ -855,22 +851,11 @@ public class JProgram extends JNode {
   }

   public JField getNullField() {
-    if (nullField == null) {
-      nullField =
- new JField(createSourceInfoSynthetic(JProgram.class), "nullField", null,
-              JNullType.INSTANCE, false, Disposition.FINAL);
-    }
-    return nullField;
+    return JField.NULL_FIELD;
   }

   public JMethod getNullMethod() {
-    if (nullMethod == null) {
-      nullMethod =
- new JMethod(createSourceInfoSynthetic(JProgram.class), "nullMethod", null,
-              JNullType.INSTANCE, false, false, true, false);
-      nullMethod.setSynthetic();
-    }
-    return nullMethod;
+    return JMethod.NULL_METHOD;
   }

   public int getQueryId(JReferenceType elementType) {
Index: dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniClassLiteral.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniClassLiteral.java b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniClassLiteral.java index c26a92d723ba6633b5d4b585da27afa93db5bf41..b03273127fc25a3fcbcd0738ae375b3e2988d1da 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniClassLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniClassLiteral.java
@@ -28,6 +28,7 @@ public class JsniClassLiteral extends JClassLiteral {

   public JsniClassLiteral(SourceInfo info, String ident, JType type) {
     super(info, type);
+    assert ident != null;
     this.ident = ident;
   }

Index: dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniFieldRef.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniFieldRef.java b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniFieldRef.java index 862b9c361a719b3b4d2199e9a93be62cb349c8d3..35bbbba8134f0bfe8daef7096cc7fd36a5a73f29 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniFieldRef.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniFieldRef.java
@@ -34,6 +34,7 @@ public class JsniFieldRef extends JFieldRef {
public JsniFieldRef(SourceInfo info, String ident, JField field, JDeclaredType enclosingType,
       boolean isLvalue) {
super(info, field.isStatic() ? null : JNullLiteral.INSTANCE, field, enclosingType);
+    assert ident != null;
     this.ident = ident;
     this.isLvalue = isLvalue;
   }
Index: dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodRef.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodRef.java b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodRef.java index 189390b1a7e761c2cbbf87d53ace2fd2d0b959ce..b72ec33a9988d0a8396bfa9e5c1428aa0e44468a 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodRef.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/js/JsniMethodRef.java
@@ -35,6 +35,7 @@ public class JsniMethodRef extends JMethodCall {
public JsniMethodRef(SourceInfo info, String ident, JMethod method, JClassType jsoType) {
     // Just use a null literal as the qualifier on a non-static method
     super(info, method.isStatic() ? null : JNullLiteral.INSTANCE, method);
+    assert ident != null;
     this.ident = ident;
     this.jsoType = jsoType;
   }
Index: dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java index aa7b0a41d30d617a11ff22b8d057e0ad7b13e604..1d4519d98fabbf5813e46550ced87f6706e560d2 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GwtAstBuilder.java
@@ -249,6 +249,12 @@ public class GwtAstBuilder {
           SourceInfo info = x.getSourceInfo();
           if (binding == null) {
             assert ident.startsWith("@null::");
+            if ("@null::nullMethod()".equals(ident)) {
+              processMethod(x, info, JMethod.NULL_METHOD);
+            } else {
+              assert "@null::nullField".equals(ident);
+              processField(x, info, JField.NULL_FIELD, ctx);
+            }
           } else if (binding instanceof TypeBinding) {
             JType type = typeMap.get((TypeBinding) binding);
             processClassLiteral(x, info, type, ctx);
Index: dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java index a391c534027b123a2a4b78d2222ca44c5e1fb0f2..174f5266c1d7c40c1b9d6ba296a3446b17329688 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ImplementClassLiteralsAsFields.java
@@ -77,6 +77,19 @@ public class ImplementClassLiteralsAsFields {
     normalizerEvent.end();
   }

+  private static String createIdent(JMethod method) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(method.getEnclosingType().getName());
+    sb.append("::");
+    sb.append(method.getName());
+    sb.append('(');
+    for (JType type : method.getOriginalParamTypes()) {
+      sb.append(type.getJsniSignatureName());
+    }
+    sb.append(')');
+    return sb.toString();
+  }
+
   private static String getClassName(String fullName) {
     int pos = fullName.lastIndexOf(".");
     return fullName.substring(pos + 1);
@@ -223,8 +236,10 @@ public class ImplementClassLiteralsAsFields {
         if (valueOfMethod == null) {
throw new InternalCompilerException("Could not find enum valueOf() method");
         }
- call.addArg(new JsniMethodRef(info, null, valuesMethod, program.getJavaScriptObject())); - call.addArg(new JsniMethodRef(info, null, valueOfMethod, program.getJavaScriptObject())); + call.addArg(new JsniMethodRef(info, createIdent(valuesMethod), valuesMethod, program
+            .getJavaScriptObject()));
+ call.addArg(new JsniMethodRef(info, createIdent(valueOfMethod), valueOfMethod, program
+            .getJavaScriptObject()));
       } else if (isEnumOrSubclass) {
         // A subclass of an enum class
         call.addArg(JNullLiteral.INSTANCE);


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to