From 46084316829f4bc4c7b3b44f86274d3b7fd8fb89 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 17 Dec 2020 15:38:45 -0800 Subject: [PATCH] FIR2IR: correct base symbols of fake overrides for delegated member #KT-43984 Fixed --- .../generators/FakeOverrideGenerator.kt | 18 +++++++-------- ...ackBoxAgainstJavaCodegenTestGenerated.java | 5 +++++ .../interfaces/defaultMethod.kt | 22 +++++++++++++++++++ ...ackBoxAgainstJavaCodegenTestGenerated.java | 5 +++++ ...ackBoxAgainstJavaCodegenTestGenerated.java | 5 +++++ 5 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/boxAgainstJava/interfaces/defaultMethod.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index c6241de9f4d..ee506407f4a 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -10,11 +10,9 @@ import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.defaultType -import org.jetbrains.kotlin.fir.scopes.FirTypeScope -import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions -import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenProperties +import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.impl.FirFakeOverrideGenerator -import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope +import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -194,11 +192,13 @@ class FakeOverrideGenerator( ): List { if (symbol.fir.origin != FirDeclarationOrigin.IntersectionOverride) return listOf(basedSymbol) return scope.directOverridden(symbol).map { - @Suppress("UNCHECKED_CAST") - if (it.fir.isSubstitutionOverride && it.dispatchReceiverClassOrNull() == containingClass) - it.originalForSubstitutionOverride!! - else - it + when { + it.fir.isSubstitutionOverride && it.dispatchReceiverClassOrNull() == containingClass -> + it.originalForSubstitutionOverride!! + it.fir.origin == FirDeclarationOrigin.Delegated -> + it.fir.delegatedWrapperData?.wrapped?.symbol!! as S + else -> it + } } } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxAgainstJavaCodegenTestGenerated.java index 24bc905559e..c6a091b2d3b 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBlackBoxAgainstJavaCodegenTestGenerated.java @@ -425,6 +425,11 @@ public class FirBlackBoxAgainstJavaCodegenTestGenerated extends AbstractFirBlack KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/interfaces"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @TestMetadata("defaultMethod.kt") + public void testDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/boxAgainstJava/interfaces/defaultMethod.kt"); + } + @TestMetadata("inheritJavaInterface.kt") public void testInheritJavaInterface() throws Exception { runTest("compiler/testData/codegen/boxAgainstJava/interfaces/inheritJavaInterface.kt"); diff --git a/compiler/testData/codegen/boxAgainstJava/interfaces/defaultMethod.kt b/compiler/testData/codegen/boxAgainstJava/interfaces/defaultMethod.kt new file mode 100644 index 00000000000..3e103e584c5 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/interfaces/defaultMethod.kt @@ -0,0 +1,22 @@ +// JVM_TARGET: 1.8 + +// FILE: A.java + +public interface A { + default String getMessage() { + return "OK"; + } +} + +// FILE: 1.kt + +interface I : A + +class B : A + +open class C(a : A) : I, A by a + +fun box(): String { + val a = B() + return C(a).message +} diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java index 34d34562a2f..889ec77bc21 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -424,6 +424,11 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxAga KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/interfaces"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @TestMetadata("defaultMethod.kt") + public void testDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/boxAgainstJava/interfaces/defaultMethod.kt"); + } + @TestMetadata("inheritJavaInterface.kt") public void testInheritJavaInterface() throws Exception { runTest("compiler/testData/codegen/boxAgainstJava/interfaces/inheritJavaInterface.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxAgainstJavaCodegenTestGenerated.java index e748f3b8cc6..4b6b6073967 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBlackBoxAgainstJavaCodegenTestGenerated.java @@ -425,6 +425,11 @@ public class IrBlackBoxAgainstJavaCodegenTestGenerated extends AbstractIrBlackBo KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/interfaces"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @TestMetadata("defaultMethod.kt") + public void testDefaultMethod() throws Exception { + runTest("compiler/testData/codegen/boxAgainstJava/interfaces/defaultMethod.kt"); + } + @TestMetadata("inheritJavaInterface.kt") public void testInheritJavaInterface() throws Exception { runTest("compiler/testData/codegen/boxAgainstJava/interfaces/inheritJavaInterface.kt");