Improve JsInterop error messages on native type fieds. Change-Id: I1fecf2f732a9b80b2d6d92b031fa1c41738fbdc6
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java index 08cce1c..f204bd0 100644 --- a/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java +++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java
@@ -413,7 +413,10 @@ break; case PROPERTY: JField field = (JField) member; - if (field.hasInitializer()) { + if (field.isFinal()) { + logError(member, "Native JsType field %s cannot be final.", + getMemberDescription(member)); + } else if (field.hasInitializer()) { logError(member, "Native JsType field %s cannot have initializer.", getMemberDescription(member)); }
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java index e4363b7..f7991aa 100644 --- a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java +++ b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
@@ -1763,8 +1763,15 @@ "@JsType(isNative=true) public static final class FinalType {", " @JsOverlay public void n() { }", "}", + "@JsType(isNative=true) public interface NativeInterface {", + " @JsOverlay public static Object object = new Object();", + " @JsOverlay public static final Object other = new Object();", + " @JsOverlay public Object another = new Object();", + " @JsOverlay public final Object yetAnother = new Object();", + "}", "@JsType(isNative=true) public static class Buggy {", " @JsOverlay public static Object object = new Object();", + " @JsOverlay public static final Object other = new Object();", " @JsOverlay public static void m() { }", " @JsOverlay public static void m(int x) { }", " @JsOverlay private static void m(boolean x) { }", @@ -2029,7 +2036,9 @@ "}", "@JsType(isNative=true) static class Buggy {", " public static final int s = 42;", - " public int f = 42;", + " public static int t = 42;", + " public final int f = 42;", + " public int g = 42;", " @JsIgnore public Buggy() { }", " @JsIgnore public int x;", " @JsIgnore public native void n();", @@ -2052,19 +2061,21 @@ assertBuggyFails( "Line 7: Native JsType member 'void EntryPoint.Interface.n()' cannot have @JsIgnore.", "Line 9: Native JsType 'EntryPoint.Buggy' cannot have initializer.", - "Line 10: Native JsType field 'int EntryPoint.Buggy.s' cannot have initializer.", - "Line 11: Native JsType field 'int EntryPoint.Buggy.f' cannot have initializer.", - "Line 12: Native JsType member 'EntryPoint.Buggy.EntryPoint$Buggy()' " + "Line 10: Native JsType field 'int EntryPoint.Buggy.s' cannot be final.", + "Line 11: Native JsType field 'int EntryPoint.Buggy.t' cannot have initializer.", + "Line 12: Native JsType field 'int EntryPoint.Buggy.f' cannot be final.", + "Line 13: Native JsType field 'int EntryPoint.Buggy.g' cannot have initializer.", + "Line 14: Native JsType member 'EntryPoint.Buggy.EntryPoint$Buggy()' " + "cannot have @JsIgnore.", - "Line 13: Native JsType member 'int EntryPoint.Buggy.x' cannot have @JsIgnore.", - "Line 14: Native JsType member 'void EntryPoint.Buggy.n()' cannot have @JsIgnore.", - "Line 15: Native JsType method 'void EntryPoint.Buggy.o()' should be native or abstract.", - "Line 16: JSNI method 'void EntryPoint.Buggy.p()' is not allowed in a native JsType.", - "Line 21: 'int EntryPoint.SomeClass.hashCode()' cannot be assigned a different JavaScript" + "Line 15: Native JsType member 'int EntryPoint.Buggy.x' cannot have @JsIgnore.", + "Line 16: Native JsType member 'void EntryPoint.Buggy.n()' cannot have @JsIgnore.", + "Line 17: Native JsType method 'void EntryPoint.Buggy.o()' should be native or abstract.", + "Line 18: JSNI method 'void EntryPoint.Buggy.p()' is not allowed in a native JsType.", + "Line 23: 'int EntryPoint.SomeClass.hashCode()' cannot be assigned a different JavaScript" + " name than the method it overrides.", - "Line 24: Native JsType subclass 'EntryPoint.SomeClass2' can not implement interface " + "Line 26: Native JsType subclass 'EntryPoint.SomeClass2' can not implement interface " + "'EntryPoint.B' that declares method 'hashCode' inherited from java.lang.Object.", - "Line 27: 'int EntryPoint.NativeTypeWithHashCode.hashCode()' " + "Line 29: 'int EntryPoint.NativeTypeWithHashCode.hashCode()' " + "(exposed by 'EntryPoint.SomeClass3') cannot be assigned a different JavaScript name" + " than the method it overrides."); }