< prev index next >

test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java

Print this page

        

*** 34,46 **** import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.HashMap; - import java.util.HashSet; - import java.util.Set; import java.util.stream.Collectors; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*; --- 34,45 ---- import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.stream.Collectors; + import java.util.stream.Stream; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import static org.testng.Assert.*;
*** 53,63 **** MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); for (MethodDesc expected : expectedMethods) { if (expected.isGetMethodReturn()) { try { ! Method m = iface.getMethod(expected.name()); if (!assertMatch(expected, m)) fail(failMsg(expected, m, iface)); else match = true; } catch (NoSuchMethodException e) { --- 52,62 ---- MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); for (MethodDesc expected : expectedMethods) { if (expected.isGetMethodReturn()) { try { ! Method m = iface.getMethod(expected.name(), expected.parameterTypes()); if (!assertMatch(expected, m)) fail(failMsg(expected, m, iface)); else match = true; } catch (NoSuchMethodException e) {
*** 70,99 **** @Test(dataProvider="getCases") public void testGetMethods(Class<?> iface) { List<Method> foundMethods = filterObjectMethods(iface.getMethods()); MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); - Set<Method> used = new HashSet<>(); for (MethodDesc expected : expectedMethods) { boolean found = false; - for (Method m : foundMethods) { ! if (used.contains(m)) ! continue; ! ! if(expected.name().equals(m.getName()) && ! expected.declaringClass() ==m.getDeclaringClass()) { ! found = true; - assertMatch(expected, m); - used.add(m); break; } } ! if (! found) ! fail("On: "+ iface +"\nDid not find " + toMethodString(expected) + " among " + foundMethods); } assertEquals(foundMethods.size(), expectedMethods.length, "\non: " + iface + "\nexpected: " + toMethodStrings(expectedMethods) + "\nfound: " + foundMethods + "\n"); --- 69,90 ---- @Test(dataProvider="getCases") public void testGetMethods(Class<?> iface) { List<Method> foundMethods = filterObjectMethods(iface.getMethods()); MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); for (MethodDesc expected : expectedMethods) { boolean found = false; for (Method m : foundMethods) { ! if (assertMatch(expected, m)) { found = true; break; } } ! if (!found) ! fail("On: "+ iface +"\nDid not find " + toMethodString(expected) + ! " among " + foundMethods); } assertEquals(foundMethods.size(), expectedMethods.length, "\non: " + iface + "\nexpected: " + toMethodStrings(expectedMethods) + "\nfound: " + foundMethods + "\n");
*** 102,111 **** --- 93,107 ---- private boolean assertMatch(MethodDesc expected, Method m) { if (!expected.name().equals(m.getName())) return false; if (expected.declaringClass() != m.getDeclaringClass()) return false; + if (!Arrays.equals(expected.parameterTypes(), m.getParameterTypes())) + return false; + if (expected.returnType() != NotSpecified.class && + expected.returnType() != m.getReturnType()) + return false; if (expected.kind() == MethodKind.ABSTRACT) assertTrue(Modifier.isAbstract(m.getModifiers()), m + " should be ABSTRACT"); else if (expected.kind() == MethodKind.CONCRETE) assertTrue(!Modifier.isAbstract(m.getModifiers()) && !m.isDefault(), m + " should be CONCRETE");
*** 126,137 **** filter(m -> (m.getDeclaringClass() != java.lang.Object.class)). collect(Collectors.toList()); } private String toMethodString(MethodDesc m) { ! return m.declaringClass().getSimpleName().toString() + "." + ! m.name() + "()"; } private List<String> toMethodStrings(MethodDesc[] m) { return Arrays.stream(m). map(this::toMethodString) --- 122,138 ---- filter(m -> (m.getDeclaringClass() != java.lang.Object.class)). collect(Collectors.toList()); } private String toMethodString(MethodDesc m) { ! return (m.returnType() != NotSpecified.class ! ? m.returnType().getSimpleName() + " " ! : "") + ! m.declaringClass().getSimpleName().toString() + "." + ! m.name() + Stream.of(m.parameterTypes()) ! .map(cl -> cl.getSimpleName()) ! .collect(Collectors.joining(", ", "(", ")")); } private List<String> toMethodStrings(MethodDesc[] m) { return Arrays.stream(m). map(this::toMethodString)
*** 140,154 **** --- 141,160 ---- @Retention(RetentionPolicy.RUNTIME) @Repeatable(MethodDescs.class) public @interface MethodDesc { String name(); + Class<?> returnType() default NotSpecified.class; + Class<?>[] parameterTypes() default {}; Class<?> declaringClass(); MethodKind kind() default MethodKind.ABSTRACT; boolean isGetMethodReturn() default false; } + // special type marking a not-specified return type in @MethodDesc + interface NotSpecified {} + @Retention(RetentionPolicy.RUNTIME) public @interface MethodDescs { MethodDesc[] value(); }
*** 170,213 **** isGetMethodReturn=true) interface P1 extends Jbis {} @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P2 extends Jbis, Jprim {} @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P3 extends Jbis, Jprim, I {} ! @MethodDesc(name="nonDefault", declaringClass=I.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) interface P4 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface P5 extends J, I {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) interface K1 extends J {} @MethodDesc(name="nonDefault", declaringClass=K1M.class, isGetMethodReturn=true) interface K1M extends J { void nonDefault(); } ! @MethodDesc(name="nonDefault", declaringClass=I.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) interface K2 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=I.class) interface K2O extends J, I {} @MethodDesc(name="nonDefault", declaringClass=K2M.class, isGetMethodReturn=true) interface K2M extends J, I { void nonDefault(); } --- 176,213 ---- isGetMethodReturn=true) interface P1 extends Jbis {} @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) interface P2 extends Jbis, Jprim {} @MethodDesc(name="nonDefault", declaringClass=Jbis.class, isGetMethodReturn=true) interface P3 extends Jbis, Jprim, I {} ! @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) interface P4 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) interface P5 extends J, I {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) interface K1 extends J {} @MethodDesc(name="nonDefault", declaringClass=K1M.class, isGetMethodReturn=true) interface K1M extends J { void nonDefault(); } ! @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) interface K2 extends I, J {} @MethodDesc(name="nonDefault", declaringClass=J.class, isGetMethodReturn=true) interface K2O extends J, I {} @MethodDesc(name="nonDefault", declaringClass=K2M.class, isGetMethodReturn=true) interface K2M extends J, I { void nonDefault(); }
*** 242,266 **** isGetMethodReturn=true) interface N1DN extends M { default void isDefault() {} void nonDefault(); } @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2 extends M, L {} @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=L.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) interface N22 extends L, M {} @MethodDesc(name="isDefault", declaringClass=N2D.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2D extends M, L { default void isDefault() {}} @MethodDesc(name="isDefault", declaringClass=M.class, --- 242,263 ---- isGetMethodReturn=true) interface N1DN extends M { default void isDefault() {} void nonDefault(); } @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2 extends M, L {} @MethodDesc(name="isDefault", declaringClass=M.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N22 extends L, M {} @MethodDesc(name="isDefault", declaringClass=N2D.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) interface N2D extends M, L { default void isDefault() {}} @MethodDesc(name="isDefault", declaringClass=M.class,
*** 275,326 **** isGetMethodReturn=true) interface N2DN extends M, L { default void isDefault() {} void nonDefault(); } @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=L.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface O1 extends L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=L.class) ! @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface O2 extends M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface O3 extends N2DN, L, M {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=L.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) abstract class C1 implements L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=L.class) ! @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) abstract class C2 implements M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) abstract class C3 implements N2DN, L, M {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, --- 272,311 ---- isGetMethodReturn=true) interface N2DN extends M, L { default void isDefault() {} void nonDefault(); } @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface O1 extends L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface O2 extends M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface O3 extends N2DN, L, M {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) abstract class C1 implements L, M, N2DN {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) abstract class C2 implements M, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=N2DN.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) abstract class C3 implements N2DN, L, M {} @MethodDesc(name="isDefault", declaringClass=N2DN.class,
*** 343,434 **** // reabstraction @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=L.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R1 extends L, M, N2DN { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=L.class) ! @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R2 extends M, N2DN, L { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R3 extends N2DN, L, M { void isDefault(); } ! // this one is strange but logical, getMethod finds N2DN first, which is ! // default but not the most specific ! @MethodDesc(name="isDefault", declaringClass=N2DN.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="isDefault", declaringClass=R1.class) ! @MethodDesc(name="nonDefault", declaringClass=L.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R4 extends L, M, N2DN, R1 {} ! // this one is strange but logical, getMethod finds N2DN first, which is ! // default but not the most specific ! @MethodDesc(name="isDefault", declaringClass=N2DN.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="isDefault", declaringClass=R2.class) ! @MethodDesc(name="nonDefault", declaringClass=L.class) ! @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R5 extends M, N2DN, R2, L {} ! // this one is strange but logical, getMethod finds N2DN first, which is ! // default but not the most specific ! @MethodDesc(name="isDefault", declaringClass=N2DN.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="isDefault", declaringClass=R3.class) ! @MethodDesc(name="nonDefault", declaringClass=L.class) ! @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R6 extends N2DN, R3, L, M {} - // the following three finds the "right" one @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) ! @MethodDesc(name="isDefault", declaringClass=N2DN.class, ! kind=MethodKind.DEFAULT) ! @MethodDesc(name="nonDefault", declaringClass=L.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=M.class) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R7 extends L, M, R1, N2DN {} @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) ! @MethodDesc(name="isDefault", declaringClass=N2DN.class, ! kind=MethodKind.DEFAULT) ! @MethodDesc(name="nonDefault", declaringClass=L.class) ! @MethodDesc(name="nonDefault", declaringClass=M.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=N2DN.class) interface R8 extends M, R2, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) - @MethodDesc(name="isDefault", declaringClass=N2DN.class, - kind=MethodKind.DEFAULT) - @MethodDesc(name="nonDefault", declaringClass=L.class) - @MethodDesc(name="nonDefault", declaringClass=M.class) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R9 extends R3, N2DN, L, M {} // More reabstraction --- 328,385 ---- // reabstraction @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R1 extends L, M, N2DN { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R2 extends M, N2DN, L { void isDefault(); } @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R3 extends N2DN, L, M { void isDefault(); } ! @MethodDesc(name="isDefault", declaringClass=R1.class, ! isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R4 extends L, M, N2DN, R1 {} ! @MethodDesc(name="isDefault", declaringClass=R2.class, ! isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R5 extends M, N2DN, R2, L {} ! @MethodDesc(name="isDefault", declaringClass=R3.class, ! isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R6 extends N2DN, R3, L, M {} @MethodDesc(name="isDefault", declaringClass=R1.class, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R7 extends L, M, R1, N2DN {} @MethodDesc(name="isDefault", declaringClass=R2.class, isGetMethodReturn=true) ! @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R8 extends M, R2, N2DN, L {} @MethodDesc(name="isDefault", declaringClass=R3.class, isGetMethodReturn=true) @MethodDesc(name="nonDefault", declaringClass=N2DN.class, isGetMethodReturn=true) interface R9 extends R3, N2DN, L, M {} // More reabstraction
*** 443,497 **** kind=MethodKind.DEFAULT, isGetMethodReturn=true) interface Z32 extends Z2, Z1 {} interface Z3 extends Z2, Z1 { void z(); } ! @MethodDesc(name="z", declaringClass=Z2.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="z", declaringClass=Z3.class) interface Z41 extends Z1, Z2, Z3 { } ! @MethodDesc(name="z", declaringClass=Z2.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="z", declaringClass=Z3.class) interface Z42 extends Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn=true) ! @MethodDesc(name="z", declaringClass=Z2.class, ! kind=MethodKind.DEFAULT) interface Z43 extends Z3, Z1, Z2 { } ! @MethodDesc(name="z", declaringClass=Z2.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="z", declaringClass=Z3.class) abstract class ZC41 implements Z1, Z2, Z3 { } ! @MethodDesc(name="z", declaringClass=Z2.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="z", declaringClass=Z3.class) abstract class ZC42 implements Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn=true) ! @MethodDesc(name="z", declaringClass=Z2.class, ! kind=MethodKind.DEFAULT) abstract class ZC43 implements Z3, Z1, Z2 { } // More reabstraction + concretization interface X1 { default void x() {} } interface X2 extends X1 { void x(); } ! @MethodDesc(name="x", declaringClass=X1.class, ! kind=MethodKind.DEFAULT, isGetMethodReturn=true) ! @MethodDesc(name="x", declaringClass=X2.class) interface X31 extends X1, X2 {} @MethodDesc(name="x", declaringClass=X2.class, isGetMethodReturn=true) - @MethodDesc(name="x", declaringClass=X1.class, - kind=MethodKind.DEFAULT) interface X32 extends X2, X1 {} @MethodDesc(name="x", declaringClass=X3.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) interface X3 extends X2, X1 { default void x() {} } --- 394,437 ---- kind=MethodKind.DEFAULT, isGetMethodReturn=true) interface Z32 extends Z2, Z1 {} interface Z3 extends Z2, Z1 { void z(); } ! @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn = true) interface Z41 extends Z1, Z2, Z3 { } ! @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn = true) interface Z42 extends Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn = true) interface Z43 extends Z3, Z1, Z2 { } ! @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn = true) abstract class ZC41 implements Z1, Z2, Z3 { } ! @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn = true) abstract class ZC42 implements Z2, Z3, Z1 { } @MethodDesc(name="z", declaringClass=Z3.class, ! isGetMethodReturn = true) abstract class ZC43 implements Z3, Z1, Z2 { } // More reabstraction + concretization interface X1 { default void x() {} } interface X2 extends X1 { void x(); } ! @MethodDesc(name="x", declaringClass=X2.class, ! isGetMethodReturn=true) interface X31 extends X1, X2 {} @MethodDesc(name="x", declaringClass=X2.class, isGetMethodReturn=true) interface X32 extends X2, X1 {} @MethodDesc(name="x", declaringClass=X3.class, kind=MethodKind.DEFAULT, isGetMethodReturn=true) interface X3 extends X2, X1 { default void x() {} }
*** 522,610 **** kind=MethodKind.DEFAULT, isGetMethodReturn=true) abstract class XC43 implements X3, X1, X2 { } interface K extends I, J { void nonDefault(); } ! @MethodDesc(name="nonDefault", declaringClass=I.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ1 implements I, J, K {} ! @MethodDesc(name="nonDefault", declaringClass=I.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ2 extends ZZ1 implements K, I, J {} ! @MethodDesc(name="nonDefault", declaringClass=I.class, isGetMethodReturn=true) - @MethodDesc(name="nonDefault", declaringClass=J.class) - @MethodDesc(name="nonDefault", declaringClass=K.class) abstract class ZZ3 extends ZZ2 implements J, K, I {} ! // bridges ! interface B1A { Object m(); } ! interface B1B extends B1A { Map m(); } ! ! @MethodDesc(name="m", declaringClass=B1C.class, ! isGetMethodReturn=true) ! @MethodDesc(name="m", declaringClass=B1C.class, ! kind=MethodKind.DEFAULT) ! @MethodDesc(name="m", declaringClass=B1C.class, ! kind=MethodKind.DEFAULT) ! interface B1C extends B1B { HashMap m(); } ! ! @MethodDesc(name="m", declaringClass=B2.class, ! isGetMethodReturn=true) ! @MethodDesc(name="m", declaringClass=B2.class, ! kind=MethodKind.DEFAULT) ! @MethodDesc(name="m", declaringClass=B2.class, ! kind=MethodKind.DEFAULT) ! interface B2 extends B1C { HashMap m(); } ! ! @MethodDesc(name="m", declaringClass=B2.class, //HahsMap ! isGetMethodReturn=true) ! @MethodDesc(name="m", declaringClass=B2.class, //Map ! kind=MethodKind.DEFAULT) ! @MethodDesc(name="m", declaringClass=B2.class, //Object ! kind=MethodKind.DEFAULT) ! interface B3A extends B2, B1A {} ! ! // this one is funny since HashMap isn't a bridge thus not a default ! @MethodDesc(name="m", declaringClass=B2.class, //HashMap ! isGetMethodReturn=true) ! @MethodDesc(name="m", declaringClass=B2.class, //Map ! kind=MethodKind.DEFAULT) ! @MethodDesc(name="m", declaringClass=B2.class, //Object ! kind=MethodKind.DEFAULT) ! @MethodDesc(name="m", declaringClass=B1C.class) //HashMap ! interface B3B extends B2, B1C {} // same name different params type interface A1 { void m(); void m(int i); void m(int i, int j); } interface A2A extends A1 { void m(); void m(int i); void m(int i, int j); } interface A2B extends A1 { void m(); void m(int i); default void m(int i, int j) {} } ! @MethodDesc(name="m", declaringClass=A1.class, isGetMethodReturn=true) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A1.class) - @MethodDesc(name="m", declaringClass=A2A.class) - @MethodDesc(name="m", declaringClass=A2A.class) - @MethodDesc(name="m", declaringClass=A2A.class) interface A3A extends A1, A2A {} ! @MethodDesc(name="m", declaringClass=A1.class, isGetMethodReturn=true) ! @MethodDesc(name="m", declaringClass=A1.class) ! @MethodDesc(name="m", declaringClass=A2B.class) ! @MethodDesc(name="m", declaringClass=A2B.class) ! @MethodDesc(name="m", declaringClass=A2B.class, ! kind=MethodKind.DEFAULT) interface A3B extends A1, A2B {} @DataProvider public Object[][] getCases() { return CASES; } public static final Class<?>[][] CASES = { { K1.class }, { K1M.class }, --- 462,572 ---- kind=MethodKind.DEFAULT, isGetMethodReturn=true) abstract class XC43 implements X3, X1, X2 { } interface K extends I, J { void nonDefault(); } ! @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) abstract class ZZ1 implements I, J, K {} ! @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) abstract class ZZ2 extends ZZ1 implements K, I, J {} ! @MethodDesc(name="nonDefault", declaringClass=K.class, isGetMethodReturn=true) abstract class ZZ3 extends ZZ2 implements J, K, I {} ! // bridges... ! ! interface B1 { Object m(); } ! interface B2A extends B1 { Map m(); } ! interface B2B extends B1 { HashMap m(); } ! ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B3A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Map.class, declaringClass=B3A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B3A.class, ! isGetMethodReturn=true) ! interface B3A extends B2A { HashMap m(); } ! ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, ! isGetMethodReturn=true) ! interface B4A extends B3A { HashMap m(); } ! ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, ! isGetMethodReturn=true) ! interface B5A2 extends B4A, B1 {} ! ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B4A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Map.class, declaringClass=B4A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=HashMap.class, declaringClass= B4A.class, ! isGetMethodReturn=true) ! interface B5A4A extends B4A, B3A {} ! ! // ... + most specific return type for getMethod from two unrelated interfaces ! ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B2A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B2B.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Map.class, declaringClass=B2A.class) ! @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B2B.class, ! isGetMethodReturn=true) ! interface B3AB extends B2A, B2B {} ! ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B2A.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Object.class, declaringClass=B2B.class, ! kind = MethodKind.DEFAULT) ! @MethodDesc(name="m", returnType=Map.class, declaringClass=B2A.class) ! @MethodDesc(name="m", returnType=HashMap.class, declaringClass=B2B.class, ! isGetMethodReturn=true) ! interface B3BA extends B2B, B2A {} // same name different params type interface A1 { void m(); void m(int i); void m(int i, int j); } interface A2A extends A1 { void m(); void m(int i); void m(int i, int j); } interface A2B extends A1 { void m(); void m(int i); default void m(int i, int j) {} } ! @MethodDesc(name="m", parameterTypes = {}, declaringClass=A2A.class, ! isGetMethodReturn=true) ! @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2A.class, ! isGetMethodReturn=true) ! @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2A.class, isGetMethodReturn=true) interface A3A extends A1, A2A {} ! @MethodDesc(name="m", parameterTypes = {}, declaringClass=A2B.class, ! isGetMethodReturn=true) ! @MethodDesc(name="m", parameterTypes = {int.class}, declaringClass=A2B.class, isGetMethodReturn=true) ! @MethodDesc(name="m", parameterTypes = {int.class, int.class}, declaringClass=A2B.class, ! kind = MethodKind.DEFAULT, isGetMethodReturn=true) interface A3B extends A1, A2B {} + // method in directly implemented interface overrides interface method + // inherited by superclass + + interface E { void m(); } + interface F extends E { void m(); } + abstract class G implements E {} + + @MethodDesc(name="m", declaringClass=F.class, isGetMethodReturn=true) + abstract class H extends G implements F {} + @DataProvider public Object[][] getCases() { return CASES; } public static final Class<?>[][] CASES = { { K1.class }, { K1M.class },
*** 678,691 **** { XC41.class }, { XC42.class }, { XC43.class }, - { B1C.class }, - { B2.class }, { B3A.class }, ! { B3B.class }, { A3A.class }, { A3B.class }, }; } --- 640,657 ---- { XC41.class }, { XC42.class }, { XC43.class }, { B3A.class }, ! { B4A.class }, ! { B5A2.class }, ! { B5A4A.class }, ! { B3AB.class }, ! { B3BA.class }, { A3A.class }, { A3B.class }, + + { H.class }, }; }
< prev index next >