Adds helpers to CharSequence and Comparable for J2CL

Change-Id: Ifc471c7a9565894ea4feaa5cc8659c7db46bf214
diff --git a/dev/core/test/com/google/gwt/dev/CompilerTest.java b/dev/core/test/com/google/gwt/dev/CompilerTest.java
index 3aee111..137e2ff 100644
--- a/dev/core/test/com/google/gwt/dev/CompilerTest.java
+++ b/dev/core/test/com/google/gwt/dev/CompilerTest.java
@@ -2548,6 +2548,8 @@
     // comparisons.
     staleTypeNames.removeAll(Arrays.asList(
         "java.lang.Boolean",
+        "java.lang.CharSequence",
+        "java.lang.Comparable",
         "java.lang.Double",
         "java.lang.Number",
         "java.lang.String",
diff --git a/user/super/com/google/gwt/emul/java/lang/CharSequence.java b/user/super/com/google/gwt/emul/java/lang/CharSequence.java
index a359d37..4286821 100644
--- a/user/super/com/google/gwt/emul/java/lang/CharSequence.java
+++ b/user/super/com/google/gwt/emul/java/lang/CharSequence.java
@@ -15,6 +15,10 @@
  */
 package java.lang;
 
+import javaemul.internal.JsUtils;
+
+import jsinterop.annotations.JsMethod;
+
 /**
  * Abstracts the notion of a sequence of characters.
  */
@@ -27,4 +31,15 @@
 
   @Override
   String toString();
+
+  // CHECKSTYLE_OFF: Utility methods.
+  @JsMethod
+  static boolean $isInstance(Object instance) {
+    if (JsUtils.typeOf(instance).equals("string")) {
+      return true;
+    }
+
+    return instance != null && JsUtils.hasCharSequenceTypeMarker(instance);
+  }
+  // CHECKSTYLE_ON: end utility methods
 }
diff --git a/user/super/com/google/gwt/emul/java/lang/Comparable.java b/user/super/com/google/gwt/emul/java/lang/Comparable.java
index 70d6c91..8e92784 100644
--- a/user/super/com/google/gwt/emul/java/lang/Comparable.java
+++ b/user/super/com/google/gwt/emul/java/lang/Comparable.java
@@ -15,6 +15,10 @@
  */
 package java.lang;
 
+import javaemul.internal.JsUtils;
+
+import jsinterop.annotations.JsMethod;
+
 /**
  * An interface used a basis for implementing custom ordering. <a
  * href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html">[Sun
@@ -24,4 +28,16 @@
  */
 public interface Comparable<T> {
   int compareTo(T other);
+
+  // CHECKSTYLE_OFF: Utility methods.
+  @JsMethod
+  static boolean $isInstance(Object instance) {
+    String type = JsUtils.typeOf(instance);
+    if (type.equals("boolean") || type.equals("number") || type.equals("string")) {
+      return true;
+    }
+
+    return instance != null && JsUtils.hasComparableTypeMarker(instance);
+  }
+  // CHECKSTYLE_ON: end utility methods
 }
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 d9fad43..981f224 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/JsUtils.java
@@ -70,5 +70,13 @@
   public static native String typeOf(Object o) /*-{
     return typeof o;
   }-*/;
+
+  public static native boolean hasComparableTypeMarker(Object o) /*-{
+    return o.$implements__java_lang_Comparable;
+  }-*/;
+
+  public static native boolean hasCharSequenceTypeMarker(Object o) /*-{
+    return o.$implements__java_lang_CharSequence;
+  }-*/;
 }