Removes unsafeLong conversion.

This change pushes sort type conversion to comparator fn itself which
avoids explicit object to long conversion but also should help
performance of sorting in development mode.

Change-Id: I47fb378e2793bc10c248fde43a38b51f7b2c8f64
diff --git a/user/BUILD b/user/BUILD
index 25a7416..591231c 100644
--- a/user/BUILD
+++ b/user/BUILD
@@ -45,6 +45,10 @@
 java_library(
     name = "gwt-javaemul-annotations",
     srcs = glob(["super/com/google/gwt/emul/javaemul/internal/annotations/*.java"]),
+    compatible_with = [
+        "//buildenv/target:android",
+        "//buildenv/target:appengine",
+    ],
 )
 
 # The classes in gwt-user.jar that GWT applications can depend on.
@@ -95,11 +99,8 @@
     ),
     compatible_with = ["//buildenv/target:appengine"],
     javacopts = [
+        "-Xep:FutureReturnValueIgnored:OFF",
         "-Xep:MissingCasesInEnumSwitch:OFF",
-        "-Xep:SelfComparison:OFF",
-        "-Xep:SelfEquals:OFF",
-        "-Xep:FallThrough:OFF",
-        "-Xep:ReturnValueIgnored:OFF",
         "-Xep:EqualsIncompatibleType:OFF",
     ],
     plugins = [
@@ -140,14 +141,7 @@
         "src/com/google/gwt/user/server/Base64Utils.java",
     ],
     compatible_with = ["//buildenv/target:appengine"],
-    javacopts = [
-        "-Xep:MissingCasesInEnumSwitch:OFF",
-        "-Xep:SelfComparison:OFF",
-        "-Xep:SelfEquals:OFF",
-        "-Xep:FallThrough:OFF",
-        "-Xep:ReturnValueIgnored:OFF",
-        "-Xep:EqualsIncompatibleType:OFF",
-    ],
+    javacopts = ["-Xep:MissingCasesInEnumSwitch:OFF"],
     deps = [
         "//third_party/java_src/gwt/svn/trunk/dev:requestfactory-apt-deps",
     ],
@@ -412,6 +406,8 @@
             "src/com/google/gwt/i18n/rebind/keygen/*.java",
             "super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java",
             "super/com/google/gwt/emul/javaemul/internal/ArrayStamper.java",
+            "super/com/google/gwt/emul/javaemul/internal/JsUtils.java",
+            "super/com/google/gwt/emul/javaemul/internal/NativeArray.java",
             # And it's also sensible to want for serialization:
             "src/com/google/gwt/user/client/ui/SuggestOracle.java",
         ],
@@ -421,17 +417,17 @@
         ] + DTO_SRCS + JVM_REGEXP_SRCS,
     ),
     compatible_with = ["//buildenv/target:appengine"],
+    javacopts = ["-Xep:EqualsIncompatibleType:OFF"],
     deps = [
         ":gwt-dto-serializers",
+        ":gwt-javaemul-annotations",
+        ":gwt-jsinterop-annotations",
         ":jvm_regexp",
         "//third_party/java/servlet/servlet_api",
         "//third_party/java_src/gwt/svn/tools:servlet_deps",
         "//third_party/java_src/gwt/svn/trunk/dev:compiler.standalone.super",
         "//third_party/java_src/gwt/svn/trunk/dev:servlet-deps",
     ],
-    javacopts = [
-        "-Xep:EqualsIncompatibleType:OFF",
-    ]
 )
 
 # The minimum requirements for GWT-RPC serializable object definition.
@@ -455,6 +451,13 @@
     gwtxml = "Gwt-dto-serializers.gwt.xml",
 )
 
+# GWT pluggable type annotations in a separate library.
+java_library(
+    name = "gwt-safehtml-pluggabletypes",
+    srcs = glob(["src/com/google/gwt/safehtml/shared/annotations/Is*.java"]),
+    compatible_with = ["//buildenv/target:appengine"],
+)
+
 # Creates gwt-testing.jar, which contains GWTTestCase and its infrastructure.
 # (The jar depends on gwt-user.jar but the dependency isn't declared.
 # Instead we assume it will be added by a wrapper rule.)
