From 20d50cfee78b0be9dc2c7a68e68171abc7c8bcb2 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Mon, 26 Jul 2021 14:08:21 +0300 Subject: [PATCH] Prevent leaking of type parameter erasion results cache into static scope --- ...irOldFrontendDiagnosticsTestGenerated.java | 12 +++++++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 12 +++++++++++ .../codegen/box/platformTypes/kt47785.kt | 9 +++------ .../interdependentTypeParameters.fir.kt | 12 +++++++++++ .../rawTypes/interdependentTypeParameters.kt | 12 +++++++++++ .../rawTypes/interdependentTypeParameters.txt | 20 +++++++++++++++++++ ...erdependentTypeParametersFromKotlin.fir.kt | 12 +++++++++++ .../interdependentTypeParametersFromKotlin.kt | 12 +++++++++++ ...interdependentTypeParametersFromKotlin.txt | 20 +++++++++++++++++++ .../rawTypes/intermediateRecursion.fir.kt | 13 ++++++++++++ .../rawTypes/intermediateRecursion.kt | 3 +-- .../test/runners/DiagnosticTestGenerated.java | 12 +++++++++++ .../java/ErasedOverridabilityCondition.kt | 2 +- .../load/java/lazy/types/JavaTypeResolver.kt | 5 +++-- .../kotlin/load/java/lazy/types/RawType.kt | 18 +++++++++-------- .../types/TypeParameterUpperBoundEraser.kt | 5 +++-- ...CompilerTestFE10TestdataTestGenerated.java | 12 +++++++++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 ----- .../IrJsCodegenBoxTestGenerated.java | 5 ----- .../semantics/JsCodegenBoxTestGenerated.java | 5 ----- 20 files changed, 170 insertions(+), 36 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.fir.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.txt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.fir.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.txt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.fir.kt 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 a53a5ec3f90..332af36c5cd 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 @@ -21826,6 +21826,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt"); } + @Test + @TestMetadata("interdependentTypeParameters.kt") + public void testInterdependentTypeParameters() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt"); + } + + @Test + @TestMetadata("interdependentTypeParametersFromKotlin.kt") + public void testInterdependentTypeParametersFromKotlin() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt"); + } + @Test @TestMetadata("intermediateRecursion.kt") public void testIntermediateRecursion() 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 5b37c62803a..398417459b3 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 @@ -21826,6 +21826,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt"); } + @Test + @TestMetadata("interdependentTypeParameters.kt") + public void testInterdependentTypeParameters() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt"); + } + + @Test + @TestMetadata("interdependentTypeParametersFromKotlin.kt") + public void testInterdependentTypeParametersFromKotlin() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt"); + } + @Test @TestMetadata("intermediateRecursion.kt") public void testIntermediateRecursion() throws Exception { diff --git a/compiler/testData/codegen/box/platformTypes/kt47785.kt b/compiler/testData/codegen/box/platformTypes/kt47785.kt index bf9e88f8563..89300d9b75d 100644 --- a/compiler/testData/codegen/box/platformTypes/kt47785.kt +++ b/compiler/testData/codegen/box/platformTypes/kt47785.kt @@ -1,4 +1,4 @@ -// DONT_TARGET_EXACT_BACKEND: WASM +// TARGET_BACKEND: JVM // FULL_JDK // FILE: AbstractAssert.java @@ -61,11 +61,9 @@ extends AbstractAssertWithOriginWithColumnsAndRows imp } // FILE: AbstractValueAssert.java -import java.time.LocalDateTime; - public abstract class AbstractValueAssert, A extends AbstractDbAssert, S extends AbstractSubAssert, V extends AbstractValueAssert, C extends AbstractColumnAssert, CV extends AbstractColumnValueAssert, R extends AbstractRowAssert, RV extends AbstractRowValueAssert> extends AbstractAssertWithOriginWithColumnsAndRows { - public V isEqualTo(LocalDateTime expected) { + public V isEqualTo(String expected) { return (V) new RequestRowValueAssert(); } } @@ -115,10 +113,9 @@ public interface RowElement {} import java.time.LocalDateTime fun test(x: RequestAssert) { - val timestamp = LocalDateTime.now() x.hasNumberOfRows(1) .row() - .value("message_time").isEqualTo(timestamp) + .value("message_time").isEqualTo("") } fun box(): String { diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.fir.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.fir.kt new file mode 100644 index 00000000000..3ecebfdf979 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.fir.kt @@ -0,0 +1,12 @@ +// FILE: Boo.java +public class Boo {} + +// FILE: Foo.java +public class Foo, P2 extends Boo, P3 extends Boo, P4 extends Boo> { + static Foo test1() { return null; } +} + +// FILE: main.kt +fun main() { + val x = ..Boo<*>?!, Boo<*>..Boo<*>?!, Boo<*>..Boo<*>?!, Boo<*>..Boo<*>?!>..Foo<*, *, *, *>?!")!>Foo.test1() +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt new file mode 100644 index 00000000000..8bdb8efefc9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt @@ -0,0 +1,12 @@ +// FILE: Boo.java +public class Boo {} + +// FILE: Foo.java +public class Foo, P2 extends Boo, P3 extends Boo, P4 extends Boo> { + static Foo test1() { return null; } +} + +// FILE: main.kt +fun main() { + val x = ..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?), (Boo<*>..Boo<*>?), (Boo<(Boo<(Boo<*>..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?)>..Boo<(Boo<(Boo<*>..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?)>?), (Boo<(Boo<(Boo<*>..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?)>..Boo<(Boo<(Boo<*>..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?)>?)>..Foo..Boo<*>?)>..Boo..Boo<*>?)>?), out (Boo<*>..Boo<*>?), out (Boo..Boo<*>?)>..Boo..Boo<*>?)>?)>..Boo..Boo<*>?)>..Boo..Boo<*>?)>?)>?), out (Boo..Boo<*>?)>..Boo..Boo<*>?)>?)>..Boo..Boo<*>?)>..Boo..Boo<*>?)>?)>?)>?)")!>Foo.test1() +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.txt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.txt new file mode 100644 index 00000000000..bad726fcff6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.txt @@ -0,0 +1,20 @@ +package + +public fun main(): kotlin.Unit + +public open class Boo { + public constructor Boo() + 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 open class Foo!, /*1*/ P2 : Boo!, /*2*/ P3 : Boo!, /*3*/ P4 : Boo!> { + public constructor Foo!, /*1*/ P2 : Boo!, /*2*/ P3 : Boo!, /*3*/ P4 : Boo!>() + 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 + + // Static members + public/*package*/ open fun test1(): (Foo<(raw) Boo!>!, (raw) Boo<*>!, (raw) Boo!>!>!, (raw) Boo!>!>!>..Foo!>!, out Boo<*>!, out Boo!>!>!, out Boo!>!>!>?) +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.fir.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.fir.kt new file mode 100644 index 00000000000..f5d744a6336 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.fir.kt @@ -0,0 +1,12 @@ +// FILE: Boo.java +public class Boo { + static Foo test1() { return null; } +} + +// FILE: Foo.kt +class Foo, P2 : Boo, P3 : Boo, P4 : Boo> {} + +// FILE: main.kt +fun main() { + val x = , Boo<*, *, *>, Boo<*, *, *>, Boo<*, *, *>>..Foo, out Boo<*, *, *>, out Boo<*, *, *>, out Boo<*, *, *>>?!")!>Boo.test1() +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt new file mode 100644 index 00000000000..92ab706d78f --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt @@ -0,0 +1,12 @@ +// FILE: Boo.java +public class Boo { + static Foo test1() { return null; } +} + +// FILE: Foo.kt +class Foo, P2 : Boo, P3 : Boo, P4 : Boo> {} + +// FILE: main.kt +fun main() { + val x = >, Boo<*, *, *>>, Boo<*, *, Boo<*, *, *>>, Boo<*, *, *>>, Boo<*, Boo<*, *, Boo<*, *, *>>, Boo<*, *, *>>, Boo<*, *, Boo<*, *, *>>, Boo<*, *, *>>..Foo>, out Boo<*, *, *>>, out Boo<*, *, out Boo<*, *, *>>, out Boo<*, *, *>>, out Boo<*, out Boo<*, *, out Boo<*, *, *>>, out Boo<*, *, *>>, out Boo<*, *, out Boo<*, *, *>>, out Boo<*, *, *>>?)")!>Boo.test1() +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.txt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.txt new file mode 100644 index 00000000000..e334ecbf674 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.txt @@ -0,0 +1,20 @@ +package + +public fun main(): kotlin.Unit + +public open class Boo { + public constructor Boo() + 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 + + // Static members + public/*package*/ open fun test1(): (Foo<(raw) Boo>, Boo<*, *, *>>, Boo<*, *, Boo<*, *, *>>, Boo<*, *, *>>, (raw) Boo<*, Boo<*, *, Boo<*, *, *>>, Boo<*, *, *>>, (raw) Boo<*, *, Boo<*, *, *>>, (raw) Boo<*, *, *>>..Foo>, out Boo<*, *, *>>, out Boo<*, *, out Boo<*, *, *>>, out Boo<*, *, *>>, out Boo<*, out Boo<*, *, out Boo<*, *, *>>, out Boo<*, *, *>>, out Boo<*, *, out Boo<*, *, *>>, out Boo<*, *, *>>?) +} + +public final class Foo, /*1*/ P2 : Boo, /*2*/ P3 : Boo, /*3*/ P4 : Boo> { + public constructor Foo, /*1*/ P2 : Boo, /*2*/ P3 : Boo, /*3*/ P4 : Boo>() + 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 +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.fir.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.fir.kt new file mode 100644 index 00000000000..dd05a659545 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.fir.kt @@ -0,0 +1,13 @@ +// FILE: Boo.java +public class Boo {} + +// FILE: Foo.java +public class Foo, K extends Boo, X extends Boo> { + T test2() { return null; } + static Foo test1() { return null; } +} + +// FILE: main.kt +fun main() { + val x = ..Boo<*>?!, Boo<*>..Boo<*>?!, Boo<*>..Boo<*>?!>..Foo<*, *, *>?!")!>Foo.test1().test2() +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.kt index 0e4ff4e3f1d..44f3b7ce96f 100644 --- a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.kt +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/intermediateRecursion.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // FILE: Boo.java public class Boo {} @@ -10,5 +9,5 @@ public class Foo, K extends Boo, X extends Boo> { // FILE: main.kt fun main() { - val x = Foo.test1().test2() + val x = ..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?)>..Boo<(Boo<(Boo<*>..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?)>?), (Boo<(Boo<*>..Boo<*>?)>..Boo<(Boo<*>..Boo<*>?)>?), (Boo<*>..Boo<*>?)>..Foo..Boo<*>?)>..Boo..Boo<*>?)>?)>..Boo..Boo<*>?)>..Boo..Boo<*>?)>?)>?), out (Boo..Boo<*>?)>..Boo..Boo<*>?)>?), out (Boo<*>..Boo<*>?)>?)")!>Foo.test1().test2() } 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 a05458e5be4..13a2a787993 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 @@ -21832,6 +21832,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt"); } + @Test + @TestMetadata("interdependentTypeParameters.kt") + public void testInterdependentTypeParameters() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt"); + } + + @Test + @TestMetadata("interdependentTypeParametersFromKotlin.kt") + public void testInterdependentTypeParametersFromKotlin() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt"); + } + @Test @TestMetadata("intermediateRecursion.kt") public void testIntermediateRecursion() throws Exception { diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt index f120cd1b210..b9ff83ccdca 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt @@ -43,7 +43,7 @@ class ErasedOverridabilityCondition : ExternalOverridabilityCondition { if (signatureTypes.any { it.arguments.isNotEmpty() && it.unwrap() !is RawTypeImpl }) return Result.UNKNOWN - var erasedSuper = superDescriptor.substitute(RawSubstitution.buildSubstitutor()) ?: return Result.UNKNOWN + var erasedSuper = superDescriptor.substitute(RawSubstitution().buildSubstitutor()) ?: return Result.UNKNOWN if (erasedSuper is SimpleFunctionDescriptor && erasedSuper.typeParameters.isNotEmpty()) { // Only simple functions are supported now for erased overrides diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt index 4f50bbb8814..7fa0d14e338 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt @@ -41,7 +41,8 @@ class JavaTypeResolver( private val c: LazyJavaResolverContext, private val typeParameterResolver: TypeParameterResolver ) { - val typeParameterUpperBoundEraser = TypeParameterUpperBoundEraser() + private val typeParameterUpperBoundEraser = TypeParameterUpperBoundEraser() + private val rawSubstitution = RawSubstitution(typeParameterUpperBoundEraser) fun transformJavaType(javaType: JavaType?, attr: JavaTypeAttributes): KotlinType { return when (javaType) { @@ -237,7 +238,7 @@ class JavaTypeResolver( ) } - RawSubstitution.computeProjection( + rawSubstitution.computeProjection( parameter, // if erasure happens due to invalid arguments number, use star projections instead if (isRaw) attr else attr.withFlexibility(INFLEXIBLE), diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt index 0d73bf45c36..1dcb57e070c 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/RawType.kt @@ -51,7 +51,7 @@ class RawTypeImpl private constructor(lowerBound: SimpleType, upperBound: Simple get() { val classDescriptor = constructor.declarationDescriptor as? ClassDescriptor ?: error("Incorrect classifier: ${constructor.declarationDescriptor}") - return classDescriptor.getMemberScope(RawSubstitution) + return classDescriptor.getMemberScope(RawSubstitution()) } override fun replaceAnnotations(newAnnotations: Annotations) = @@ -101,14 +101,11 @@ class RawTypeImpl private constructor(lowerBound: SimpleType, upperBound: Simple } } -internal object RawSubstitution : TypeSubstitution() { +internal class RawSubstitution(typeParameterUpperBoundEraser: TypeParameterUpperBoundEraser? = null) : TypeSubstitution() { + private val typeParameterUpperBoundEraser = typeParameterUpperBoundEraser ?: TypeParameterUpperBoundEraser(this) + override fun get(key: KotlinType) = TypeProjectionImpl(eraseType(key)) - private val typeParameterUpperBoundEraser = TypeParameterUpperBoundEraser() - - private val lowerTypeAttr = TypeUsage.COMMON.toAttributes().withFlexibility(JavaTypeFlexibility.FLEXIBLE_LOWER_BOUND) - private val upperTypeAttr = TypeUsage.COMMON.toAttributes().withFlexibility(JavaTypeFlexibility.FLEXIBLE_UPPER_BOUND) - private fun eraseType(type: KotlinType, attr: JavaTypeAttributes = JavaTypeAttributes(TypeUsage.COMMON)): KotlinType { return when (val declaration = type.constructor.declarationDescriptor) { is TypeParameterDescriptor -> @@ -153,7 +150,7 @@ internal object RawSubstitution : TypeSubstitution() { if (type.isError) return ErrorUtils.createErrorType("Raw error type: ${type.constructor}") to false - val memberScope = declaration.getMemberScope(RawSubstitution) + val memberScope = declaration.getMemberScope(this) return KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( type.annotations, declaration.typeConstructor, declaration.typeConstructor.parameters.map { parameter -> @@ -199,4 +196,9 @@ internal object RawSubstitution : TypeSubstitution() { } override fun isEmpty() = false + + companion object { + private val lowerTypeAttr = TypeUsage.COMMON.toAttributes().withFlexibility(JavaTypeFlexibility.FLEXIBLE_LOWER_BOUND) + private val upperTypeAttr = TypeUsage.COMMON.toAttributes().withFlexibility(JavaTypeFlexibility.FLEXIBLE_UPPER_BOUND) + } } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/TypeParameterUpperBoundEraser.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/TypeParameterUpperBoundEraser.kt index 428f97ca235..115d70c47d4 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/TypeParameterUpperBoundEraser.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/types/TypeParameterUpperBoundEraser.kt @@ -13,11 +13,12 @@ import org.jetbrains.kotlin.types.typeUtil.extractTypeParametersFromUpperBounds import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjectionOrMapped import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections -class TypeParameterUpperBoundEraser { +internal class TypeParameterUpperBoundEraser(rawSubstitution: RawSubstitution? = null) { private val storage = LockBasedStorageManager("Type parameter upper bound erasion results") private val erroneousErasedBound by lazy { ErrorUtils.createErrorType("Can't compute erased upper bound of type parameter `$this`") } + private val rawSubstitution = rawSubstitution ?: RawSubstitution(this) private data class DataToEraseUpperBound( val typeParameter: TypeParameterDescriptor, @@ -83,7 +84,7 @@ class TypeParameterUpperBoundEraser { */ val erasedUpperBounds = typeParameter.defaultType.extractTypeParametersFromUpperBounds(visitedTypeParameters).associate { val boundProjection = if (visitedTypeParameters == null || it !in visitedTypeParameters) { - RawSubstitution.computeProjection( + rawSubstitution.computeProjection( it, // if erasure happens due to invalid arguments number, use star projections instead if (isRaw) typeAttr else typeAttr.withFlexibility(JavaTypeFlexibility.INFLEXIBLE), diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index ff24d9938b6..9d4855739fc 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -21826,6 +21826,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt"); } + @Test + @TestMetadata("interdependentTypeParameters.kt") + public void testInterdependentTypeParameters() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParameters.kt"); + } + + @Test + @TestMetadata("interdependentTypeParametersFromKotlin.kt") + public void testInterdependentTypeParametersFromKotlin() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interdependentTypeParametersFromKotlin.kt"); + } + @Test @TestMetadata("intermediateRecursion.kt") public void testIntermediateRecursion() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 9efab1ca315..0733926f180 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -18664,11 +18664,6 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/platformTypes/inferenceFlexibleTToNullable.kt"); } - @TestMetadata("kt47785.kt") - public void testKt47785() throws Exception { - runTest("compiler/testData/codegen/box/platformTypes/kt47785.kt"); - } - @TestMetadata("compiler/testData/codegen/box/platformTypes/primitives") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 5e1a8152cc2..76c1bd6e39e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -18070,11 +18070,6 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/platformTypes/inferenceFlexibleTToNullable.kt"); } - @TestMetadata("kt47785.kt") - public void testKt47785() throws Exception { - runTest("compiler/testData/codegen/box/platformTypes/kt47785.kt"); - } - @TestMetadata("compiler/testData/codegen/box/platformTypes/primitives") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 0cf3d36c51b..5aebd79dc1b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -18135,11 +18135,6 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/platformTypes/inferenceFlexibleTToNullable.kt"); } - @TestMetadata("kt47785.kt") - public void testKt47785() throws Exception { - runTest("compiler/testData/codegen/box/platformTypes/kt47785.kt"); - } - @TestMetadata("compiler/testData/codegen/box/platformTypes/primitives") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)