Revision: 7280
Author: [email protected]
Date: Wed Dec  9 09:27:56 2009
Log: JsniChecker should resolve methods defined by super interfaces.

Review by: bobv
http://code.google.com/p/google-web-toolkit/source/detail?r=7280

Modified:
  /trunk/dev/core/src/com/google/gwt/dev/javac/JsniChecker.java
  /trunk/dev/core/test/com/google/gwt/dev/javac/JsniCheckerTest.java

=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/javac/JsniChecker.java       Thu Nov 
 
19 13:48:42 2009
+++ /trunk/dev/core/src/com/google/gwt/dev/javac/JsniChecker.java       Wed Dec 
  
9 09:27:56 2009
@@ -56,8 +56,11 @@
  import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
  import org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding;

+import java.util.Arrays;
+import java.util.LinkedList;
  import java.util.Locale;
  import java.util.Map;
+import java.util.Queue;
  import java.util.Set;
  import java.util.Stack;

@@ -374,13 +377,23 @@
            }
          }
        } else {
-        while (clazz != null) {
+        Queue<ReferenceBinding> work = new LinkedList<ReferenceBinding>();
+        work.add(clazz);
+        while (!work.isEmpty()) {
+          clazz = work.remove();
            for (MethodBinding findMethod :  
clazz.getMethods(methodName.toCharArray())) {
              if (paramTypesMatch(findMethod, jsniRef)) {
                return findMethod;
              }
            }
-          clazz = clazz.superclass();
+          ReferenceBinding[] superInterfaces = clazz.superInterfaces();
+          if (superInterfaces != null) {
+            work.addAll(Arrays.asList(superInterfaces));
+          }
+          ReferenceBinding superclass = clazz.superclass();
+          if (superclass != null) {
+            work.add(superclass);
+          }
          }
        }
        return null;
=======================================
--- /trunk/dev/core/test/com/google/gwt/dev/javac/JsniCheckerTest.java  Thu  
Nov 19 13:48:42 2009
+++ /trunk/dev/core/test/com/google/gwt/dev/javac/JsniCheckerTest.java  Wed  
Dec  9 09:27:56 2009
@@ -356,6 +356,28 @@
          3,
          "Parameter 1 of method \'Buggy.print\': type 'long' may not be  
passed out of JSNI code");
    }
+
+  /**
+   * Test JSNI references to methods defined in superclass/superinterfaces.
+   */
+  public void testMethodInheritance() {
+    StringBuffer code = new StringBuffer();
+    code.append("class Buggy {\n");
+    code.append("  interface A1 { void a1(); }\n");
+    code.append("  interface A2 extends A1 { void a2(); }\n");
+    code.append("  static abstract class C1 implements A2 { public  
abstract void c1(); }\n");
+    code.append("  native void jsniMeth(Object o) /*-{\n");
+    code.append("    [email protected]::a1()();\n");
+    code.append("    [email protected]::a1()();\n");
+    code.append("    [email protected]::a2()();\n");
+    code.append("    [email protected]::a1()();\n");
+    code.append("    [email protected]::a2()();\n");
+    code.append("    [email protected]::c1()();\n");
+    code.append("  }-*/;\n");
+    code.append("}\n");
+
+    shouldGenerateNoWarning(code);
+  }

    public void testMethodReturn() {
      StringBuffer code = new StringBuffer();

-- 
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to