diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index ad6053a6a11..f9d0af0c8f7 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -15223,6 +15223,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/contravariance.kt"); } + @Test + @TestMetadata("covariance.kt") + public void testCovariance() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.kt"); + } + @Test @TestMetadata("kt45461.kt") public void testKt45461() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index a0748eb5d9d..b53a309bd22 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -15223,6 +15223,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/contravariance.kt"); } + @Test + @TestMetadata("covariance.kt") + public void testCovariance() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.kt"); + } + @Test @TestMetadata("kt45461.kt") public void testKt45461() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index f68c3d4e6cb..e06077499b1 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -15223,6 +15223,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/contravariance.kt"); } + @Test + @TestMetadata("covariance.kt") + public void testCovariance() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.kt"); + } + @Test @TestMetadata("kt45461.kt") public void testKt45461() throws Exception { diff --git a/compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.kt b/compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.kt new file mode 100644 index 00000000000..fdd8a50f435 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.kt @@ -0,0 +1,23 @@ +// FIR_IDENTICAL +class KotlinSharedNativeCompilation() : KotlinMetadataCompilation, AbstractKotlinCompilation() + +interface KotlinCommonOptions + +interface KotlinMetadataCompilation : KotlinCompilation + +interface KotlinCompilation + +class KotlinCommonCompilation : KotlinMetadataCompilation, AbstractKotlinCompilation() + +interface KotlinMultiplatformCommonOptions : KotlinCommonOptions + +abstract class AbstractKotlinCompilation : KotlinCompilation + +fun main() { + val compilation = when { + true -> { + KotlinSharedNativeCompilation() + } + else -> KotlinCommonCompilation() + } +} diff --git a/compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.txt b/compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.txt new file mode 100644 index 00000000000..caeab82a12c --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.txt @@ -0,0 +1,48 @@ +package + +public fun main(): kotlin.Unit + +public abstract class AbstractKotlinCompilation : KotlinCompilation { + public constructor AbstractKotlinCompilation() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class KotlinCommonCompilation : KotlinMetadataCompilation, AbstractKotlinCompilation { + public constructor KotlinCommonCompilation() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinCommonOptions { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinCompilation { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinMetadataCompilation : KotlinCompilation { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinMultiplatformCommonOptions : KotlinCommonOptions { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class KotlinSharedNativeCompilation : KotlinMetadataCompilation, AbstractKotlinCompilation { + public constructor KotlinSharedNativeCompilation() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index d4d8238cf0f..b8b03e1dcd4 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -15229,6 +15229,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/contravariance.kt"); } + @Test + @TestMetadata("covariance.kt") + public void testCovariance() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/emptyIntersectionTypes/covariance.kt"); + } + @Test @TestMetadata("kt45461.kt") public void testKt45461() throws Exception { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index 5f9d0ce122b..edf910dd96e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -30,19 +30,20 @@ import org.jetbrains.kotlin.utils.sure import java.util.* class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: TypeSubstitutor) : MemberScope { - val substitutor = givenSubstitutor.substitution.wrapWithCapturingSubstitution().buildSubstitutor() + val substitutor by lazy { givenSubstitutor.substitution.buildSubstitutor() } + private val capturingSubstitutor = givenSubstitutor.substitution.wrapWithCapturingSubstitution().buildSubstitutor() private var substitutedDescriptors: MutableMap? = null private val _allDescriptors by lazy { substitute(workerScope.getContributedDescriptors()) } fun substitute(type: KotlinType): KotlinType { - if (substitutor.isEmpty) return type - return substitutor.safeSubstitute(type) as KotlinType + if (capturingSubstitutor.isEmpty) return type + return capturingSubstitutor.safeSubstitute(type) as KotlinType } private fun substitute(descriptor: D): D { - if (substitutor.isEmpty) return descriptor + if (capturingSubstitutor.isEmpty) return descriptor if (substitutedDescriptors == null) { substitutedDescriptors = HashMap() @@ -50,7 +51,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: val substituted = substitutedDescriptors!!.getOrPut(descriptor) { when (descriptor) { - is Substitutable<*> -> descriptor.substitute(substitutor).sure { + is Substitutable<*> -> descriptor.substitute(capturingSubstitutor).sure { "We expect that no conflict should happen while substitution is guaranteed to generate invariant projection, " + "but $descriptor substitution fails" } @@ -63,7 +64,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: } private fun substitute(descriptors: Collection): Collection { - if (substitutor.isEmpty) return descriptors + if (capturingSubstitutor.isEmpty) return descriptors if (descriptors.isEmpty()) return descriptors val result = newLinkedHashSetWithExpectedSize(descriptors.size) @@ -97,7 +98,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: p.println("substitutor = ") p.pushIndent() - p.println(substitutor) + p.println(capturingSubstitutor) p.popIndent() p.print("workerScope = ")