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);
|
boolean superCall = isSuperCall(call);
|
||||||
|
|
||||||
if (superCall && !isInterface(fd.getContainingDeclaration())) {
|
if (superCall && !isInterface(fd.getContainingDeclaration())) {
|
||||||
CodegenContext c = getParentContextSubclassOf((ClassDescriptor) fd.getContainingDeclaration());
|
JetSuperExpression expression = getSuperCallExpression(call);
|
||||||
fd = (FunctionDescriptor) c.getAccessor(unwrapFakeOverride(fd));
|
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);
|
fd = accessableFunctionDescriptor(fd);
|
||||||
|
|||||||
@@ -217,6 +217,16 @@ public abstract class CodegenContext {
|
|||||||
return cur == null ? null : (ClassDescriptor) cur.getContextDescriptor();
|
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) {
|
public DeclarationDescriptor getAccessor(DeclarationDescriptor descriptor) {
|
||||||
if (accessors == null) {
|
if (accessors == null) {
|
||||||
accessors = new HashMap<DeclarationDescriptor, DeclarationDescriptor>();
|
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;
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.jetbrains.jet.ConfigurationKind;
|
import org.jetbrains.jet.ConfigurationKind;
|
||||||
|
|
||||||
public class SuperGenTest extends CodegenTestCase {
|
public class SuperGenTest extends CodegenTestCase {
|
||||||
@@ -28,22 +29,18 @@ public class SuperGenTest extends CodegenTestCase {
|
|||||||
|
|
||||||
public void testBasicProperty () {
|
public void testBasicProperty () {
|
||||||
blackBoxFile("/super/basicproperty.jet");
|
blackBoxFile("/super/basicproperty.jet");
|
||||||
// System.out.println(generateToText());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testTraitProperty () {
|
public void testTraitProperty () {
|
||||||
blackBoxFile("/super/traitproperty.jet");
|
blackBoxFile("/super/traitproperty.jet");
|
||||||
// System.out.println(generateToText());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testBasicMethodSuperTrait () {
|
public void testBasicMethodSuperTrait () {
|
||||||
blackBoxFile("/super/basicmethodSuperTrait.jet");
|
blackBoxFile("/super/basicmethodSuperTrait.jet");
|
||||||
// System.out.println(generateToText());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testBasicMethodSuperClass () {
|
public void testBasicMethodSuperClass () {
|
||||||
blackBoxFile("/super/basicmethodSuperClass.jet");
|
blackBoxFile("/super/basicmethodSuperClass.jet");
|
||||||
// System.out.println(generateToText());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testInnerClassLabeledSuper() {
|
public void testInnerClassLabeledSuper() {
|
||||||
@@ -60,12 +57,16 @@ public class SuperGenTest extends CodegenTestCase {
|
|||||||
|
|
||||||
public void testEnclosedFun () {
|
public void testEnclosedFun () {
|
||||||
blackBoxFile("/super/enclosedFun.jet");
|
blackBoxFile("/super/enclosedFun.jet");
|
||||||
// System.out.println(generateToText());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testEnclosedVar () {
|
public void testEnclosedVar () {
|
||||||
blackBoxFile("/super/enclosedVar.jet");
|
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