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