fix for KT=2702 - wrong bridges on super call

This commit is contained in:
Alex Tkachman
2012-08-30 15:35:37 +03:00
parent 925b2b9f99
commit 8a71cf7bf7
5 changed files with 31 additions and 6 deletions
@@ -370,4 +370,12 @@ public class CodegenUtil {
} }
return JetStandardClasses.getAnyType(); return JetStandardClasses.getAnyType();
} }
public static <T extends CallableMemberDescriptor> T unwrapFakeOverride(T member) {
while (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
//noinspection unchecked
member = (T) member.getOverriddenDescriptors().iterator().next();
}
return member;
}
} }
@@ -1317,9 +1317,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
IntrinsicMethod intrinsic = null; IntrinsicMethod intrinsic = null;
if (descriptor instanceof CallableMemberDescriptor) { if (descriptor instanceof CallableMemberDescriptor) {
CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor; CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor;
while (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { memberDescriptor = unwrapFakeOverride(memberDescriptor);
memberDescriptor = memberDescriptor.getOverriddenDescriptors().iterator().next();
}
intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor); intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor);
} }
if (intrinsic != null) { if (intrinsic != null) {
@@ -1696,6 +1695,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
c = c.getParentContext(); c = c.getParentContext();
assert c != null; assert c != null;
} }
fd = unwrapFakeOverride(fd);
fd = (FunctionDescriptor) c.getAccessor(fd); fd = (FunctionDescriptor) c.getAccessor(fd);
superCall = false; superCall = false;
receiver = StackValue.thisOrOuter(this, enclosed); receiver = StackValue.thisOrOuter(this, enclosed);
@@ -357,9 +357,7 @@ public class JetTypeMapper extends BindingTraceAware {
public CallableMethod mapToCallableMethod(@NotNull FunctionDescriptor functionDescriptor, boolean superCall, OwnerKind kind) { public CallableMethod mapToCallableMethod(@NotNull FunctionDescriptor functionDescriptor, boolean superCall, OwnerKind kind) {
final DeclarationDescriptor functionParent = functionDescriptor.getOriginal().getContainingDeclaration(); final DeclarationDescriptor functionParent = functionDescriptor.getOriginal().getContainingDeclaration();
while (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { functionDescriptor = unwrapFakeOverride(functionDescriptor);
functionDescriptor = functionDescriptor.getOverriddenDescriptors().iterator().next();
}
JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), true, kind); JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), true, kind);
JvmClassName owner; JvmClassName owner;
@@ -0,0 +1,14 @@
open class A<R> {
open fun foo(r: R): R {return r}
}
open class B : A<String>() {
}
open class C : B() {
override fun foo(r: String): String {
return super.foo(r) + "K"
}
}
fun box() = C().foo("O")
@@ -144,4 +144,9 @@ public class BridgeMethodGenTest extends CodegenTestCase {
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY);
blackBoxFile("regressions/kt1939.kt"); blackBoxFile("regressions/kt1939.kt");
} }
public void testKt2702() {
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY);
blackBoxFile("regressions/kt2702.kt");
}
} }