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();
}
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;
if (descriptor instanceof CallableMemberDescriptor) {
CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor;
while (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
memberDescriptor = memberDescriptor.getOverriddenDescriptors().iterator().next();
}
memberDescriptor = unwrapFakeOverride(memberDescriptor);
intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor);
}
if (intrinsic != null) {
@@ -1696,6 +1695,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
c = c.getParentContext();
assert c != null;
}
fd = unwrapFakeOverride(fd);
fd = (FunctionDescriptor) c.getAccessor(fd);
superCall = false;
receiver = StackValue.thisOrOuter(this, enclosed);
@@ -357,9 +357,7 @@ public class JetTypeMapper extends BindingTraceAware {
public CallableMethod mapToCallableMethod(@NotNull FunctionDescriptor functionDescriptor, boolean superCall, OwnerKind kind) {
final DeclarationDescriptor functionParent = functionDescriptor.getOriginal().getContainingDeclaration();
while (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
functionDescriptor = functionDescriptor.getOverriddenDescriptors().iterator().next();
}
functionDescriptor = unwrapFakeOverride(functionDescriptor);
JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), true, kind);
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);
blackBoxFile("regressions/kt1939.kt");
}
public void testKt2702() {
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY);
blackBoxFile("regressions/kt2702.kt");
}
}