From f1ce57f08f24b225b0773faac2e5d34ed716e719 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Wed, 27 Dec 2023 20:22:24 -0800 Subject: [PATCH] AA: handle PsiType conversion for recursive type parameter case (again) ^KT-64595 fixed --- .../api/fir/components/KtFirPsiTypeProvider.kt | 14 ++++++++++---- ...ApiExpressionPsiTypeProviderTestGenerated.java | 12 +++++++++--- ...ApiExpressionPsiTypeProviderTestGenerated.java | 12 +++++++++--- ...ApiExpressionPsiTypeProviderTestGenerated.java | 12 +++++++++--- ...r.kt => recursiveTypeParameter_localSimple.kt} | 0 ...txt => recursiveTypeParameter_localSimple.txt} | 0 ...cursiveTypeParameter_localWithTypeParameter.kt | 15 +++++++++++++++ ...ursiveTypeParameter_localWithTypeParameter.txt | 2 ++ 8 files changed, 54 insertions(+), 13 deletions(-) rename analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/{recursiveTypeParameter.kt => recursiveTypeParameter_localSimple.kt} (100%) rename analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/{recursiveTypeParameter.txt => recursiveTypeParameter_localSimple.txt} (100%) create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.txt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt index 7b526afd6d6..adce38f3bfb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirPsiTypeProvider.kt @@ -120,7 +120,6 @@ internal class KtFirPsiTypeProvider( type = javaType } - val javaTypeParameterStack = MutableJavaTypeParameterStack() var psiClass = PsiTreeUtil.getContextOfType(useSitePosition, PsiClass::class.java, false) @@ -169,7 +168,11 @@ internal class KtFirPsiTypeProvider( private fun ConeKotlinType.simplifyType( session: FirSession, useSitePosition: PsiElement, + visited: MutableSet = mutableSetOf() ): ConeKotlinType { + // E.g., Wrapper : Comparable> + if (!visited.add(this)) return this + val substitutor = AnonymousTypesSubstitutor(session) val visibilityForApproximation = useSitePosition.visibilityForApproximation // TODO: See if the given [useSitePosition] is an `inline` method @@ -192,7 +195,11 @@ private fun ConeKotlinType.simplifyType( } while (oldType !== currentType) if (typeArguments.isNotEmpty()) { - currentType = currentType.withArguments { it.replaceType(it.type?.simplifyType(session, useSitePosition)) } + currentType = currentType.withArguments { typeProjection -> + typeProjection.replaceType( + typeProjection.type?.simplifyType(session, useSitePosition, visited) + ) + } } return currentType } @@ -342,13 +349,12 @@ private class AnonymousTypesSubstitutor( visited: MutableSet = mutableSetOf() ): Boolean { if (typeArguments.isEmpty()) return false - visited.add(this) + if (!visited.add(this)) return true for (projection in typeArguments) { // E.g., Test : Comparable val type = (projection as? ConeKotlinTypeProjection)?.type ?: continue // E.g., Comparable val newType = substituteOrNull(type) ?: continue - if (newType in visited) return true // Visit new type: e.g., Test, as a type argument, is substituted with Comparable, again. if (newType.hasRecursiveTypeArgument(visited)) return true } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java index eff87bdacb8..c63eb878c77 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java @@ -77,9 +77,15 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProv } @Test - @TestMetadata("recursiveTypeParameter.kt") - public void testRecursiveTypeParameter() throws Exception { - runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter.kt"); + @TestMetadata("recursiveTypeParameter_localSimple.kt") + public void testRecursiveTypeParameter_localSimple() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localSimple.kt"); + } + + @Test + @TestMetadata("recursiveTypeParameter_localWithTypeParameter.kt") + public void testRecursiveTypeParameter_localWithTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.kt"); } @Test diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java index 4aa08823cbd..140e4f253d4 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java @@ -77,9 +77,15 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProvide } @Test - @TestMetadata("recursiveTypeParameter.kt") - public void testRecursiveTypeParameter() throws Exception { - runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter.kt"); + @TestMetadata("recursiveTypeParameter_localSimple.kt") + public void testRecursiveTypeParameter_localSimple() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localSimple.kt"); + } + + @Test + @TestMetadata("recursiveTypeParameter_localWithTypeParameter.kt") + public void testRecursiveTypeParameter_localWithTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.kt"); } @Test diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java index e746b90e0d6..1f5db645611 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java @@ -77,9 +77,15 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiType } @Test - @TestMetadata("recursiveTypeParameter.kt") - public void testRecursiveTypeParameter() throws Exception { - runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter.kt"); + @TestMetadata("recursiveTypeParameter_localSimple.kt") + public void testRecursiveTypeParameter_localSimple() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localSimple.kt"); + } + + @Test + @TestMetadata("recursiveTypeParameter_localWithTypeParameter.kt") + public void testRecursiveTypeParameter_localWithTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.kt"); } @Test diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localSimple.kt similarity index 100% rename from analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter.kt rename to analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localSimple.kt diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localSimple.txt similarity index 100% rename from analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter.txt rename to analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localSimple.txt diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.kt new file mode 100644 index 00000000000..69a4fb7428c --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.kt @@ -0,0 +1,15 @@ +// WITH_STDLIB + +fun checkTransitiveComparator(list: List, comparator: Comparator) { + class Wrapper(val item: T) : Comparable { + override fun toString(): String = item.toString() + + override fun compareTo(other: Wrapper): Int { + return comparator.compare(this.item, other.item) + } + } + checkTransitiveComparator(list.map { Wrapper(it) }) +} + +fun > checkTransitiveComparator(list: List) { +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.txt new file mode 100644 index 00000000000..af20d97efef --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/recursiveTypeParameter_localWithTypeParameter.txt @@ -0,0 +1,2 @@ +KtType: kotlin.collections.List +PsiType: PsiType:List>>