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