@@ -544,16 +547,14 @@
         "//third_party/java_src/gwt/svn/trunk/dev:dev-test-code",
     ],
     javacopts = [
+        "-Xep:CheckReturnValue:OFF",
+        "-Xep:ReturnValueIgnored:OFF",
         "-Xep:SelfComparison:OFF",  # go/self-comparison-lsc
         "-Xep:SelfEquals:OFF",  # go/self-equals-lsc
         "-Xep:IdentityBinaryExpression:OFF",
         "-Xep:LoopConditionChecker:OFF",
-        "-Xep:CollectionIncompatibleType:OFF",
-        "-Xep:MissingCasesInEnumSwitch:OFF",
-        "-Xep:FallThrough:OFF",
-        "-Xep:ReturnValueIgnored:OFF",
-        "-Xep:JUnit3TestNotRun:OFF",
         "-Xep:EqualsIncompatibleType:OFF",
+        "-Xep:LogicalAssignment:OFF",
     ],
     deps = [
         "//third_party/java/jsr305_annotations",
@@ -686,7 +687,7 @@
 
 filegroup(
     name = "java_emul_internal",
-    srcs = glob(["super/com/google/gwt/emul/javaemul/**/*.java"]),
+    srcs = glob(["super/com/google/gwt/emul/javaemul/internal/*.java"]),
     visibility = ["//third_party/java_src/j2cl:__subpackages__"],
 )
 
diff --git a/user/super/com/google/gwt/emul/java/util/Arrays.java b/user/super/com/google/gwt/emul/java/util/Arrays.java
index a8ed4ce..53a927f 100644
--- a/user/super/com/google/gwt/emul/java/util/Arrays.java
+++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -44,6 +44,8 @@
 import javaemul.internal.JsUtils;
 import javaemul.internal.NativeArray.CompareFunction;
 
+import jsinterop.annotations.JsFunction;
+
 /**
  * Utility methods related to native arrays.
  * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html">
@@ -1757,16 +1759,27 @@
     nativeSort(array, fromIndex, toIndex, getIntComparator());
   }
 
+  @JsFunction
+  private interface CompareDoubleFunction {
+    double compare(double d1, double d2);
+  }
+
   private static CompareFunction getIntComparator() {
-    return (a, b) -> JsUtils.unsafeCastToDouble(a) - JsUtils.unsafeCastToDouble(b);
+    return JsUtils.uncheckedCast((CompareDoubleFunction) (a, b) -> a - b);
   }
 
   private static CompareFunction getDoubleComparator() {
-    return (a, b) -> Double.compare(JsUtils.unsafeCastToDouble(a), JsUtils.unsafeCastToDouble(b));
+    return JsUtils.uncheckedCast((CompareDoubleFunction) Double::compare);
+  }
+
+  @JsFunction
+  private interface CompareLongFunction {
+    @SuppressWarnings("unusable-by-js")
+    int compare(long d1, long d2);
   }
 
   private static CompareFunction getLongComparator() {
-    return (a, b) -> Long.compare(JsUtils.unsafeCastToLong(a), JsUtils.unsafeCastToLong(b));
+    return JsUtils.uncheckedCast((CompareLongFunction) Long::compare);
   }
 
   private Arrays() { }
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java b/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
index c1a66f5..c388935 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/ArrayHelper.java
@@ -101,7 +101,7 @@
   private static native NativeFunction getSpliceFunction();
 
   public static NativeArray asNativeArray(Object array) {
-    return JsUtils.unsafeCastToNativeArray(array);
+    return JsUtils.uncheckedCast(array);
   }
 }
 
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
index c0477ac..87c404d 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
@@ -15,6 +15,8 @@
  */
 package javaemul.internal;
 
+import javaemul.internal.annotations.UncheckedCast;
+
 /**
  * Provides an interface for simple JavaScript idioms that can not be expressed in Java.
  */
@@ -52,12 +54,9 @@
    return bool;
   }-*/;
 
-  public static native long unsafeCastToLong(Object l) /*-{
-    return l;
-  }-*/;
-
-  public static native NativeArray unsafeCastToNativeArray(Object array) /*-{
-    return array;
+  @UncheckedCast
+  public static native <T> T uncheckedCast(Object o) /*-{
+    return o;
   }-*/;
 
   public static native <T> T getProperty(Object map, String key) /*-{