Fix the JsFunction checks.
JsFunction was forbidden on hierachies in a previous
patch but was missing the check for the subclasses.
Change-Id: I160aceca984b2d0548a5fa4895f376e15a6c2198
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 80c8fd4..5c3c9e3 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
@@ -360,6 +360,10 @@
if (type.getSuperClass() != jprogram.getTypeJavaLangObject()) {
logError("JsFunction implementation '%s' cannot extend a class.", type);
}
+
+ if (!jprogram.typeOracle.getSubTypeNames(type.getName()).isEmpty()) {
+ logError("JsFunction implementation '%s' cannot be extended by other classes.", type);
+ }
}
private void logError(String format, JType type) {
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 8588dd9..2d801aa 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
@@ -848,6 +848,19 @@
assertBuggyFails("JsFunction implementation 'test.EntryPoint$Buggy' cannot extend a class.");
}
+ public void testJsFunctionImplementationWithSubclassesFails() throws Exception {
+ addAll(jsFunctionInterface);
+ addSnippetClassDecl(
+ "public static class BaseClass implements MyJsFunctionInterface {",
+ " public int foo(int x) { return 0; }",
+ "}",
+ "public static class Buggy extends BaseClass {",
+ "}");
+
+ assertBuggyFails("JsFunction implementation 'test.EntryPoint$BaseClass' cannot be extended by "
+ + "other classes.");
+ }
+
public void testJsFunctionImplementationMarkedAsJsTypeFails() throws Exception {
addAll(jsFunctionInterface);
addSnippetImport("com.google.gwt.core.client.js.JsType");