Fixes type-tightening for JsType fields.
Change-Id: Iac41a0612aeb0e6a71112199409ec2744244dc4e
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
index dd5a834..641fa7c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
@@ -457,10 +457,9 @@
@Override
public void exit(JField x, Context ctx) {
- // TODO: we should also skip @JsType fields when we implement them.
if (program.codeGenTypes.contains(x.getEnclosingType())
- || x.isExported()) {
- // We cannot tighten this field as we don't know all callers.
+ || x.isExported() || x.isJsTypeMember()) {
+ // We cannot tighten this field as we don't see all references.
return;
}
if (!x.isVolatile()) {
diff --git a/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java b/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java
index 1088001..ba5c362 100644
--- a/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java
+++ b/user/test/com/google/gwt/core/client/interop/ConcreteJsType.java
@@ -47,4 +47,20 @@
protected int protectedField = 10;
int packageField = 10;
+
+ interface A {
+ int x();
+ }
+
+ public static class AImpl1 implements A {
+ @Override
+ public int x() { return 42; }
+ }
+
+ public static class AImpl2 implements A {
+ @Override
+ public int x() { return 101; }
+ }
+
+ public A notTypeTightenedField = new AImpl1();
}
diff --git a/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java b/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java
index fecc5c5..eb64663 100644
--- a/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsTypeArrayTest.java
@@ -67,7 +67,7 @@
}
// TODO(rluble): Needs fixes in ImlementCastsAndTypeChecks, ArrayNormalizer and maybe type oracle.
- public void __disabled__testJsTypeArray_asAField() {
+ public void testJsTypeArray_asAField() {
SimpleJsTypeAsAFieldHolder holder = new SimpleJsTypeAsAFieldHolder();
fillArrayField(holder);
SimpleJsTypeAsAField[] array = holder.arrayField;
diff --git a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
index 26d81cc..0ffd3b0 100644
--- a/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
+++ b/user/test/com/google/gwt/core/client/interop/JsTypeTest.java
@@ -100,6 +100,17 @@
== callIntFunction(concreteJsTypeSubclass, "publicMethod"));
}
+ public void testConcreteJsTypeNoTypeTightenField() {
+ // If we type-tighten, java side will see no calls and think that field could only AImpl1.
+ ConcreteJsType concreteJsType = new ConcreteJsType();
+ setTheField(concreteJsType, new ConcreteJsType.AImpl2());
+ assertEquals(101, concreteJsType.notTypeTightenedField.x());
+ }
+
+ private native void setTheField(ConcreteJsType obj, ConcreteJsType.A value)/*-{
+ obj.notTypeTightenedField = value;
+ }-*/;
+
public void testRevealedOverrideJsType() {
PlainParentType plainParentType = new PlainParentType();
RevealedOverrideSubType revealedOverrideSubType = new RevealedOverrideSubType();