From 675bf360493214f5ee3366292b18a00ca6f20849 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Tue, 12 Mar 2024 16:42:20 +0100 Subject: [PATCH] [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 --- ...iKtTypeByPsiTypeProviderTestGenerated.java | 30 ++++++++++++++ ...iKtTypeByPsiTypeProviderTestGenerated.java | 30 ++++++++++++++ ...tAnalysisApiKtTypeByPsiTypeProviderTest.kt | 39 ++++++++++++++----- ...iKtTypeByPsiTypeProviderTestGenerated.java | 30 ++++++++++++++ .../methodTypeParameterWithKotlinUseSite.kt | 9 +++++ .../methodTypeParameterWithKotlinUseSite.txt | 2 + .../methodTypeParameterWithMethodUseSite.kt | 9 +++++ .../methodTypeParameterWithMethodUseSite.txt | 2 + ...odTypeParameterWithTypeParameterUseSite.kt | 9 +++++ ...dTypeParameterWithTypeParameterUseSite.txt | 2 + .../typeParameterWithKotlinUseSite.kt | 7 ++++ .../typeParameterWithKotlinUseSite.txt | 2 + .../typeParameterWithMethodUseSite.kt | 7 ++++ .../typeParameterWithMethodUseSite.txt | 2 + .../kotlin/fir/java/JavaTypeConversion.kt | 9 ++++- .../fir/java/MutableJavaTypeParameterStack.kt | 9 ++--- 16 files changed, 182 insertions(+), 16 deletions(-) create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.txt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.txt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.txt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.txt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.txt diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java index 83f2ae7ee37..d24b3226be7 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java @@ -57,6 +57,24 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProvid runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/extends.kt"); } + @Test + @TestMetadata("methodTypeParameterWithKotlinUseSite.kt") + public void testMethodTypeParameterWithKotlinUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.kt"); + } + + @Test + @TestMetadata("methodTypeParameterWithMethodUseSite.kt") + public void testMethodTypeParameterWithMethodUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.kt"); + } + + @Test + @TestMetadata("methodTypeParameterWithTypeParameterUseSite.kt") + public void testMethodTypeParameterWithTypeParameterUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.kt"); + } + @Test @TestMetadata("methodTypeParameters.kt") public void testMethodTypeParameters() { @@ -81,6 +99,18 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProvid runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/primitive.kt"); } + @Test + @TestMetadata("typeParameterWithKotlinUseSite.kt") + public void testTypeParameterWithKotlinUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.kt"); + } + + @Test + @TestMetadata("typeParameterWithMethodUseSite.kt") + public void testTypeParameterWithMethodUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.kt"); + } + @Test @TestMetadata("typeParameters.kt") public void testTypeParameters() { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java index 6b50d6de664..068be255738 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java @@ -57,6 +57,24 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderT runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/extends.kt"); } + @Test + @TestMetadata("methodTypeParameterWithKotlinUseSite.kt") + public void testMethodTypeParameterWithKotlinUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.kt"); + } + + @Test + @TestMetadata("methodTypeParameterWithMethodUseSite.kt") + public void testMethodTypeParameterWithMethodUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.kt"); + } + + @Test + @TestMetadata("methodTypeParameterWithTypeParameterUseSite.kt") + public void testMethodTypeParameterWithTypeParameterUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.kt"); + } + @Test @TestMetadata("methodTypeParameters.kt") public void testMethodTypeParameters() { @@ -81,6 +99,18 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderT runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/primitive.kt"); } + @Test + @TestMetadata("typeParameterWithKotlinUseSite.kt") + public void testTypeParameterWithKotlinUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.kt"); + } + + @Test + @TestMetadata("typeParameterWithMethodUseSite.kt") + public void testTypeParameterWithMethodUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.kt"); + } + @Test @TestMetadata("typeParameters.kt") public void testTypeParameters() { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiKtTypeByPsiTypeProviderTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiKtTypeByPsiTypeProviderTest.kt index 81d79628e5b..f86271221fe 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiKtTypeByPsiTypeProviderTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiKtTypeByPsiTypeProviderTest.kt @@ -5,13 +5,13 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.psiTypeProvider -import com.intellij.psi.PsiJavaFile +import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod -import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.analysis.test.framework.utils.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.utils.printer.parentOfType import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices @@ -21,19 +21,14 @@ import org.jetbrains.kotlin.types.Variance abstract class AbstractAnalysisApiKtTypeByPsiTypeProviderTest : AbstractAnalysisApiBasedTest() { override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { - val psiMethod = testServices.moduleStructure.modules.map { module -> - val psiFiles = testServices.ktModuleProvider.getModuleFiles(module).filterIsInstance() - val javaFile = psiFiles.first() - val offset = testServices.expressionMarkerProvider.getCaretPosition(javaFile) - PsiTreeUtil.getParentOfType(javaFile.findElementAt(offset), PsiMethod::class.java) - }.single()!! + val (psiMethod, useSitePosition) = getTestDataContext(testServices) val actual = buildString { executeOnPooledThreadInReadAction { analyseForTest(mainFile) { val returnType = psiMethod.returnType testServices.assertions.assertNotNull(returnType) - val asKtTypeSuper = returnType!!.asKtType(psiMethod)!! + val asKtTypeSuper = returnType!!.asKtType(useSitePosition ?: psiMethod)!! appendLine("PsiType: $returnType") appendLine("KtType: ${asKtTypeSuper.render(position = Variance.OUT_VARIANCE)}") } @@ -43,3 +38,29 @@ abstract class AbstractAnalysisApiKtTypeByPsiTypeProviderTest : AbstractAnalysis testServices.assertions.assertEqualsToTestDataFileSibling(actual) } } + +private data class TestDataContext(val targetMethod: PsiMethod, val useSitePosition: PsiElement?) + +private fun getTestDataContext(testServices: TestServices): TestDataContext { + var psiMethod: PsiMethod? = null + var useSitePosition: PsiElement? = null + + testServices.moduleStructure.modules.forEach { module -> + val psiFiles = testServices.ktModuleProvider.getModuleFiles(module) + for (psiFile in psiFiles) { + val targetOffset = testServices.expressionMarkerProvider.getCaretPositionOrNull(psiFile) + if (targetOffset != null) { + if (psiMethod != null) error("Only one target method is expected") + psiMethod = psiFile.findElementAt(targetOffset)?.parentOfType(withSelf = true) + } + + val useSiteOffset = testServices.expressionMarkerProvider.getCaretPositionOrNull(psiFile, caretTag = "useSite") + if (useSiteOffset != null) { + if (useSitePosition != null) error("Only one target method is expected") + useSitePosition = psiFile.findElementAt(useSiteOffset)?.parentOfType(withSelf = true) + } + } + } + + return TestDataContext(psiMethod ?: error("Target method is not found"), useSitePosition) +} diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java index e49be5f496b..a5267a9d288 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypeProviderTestGenerated.java @@ -57,6 +57,24 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypePr runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/extends.kt"); } + @Test + @TestMetadata("methodTypeParameterWithKotlinUseSite.kt") + public void testMethodTypeParameterWithKotlinUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.kt"); + } + + @Test + @TestMetadata("methodTypeParameterWithMethodUseSite.kt") + public void testMethodTypeParameterWithMethodUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.kt"); + } + + @Test + @TestMetadata("methodTypeParameterWithTypeParameterUseSite.kt") + public void testMethodTypeParameterWithTypeParameterUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.kt"); + } + @Test @TestMetadata("methodTypeParameters.kt") public void testMethodTypeParameters() { @@ -81,6 +99,18 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiKtTypeByPsiTypePr runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/primitive.kt"); } + @Test + @TestMetadata("typeParameterWithKotlinUseSite.kt") + public void testTypeParameterWithKotlinUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.kt"); + } + + @Test + @TestMetadata("typeParameterWithMethodUseSite.kt") + public void testTypeParameterWithMethodUseSite() { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.kt"); + } + @Test @TestMetadata("typeParameters.kt") public void testTypeParameters() { diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.kt new file mode 100644 index 00000000000..27a768f48db --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.kt @@ -0,0 +1,9 @@ +// FILE: KotlinClass.kt +class KotlinClass + +// FILE: A.java +class JavaClass { + TYPE materialize() { + return null; + } +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.txt new file mode 100644 index 00000000000..13ef5fe42c5 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithKotlinUseSite.txt @@ -0,0 +1,2 @@ +PsiType: PsiType:TYPE +KtType: TYPE diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.kt new file mode 100644 index 00000000000..b56589cdf57 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.kt @@ -0,0 +1,9 @@ +// FILE: KotlinClass.kt +class KotlinClass + +// FILE: A.java +class JavaClass { + TYPE materialize() { + return null; + } +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.txt new file mode 100644 index 00000000000..d0d2edf5c71 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithMethodUseSite.txt @@ -0,0 +1,2 @@ +PsiType: PsiType:TYPE +KtType: TYPE? diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.kt new file mode 100644 index 00000000000..f46f2dfd19c --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.kt @@ -0,0 +1,9 @@ +// FILE: KotlinClass.kt +class KotlinClass + +// FILE: A.java +class JavaClass { + PE> TYPE materialize() { + return null; + } +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.txt new file mode 100644 index 00000000000..13ef5fe42c5 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/methodTypeParameterWithTypeParameterUseSite.txt @@ -0,0 +1,2 @@ +PsiType: PsiType:TYPE +KtType: TYPE diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.kt new file mode 100644 index 00000000000..936f7333a07 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.kt @@ -0,0 +1,7 @@ +// FILE: KotlinClass.kt +class KotlinClass + +// FILE: A.java +public interface A { + T foo(); +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.txt new file mode 100644 index 00000000000..95876755fa0 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithKotlinUseSite.txt @@ -0,0 +1,2 @@ +PsiType: PsiType:T +KtType: T diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.kt new file mode 100644 index 00000000000..e716e602414 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.kt @@ -0,0 +1,7 @@ +// FILE: KotlinClass.kt +class KotlinClass + +// FILE: A.java +public interface A { + T foo(); +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.txt new file mode 100644 index 00000000000..3aef682c854 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/asKtType/typeParameterWithMethodUseSite.txt @@ -0,0 +1,2 @@ +PsiType: PsiType:T +KtType: T? 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 a3877914fb9..88d7c64377e 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 @@ -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 -> { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt index 70716cc4bbc..d49a4d22c5c 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt @@ -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> { @@ -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> = snapshot.iterator() } } } abstract class JavaTypeParameterStack : Iterable> { - abstract operator fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol + abstract operator fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol? companion object { val EMPTY: JavaTypeParameterStack = MutableJavaTypeParameterStack()