Fix the checking for JsProperty override name clash
Change-Id: Iec0e0d524157fc639cd9e7e9af0c7a3ba6c532b7
Review-Link: https://gwt-review.googlesource.com/#/c/13994/
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 cff496e..fa3def1 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
@@ -16,7 +16,6 @@
package com.google.gwt.dev.jjs.ast;
import com.google.gwt.dev.common.InliningMode;
-import com.google.gwt.dev.javac.JsInteropUtil;
import com.google.gwt.dev.jjs.InternalCompilerException;
import com.google.gwt.dev.jjs.SourceInfo;
import com.google.gwt.dev.jjs.SourceOrigin;
@@ -24,6 +23,7 @@
import com.google.gwt.dev.jjs.impl.JjsUtils;
import com.google.gwt.dev.util.StringInterner;
import com.google.gwt.dev.util.collect.Lists;
+import com.google.gwt.thirdparty.guava.common.collect.Iterables;
import com.google.gwt.thirdparty.guava.common.collect.Sets;
import java.io.IOException;
@@ -76,11 +76,8 @@
@Override
public boolean canBeReferencedExternally() {
- if (exported || isJsFunctionMethod()) {
- return true;
- }
- for (JMethod overriddenMethod : getOverriddenMethods()) {
- if (overriddenMethod.exported || overriddenMethod.isJsFunctionMethod()) {
+ for (JMethod method : getOverriddenMethodsIncludingSelf()) {
+ if (method.exported || method.isJsFunctionMethod()) {
return true;
}
}
@@ -124,18 +121,12 @@
@Override
public String getJsName() {
- String jsMemberName = jsName;
- for (JMethod override : getOverriddenMethods()) {
- String jsMemberOverrideName = override.jsName;
- if (jsMemberOverrideName == null) {
- continue;
+ for (JMethod method : getOverriddenMethodsIncludingSelf()) {
+ if (method.jsName != null) {
+ return method.jsName;
}
- if (jsMemberName != null && !jsMemberName.equals(jsMemberOverrideName)) {
- return JsInteropUtil.INVALID_JSNAME;
- }
- jsMemberName = jsMemberOverrideName;
}
- return jsMemberName;
+ return null;
}
public boolean isJsConstructor() {
@@ -166,12 +157,9 @@
@Override
public JsMemberType getJsMemberType() {
- if (jsMemberType != JsMemberType.NONE) {
- return jsMemberType;
- }
- for (JMethod overriddenMethod : getOverriddenMethods()) {
- if (overriddenMethod.jsMemberType != JsMemberType.NONE) {
- return overriddenMethod.jsMemberType;
+ for (JMethod method : getOverriddenMethodsIncludingSelf()) {
+ if (method.jsMemberType != JsMemberType.NONE) {
+ return method.jsMemberType;
}
}
return JsMemberType.NONE;
@@ -182,11 +170,8 @@
}
public boolean isOrOverridesJsFunctionMethod() {
- if (isJsFunctionMethod()) {
- return true;
- }
- for (JMethod overriddenMethod : getOverriddenMethods()) {
- if (overriddenMethod.isJsFunctionMethod()) {
+ for (JMethod method : getOverriddenMethodsIncludingSelf()) {
+ if (method.isJsFunctionMethod()) {
return true;
}
}
@@ -522,6 +507,13 @@
}
/**
+ * Return all overridden methods including the method itself (where it is the first item).
+ */
+ private Iterable<JMethod> getOverriddenMethodsIncludingSelf() {
+ return Iterables.concat(Collections.singleton(this), overriddenMethods);
+ }
+
+ /**
* Returns the transitive closure of all the methods that override this method; caveat this
* list is only complete in monolithic compiles and should not be used in incremental compiles.
* The returned set is ordered in such a way that most specific overriding methods appear after
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 d54b64c..bc9cc5b 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
@@ -246,13 +246,10 @@
return;
}
- if (member.getJsName().equals(JsInteropUtil.INVALID_JSNAME)) {
- logInvalidName(member);
+ if (!checkJsPropertyAccessor(member)) {
return;
}
- checkJsPropertyAccessor(member);
-
checkMemberQualifiedJsName(member);
if (isCheckedLocalName(member)) {
@@ -340,21 +337,16 @@
}
}
- private void logInvalidName(JMember member) {
- if (member.getJsMemberType().isPropertyAccessor()) {
+ private boolean checkJsPropertyAccessor(JMember member) {
+ if (member.getJsName().equals(JsInteropUtil.INVALID_JSNAME)) {
+ assert member.getJsMemberType().isPropertyAccessor();
logError(
member,
"JsProperty %s should either follow Java Bean naming conventions or provide a name.",
getMemberDescription(member));
- } else {
- logError(
- member,
- "%s cannot be assigned a different JavaScript name than the method it overrides.",
- getMemberDescription(member));
+ return false;
}
- }
- private void checkJsPropertyAccessor(JMember member) {
if (member.getJsMemberType() == JsMemberType.UNDEFINED_ACCESSOR) {
logError(member, "JsProperty %s should have a correct setter or getter signature.",
getMemberDescription(member));
@@ -366,6 +358,7 @@
getMemberDescription(member));
}
}
+ return true;
}
private void checkMemberQualifiedJsName(JMember member) {
@@ -414,6 +407,7 @@
JsMember oldJsMember = oldAndNewJsMember.left;
JsMember newJsMember = oldAndNewJsMember.right;
+ checkNameConsistency(member);
checkJsPropertyConsistency(member, newJsMember);
if (oldJsMember == null || oldJsMember == newJsMember) {
@@ -460,6 +454,22 @@
}
}
+ private void checkNameConsistency(JMember member) {
+ if (member instanceof JMethod) {
+ String jsName = member.getJsName();
+ for (JMethod jMethod : ((JMethod) member).getOverriddenMethods()) {
+ String parentName = jMethod.getJsName();
+ if (parentName != null && !parentName.equals(jsName)) {
+ logError(
+ member,
+ "%s cannot be assigned a different JavaScript name than the method it overrides.",
+ getMemberDescription(member));
+ break;
+ }
+ }
+ }
+ }
+
private void checkStaticJsPropertyCalls() {
new JVisitor() {
@Override
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 63b6205..9e479b4 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
@@ -711,21 +711,18 @@
+ "cannot be assigned a different JavaScript name than the method it overrides.");
}
- // TODO(goktug): enable once the property names are handled.
- public void __disabled__testRenamedSuperclassJsPropertyFails() {
- addSnippetImport("jsinterop.annotations.JsType");
+ public void testRenamedSuperclassJsPropertyFails() {
addSnippetImport("jsinterop.annotations.JsProperty");
addSnippetClassDecl(
- "@JsType",
"public static class ParentBuggy {",
" @JsProperty public int getFoo() { return 0; }",
"}",
"public static class Buggy extends ParentBuggy {",
- " @JsProperty(name = \"bar\") public int getFoo() { return 0;}",
+ " @JsProperty(name = \"bar\") public int getFoo() { return 0; }",
"}");
- assertBuggyFails("'EntryPoint.Buggy.getFoo()I' cannot be exported because the method "
- + "overrides a method with different name.");
+ assertBuggyFails("Line 8: 'int EntryPoint.Buggy.getFoo()' "
+ + "cannot be assigned a different JavaScript name than the method it overrides.");
}
public void testJsPropertyDifferentFlavourInSubclassFails() {