From 27afee8683f95f5bc36adb544dbfe1871344bc55 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 18 Aug 2023 18:59:18 +0200 Subject: [PATCH] K2: generate bounds for inner-class based raw types properly #KT-58579 Fixed --- .../kotlin/fir/java/JavaTypeConversion.kt | 15 +++++++++++++-- .../genericOnJavaWildcardBoundedByRaw.fir.kt | 19 ------------------- .../genericOnJavaWildcardBoundedByRaw.kt | 1 + 3 files changed, 14 insertions(+), 21 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.fir.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaTypeConversion.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaTypeConversion.kt index 0cbd48fc780..b574138e03b 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaTypeConversion.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaTypeConversion.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.utils.addToStdlib.runUnless import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment private fun ClassId.toConeFlexibleType( @@ -195,9 +196,9 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound( ?.toFirRegularClassSymbol(session)?.typeParameterSymbols // Given `C`, `C` -> `C..C<*>?`. when (mode) { - FirJavaTypeConversionMode.ANNOTATION_MEMBER -> Array(classifier.typeParameters.size) { ConeStarProjection } + FirJavaTypeConversionMode.ANNOTATION_MEMBER -> Array(classifier.allTypeParametersNumber()) { ConeStarProjection } else -> typeParameterSymbols?.getProjectionsForRawType(session) - ?: Array(classifier.typeParameters.size) { ConeStarProjection } + ?: Array(classifier.allTypeParametersNumber()) { ConeStarProjection } } } @@ -234,6 +235,16 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound( } } +private fun JavaClass.allTypeParametersNumber(): Int { + var current: JavaClass? = this + var result = 0 + while (current != null) { + result += current.typeParameters.size + current = if (current.isStatic) null else current.outerClass + } + return result +} + // Returns true for covariant read-only container that has mutable pair with invariant parameter // List does not make sense, but MutableList does // Same for Map diff --git a/compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.fir.kt b/compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.fir.kt deleted file mode 100644 index d58c03c3c1a..00000000000 --- a/compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -// ISSUE: KT-58579 -// FILE: Invariant.java -public class Invariant {} - -// FILE: Generic.java -public class Generic { - public class Inner {} - public static Invariant foo() { - return null; - } -} - -// FILE: Main.kt -fun main() { - val value = Generic.foo() - value.bar() -} - -fun T.bar() {} diff --git a/compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.kt b/compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.kt index c89720022b9..c67ac8e4bde 100644 --- a/compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.kt +++ b/compiler/testData/diagnostics/tests/inference/genericOnJavaWildcardBoundedByRaw.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-58579 // FILE: Invariant.java public class Invariant {}