|
83 | 83 | /**
|
84 | 84 | * Tests for {@link ResolvedJavaType}.
|
85 | 85 | */
|
86 |
| -@SuppressWarnings("unchecked") |
87 | 86 | public class TestResolvedJavaType extends TypeUniverse {
|
88 | 87 | private static final Class<? extends Annotation> SIGNATURE_POLYMORPHIC_CLASS = findPolymorphicSignatureClass();
|
89 | 88 |
|
90 | 89 | public TestResolvedJavaType() {
|
91 | 90 | }
|
92 | 91 |
|
| 92 | + @SuppressWarnings("unchecked") |
93 | 93 | private static Class<? extends Annotation> findPolymorphicSignatureClass() {
|
94 | 94 | Class<? extends Annotation> signaturePolyAnnotation = null;
|
95 | 95 | try {
|
@@ -185,8 +185,10 @@ public void getHostClassTest() throws Exception {
|
185 | 185 | }
|
186 | 186 | }
|
187 | 187 |
|
188 |
| - class LocalClass {} |
189 |
| - Cloneable clone = new Cloneable() {}; |
| 188 | + class LocalClass { |
| 189 | + } |
| 190 | + Cloneable clone = new Cloneable() { |
| 191 | + }; |
190 | 192 | assertNull(metaAccess.lookupJavaType(LocalClass.class).getHostClass());
|
191 | 193 | assertNull(metaAccess.lookupJavaType(clone.getClass()).getHostClass());
|
192 | 194 |
|
@@ -771,17 +773,36 @@ public void resolveMethodTest() {
|
771 | 773 | for (Method decl : decls) {
|
772 | 774 | ResolvedJavaMethod m = metaAccess.lookupJavaMethod(decl);
|
773 | 775 | if (m.isPublic()) {
|
774 |
| - ResolvedJavaMethod resolvedmethod = type.resolveMethod(m, context); |
| 776 | + ResolvedJavaMethod resolvedMethod = type.resolveMethod(m, context); |
775 | 777 | if (isSignaturePolymorphic(m)) {
|
776 | 778 | // Signature polymorphic methods must not be resolved
|
777 |
| - assertNull(resolvedmethod); |
| 779 | + assertNull(resolvedMethod); |
778 | 780 | } else {
|
779 | 781 | ResolvedJavaMethod i = metaAccess.lookupJavaMethod(impl);
|
780 |
| - assertEquals(m.toString(), i, resolvedmethod); |
| 782 | + assertEquals(m.toString(), i, resolvedMethod); |
781 | 783 | }
|
782 | 784 | }
|
783 | 785 | }
|
784 | 786 | }
|
| 787 | + // For backwards compatibility treat constructors as resolvable even though they |
| 788 | + // aren't virtually dispatched. |
| 789 | + ResolvedJavaType declaringClass = metaAccess.lookupJavaType(c); |
| 790 | + for (Constructor<?> m : c.getDeclaredConstructors()) { |
| 791 | + ResolvedJavaMethod decl = metaAccess.lookupJavaMethod(m); |
| 792 | + ResolvedJavaMethod impl = type.resolveMethod(decl, declaringClass); |
| 793 | + assertEquals(m.toString(), decl, impl); |
| 794 | + } |
| 795 | + for (Method m : c.getDeclaredMethods()) { |
| 796 | + if (isStatic(m.getModifiers())) { |
| 797 | + // resolveMethod really shouldn't be called with static methods and the |
| 798 | + // result is is somewhat inconsistent so just ignore them |
| 799 | + continue; |
| 800 | + } |
| 801 | + ResolvedJavaMethod decl = metaAccess.lookupJavaMethod(m); |
| 802 | + ResolvedJavaMethod impl = type.resolveMethod(decl, declaringClass); |
| 803 | + ResolvedJavaMethod expected = isSignaturePolymorphic(decl) ? null : decl; |
| 804 | + assertEquals(m.toString(), expected, impl); |
| 805 | + } |
785 | 806 | }
|
786 | 807 | }
|
787 | 808 | }
|
|
0 commit comments