Generate bridges for super-calls only when needed
#KT-2887 Fixed
This commit is contained in:
@@ -1747,8 +1747,13 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
boolean superCall = isSuperCall(call);
|
||||
|
||||
if (superCall && !isInterface(fd.getContainingDeclaration())) {
|
||||
CodegenContext c = getParentContextSubclassOf((ClassDescriptor) fd.getContainingDeclaration());
|
||||
fd = (FunctionDescriptor) c.getAccessor(unwrapFakeOverride(fd));
|
||||
JetSuperExpression expression = getSuperCallExpression(call);
|
||||
ClassDescriptor owner = getSuperCallLabelTarget(expression);
|
||||
CodegenContext c = context.findParentContextWithDescriptor(owner);
|
||||
assert c != null : "Couldn't find a context for a super-call: " + fd;
|
||||
if (c != context.getParentContext()) {
|
||||
fd = (FunctionDescriptor) c.getAccessor(unwrapFakeOverride(fd));
|
||||
}
|
||||
}
|
||||
|
||||
fd = accessableFunctionDescriptor(fd);
|
||||
|
||||
@@ -217,6 +217,16 @@ public abstract class CodegenContext {
|
||||
return cur == null ? null : (ClassDescriptor) cur.getContextDescriptor();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public CodegenContext findParentContextWithDescriptor(DeclarationDescriptor descriptor) {
|
||||
CodegenContext c = this;
|
||||
while (c != null) {
|
||||
if (c.getContextDescriptor() == descriptor) break;
|
||||
c = c.getParentContext();
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
public DeclarationDescriptor getAccessor(DeclarationDescriptor descriptor) {
|
||||
if (accessors == null) {
|
||||
accessors = new HashMap<DeclarationDescriptor, DeclarationDescriptor>();
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
open class Base<T> {
|
||||
public open fun foo(t: T): T = t
|
||||
|
||||
public open fun bar() {}
|
||||
}
|
||||
|
||||
class Child: Base<String>() {
|
||||
override fun foo(t: String): String {
|
||||
return super<Base>.foo(t)
|
||||
}
|
||||
|
||||
override fun bar() {
|
||||
super.bar()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.jet.codegen;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.jetbrains.jet.ConfigurationKind;
|
||||
|
||||
public class SuperGenTest extends CodegenTestCase {
|
||||
@@ -28,22 +29,18 @@ public class SuperGenTest extends CodegenTestCase {
|
||||
|
||||
public void testBasicProperty () {
|
||||
blackBoxFile("/super/basicproperty.jet");
|
||||
// System.out.println(generateToText());
|
||||
}
|
||||
|
||||
public void testTraitProperty () {
|
||||
blackBoxFile("/super/traitproperty.jet");
|
||||
// System.out.println(generateToText());
|
||||
}
|
||||
|
||||
public void testBasicMethodSuperTrait () {
|
||||
blackBoxFile("/super/basicmethodSuperTrait.jet");
|
||||
// System.out.println(generateToText());
|
||||
}
|
||||
|
||||
public void testBasicMethodSuperClass () {
|
||||
blackBoxFile("/super/basicmethodSuperClass.jet");
|
||||
// System.out.println(generateToText());
|
||||
}
|
||||
|
||||
public void testInnerClassLabeledSuper() {
|
||||
@@ -60,12 +57,16 @@ public class SuperGenTest extends CodegenTestCase {
|
||||
|
||||
public void testEnclosedFun () {
|
||||
blackBoxFile("/super/enclosedFun.jet");
|
||||
// System.out.println(generateToText());
|
||||
}
|
||||
|
||||
public void testEnclosedVar () {
|
||||
blackBoxFile("/super/enclosedVar.jet");
|
||||
// System.out.println(generateToText());
|
||||
}
|
||||
|
||||
public void testKt2887() {
|
||||
loadFile("super/kt2887.kt");
|
||||
String text = generateToText();
|
||||
// There should be exactly one bridge in this example
|
||||
assertEquals(1, StringUtils.countMatches(text, "bridge"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user