]> source.dussan.org Git - aspectj.git/commitdiff
Fix ambiguous binding problem on anonymous types
authorAndy Clement <aclement@pivotal.io>
Fri, 29 Jul 2016 17:05:50 +0000 (10:05 -0700)
committerAndy Clement <aclement@pivotal.io>
Fri, 29 Jul 2016 17:05:50 +0000 (10:05 -0700)
If an anonymous class calls a method ITD'd onto one of its own
supertypes (e.g. new A() { xx(null); }) then it can be reported
as an ambiguous method invocation on Java8. There is different
handling for Java8 that is revealing an issue. The intertype
method declarations are recorded in a member finder attached to the
target type (A in this case). When the local type binding is
built it gets all the methods from supertypes added to it - this
unfortunately includes the ITD method.  Then later when something
asks for all 'xx' methods on A, it finds the ITD method from when
A was constructed and an additional copy from the member finder.

The quick fix is for the member finder to use a set rather than
list when answering 'what are the xx methods'. If this proves
a problem down the line the deeper fix would be to avoid including
ITDs when the local type binding is built.

org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMemberFinder.java
tests/bugs1810/ambig/Code.java [new file with mode: 0644]
tests/bugs1810/ambig/X.java [new file with mode: 0644]
tests/src/org/aspectj/systemtest/ajc1810/Ajc1810Tests.java
tests/src/org/aspectj/systemtest/ajc1810/ajc1810.xml

index 97221b2aa58afdc59005ba9972ceea836b9796e0..9784710f4baad6507fcf87ec7a4215cc04cc266c 100644 (file)
@@ -16,8 +16,10 @@ package org.aspectj.ajdt.internal.compiler.lookup;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
 import org.aspectj.org.eclipse.jdt.core.compiler.IProblem;
@@ -298,7 +300,7 @@ public class InterTypeMemberFinder implements IMemberFinder {
                        return orig;
                }
 
-               List ret = new ArrayList(Arrays.asList(orig));
+               Set<MethodBinding> ret = new HashSet<MethodBinding>(Arrays.asList(orig));
                // System.err.println("declared method: " + ret + " inters = " + interTypeMethods);
 
                for (int i = 0, len = interTypeMethods.size(); i < len; i++) {
diff --git a/tests/bugs1810/ambig/Code.java b/tests/bugs1810/ambig/Code.java
new file mode 100644 (file)
index 0000000..dab8d6f
--- /dev/null
@@ -0,0 +1,8 @@
+import java.util.List;
+
+aspect F { void A.xx(List<String> x) { xx(null);this.xx(null);};}
+class A {}
+class B extends A { void xx(List<String> x) { xx(null); this.xx(null); super.xx(null); }}
+class C implements D { public void xx(List<String> x) { xx(null); new A().xx(null); new B().xx(null); }}
+interface D { void xx(List<String> x); }
+class E { void foo() { new B().xx(null); new A() {}.xx(null); } }
diff --git a/tests/bugs1810/ambig/X.java b/tests/bugs1810/ambig/X.java
new file mode 100644 (file)
index 0000000..6f0a73d
--- /dev/null
@@ -0,0 +1,13 @@
+import java.util.List;
+
+aspect F { 
+  void A.xx(List<String> x) { }
+}
+class A {
+  //void xx(List<String> x) {}
+}
+class E { 
+  void foo() {
+    new A() {}.xx(null); 
+  } 
+}
index cff7a3b7b9bfc1da6c7788df2ef5e98919347b23..3af4bb79c2f864c0d971e60343faab2006ca87d1 100644 (file)
@@ -34,6 +34,14 @@ public class Ajc1810Tests extends org.aspectj.testing.XMLBasedAjcTestCase {
                runTest("indy");
        }
 
+       public void testAmbigMessage17() throws Exception {
+               runTest("ambiguous message - 17");
+       }
+
+       public void testAmbigMessage18() throws Exception {
+               runTest("ambiguous message - 18");
+       }
+
        // http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.6
        public void testInnerClassesAttributeStructure_493554() throws Exception {
                runTest("pertarget");
index dd4237d22e5920d11f40847f6bc8d5675156189a..e53b8aabea3237c1565406db2b51755939656936 100644 (file)
                <run class="example.kusedep.Cmd"></run>
        </ajc-test>
 
+       <ajc-test dir="bugs1810/ambig" title="ambiguous message - 18">
+               <compile options="-1.8" files="X.java"/>
+       </ajc-test>
 
+       <ajc-test dir="bugs1810/ambig" title="ambiguous message - 17">
+               <compile options="-1.7" files="X.java"/>
+       </ajc-test>
+       
 </suite>