[FIR] JavaTypeParameterStack: allow nullable return from get

It is not always possible to have the correct mapping,
at least on the Analysis API side

^KT-66530 Fixed
This commit is contained in:
Dmitrii Gridin
2024-03-12 16:42:20 +01:00
committed by Space Team
parent eb8054ac1e
commit 675bf36049
16 changed files with 182 additions and 16 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.java.enhancement.readOnlyToMutable
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
@@ -214,7 +215,11 @@ private fun JavaClassifierType.toConeKotlinTypeForFlexibleBound(
is JavaTypeParameter -> {
val symbol = javaTypeParameterStack[classifier]
ConeTypeParameterTypeImpl(symbol.toLookupTag(), isNullable = lowerBound != null, attributes)
if (symbol != null) {
ConeTypeParameterTypeImpl(symbol.toLookupTag(), isNullable = lowerBound != null, attributes)
} else {
ConeErrorType(ConeUnresolvedNameError(classifier.name))
}
}
null -> {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@@ -19,9 +19,8 @@ class MutableJavaTypeParameterStack : JavaTypeParameterStack() {
typeParameterMap += javaTypeParameterStack.typeParameterMap
}
override operator fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol {
override operator fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol? {
return typeParameterMap[javaTypeParameter]
?: throw IllegalArgumentException("Cannot find Java type parameter $javaTypeParameter in stack")
}
override operator fun iterator(): Iterator<Map.Entry<JavaTypeParameter, FirTypeParameterSymbol>> {
@@ -31,14 +30,14 @@ class MutableJavaTypeParameterStack : JavaTypeParameterStack() {
fun snapshot(): JavaTypeParameterStack {
val snapshot = typeParameterMap.toMap()
return object : JavaTypeParameterStack() {
override fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol = snapshot.getValue(javaTypeParameter)
override fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol? = snapshot[javaTypeParameter]
override fun iterator(): Iterator<Map.Entry<JavaTypeParameter, FirTypeParameterSymbol>> = snapshot.iterator()
}
}
}
abstract class JavaTypeParameterStack : Iterable<Map.Entry<JavaTypeParameter, FirTypeParameterSymbol>> {
abstract operator fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol
abstract operator fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol?
companion object {
val EMPTY: JavaTypeParameterStack = MutableJavaTypeParameterStack()