Do not show "unusable-by-js" warning for synthetic methods.
Also this CL adds "synthetic" flag for lamda/method reference
synthetics.
Bug: #9592
Bug-Link: https://github.com/gwtproject/gwt/issues/9592
Change-Id: I86c0c252bd41c45bc45320e9516ae7541c83733d
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 43138b0..fce0237 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
@@ -1251,6 +1251,7 @@
// method
JMethod samMethod = new JMethod(info, interfaceMethod.getName(), innerLambdaClass,
interfaceMethod.getType(), false, false, true, interfaceMethod.getAccess());
+ samMethod.setSynthetic();
// implements the SAM, e.g. Callback.onCallback(), Runnable.run(), etc
createLambdaSamMethod(x, interfaceMethod, info, innerLambdaClass, locals, outerField,
@@ -1850,6 +1851,8 @@
JMethod samMethod = new JMethod(info, interfaceMethod.getName(),
innerLambdaClass, interfaceMethod.getType(),
false, false, true, interfaceMethod.getAccess());
+ samMethod.setSynthetic();
+
for (JParameter origParam : interfaceMethod.getParams()) {
samMethod.cloneParameter(origParam);
}
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 02c86fb..f31c775 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
@@ -1014,13 +1014,22 @@
}
private void checkUnusableByJs(JMember member) {
- logIfUnusableByJs(member, member instanceof JField ? "Type of" : "Return type of", member);
-
if (member instanceof JMethod) {
- for (JParameter parameter : ((JMethod) member).getParams()) {
+ JMethod method = (JMethod) member;
+ if (method.isSynthetic() && !method.isSyntheticAccidentalOverride()) {
+ // Do not emit warnings for synthetic methods unless they are accidental overrides.
+ return;
+ }
+
+ logIfUnusableByJs(member, "Return type of", member);
+
+ for (JParameter parameter : method.getParams()) {
String prefix = String.format("Type of parameter '%s' in", parameter.getName());
logIfUnusableByJs(parameter, prefix, member);
}
+ } else {
+ // it's a field
+ logIfUnusableByJs(member, "Type of", 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 5db3102..9b8e8e7 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
@@ -2539,6 +2539,27 @@
+ " annotation to the corresponding member.");
}
+ public void testUnusableByJsSyntheticMembersSucceeds() throws Exception {
+ addSnippetImport("jsinterop.annotations.JsType");
+ addSnippetImport("jsinterop.annotations.JsFunction");
+ addSnippetClassDecl(
+ "@JsFunction",
+ "public interface I {",
+ " @SuppressWarnings(\"unusable-by-js\")",
+ " int m(long l);",
+ "}",
+ "@JsType public static class Buggy {",
+ " private void m() {",
+ " I l = e -> 42;",
+ " I mr = this::mr;",
+ " }",
+ " private int mr(long l) {",
+ " return 42;",
+ " }",
+ "}");
+ assertBuggySucceeds();
+ }
+
private static final MockJavaResource jsFunctionInterface = new MockJavaResource(
"test.MyJsFunctionInterface") {
@Override