From fcba1f215a05c6f332ba91ab12d8b10f47a154ea Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 10 Nov 2022 22:50:08 -0800 Subject: [PATCH] AA: handle erroneous type in nested type argument --- .../components/KtFe10PsiTypeProvider.kt | 9 +++++-- ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ .../fir/components/KtFirPsiTypeProvider.kt | 26 ++++++++++--------- ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ ...alysisApiPsiTypeProviderTestGenerated.java | 6 +++++ .../errorTypeInNestedTypeArgument.kt | 9 +++++++ .../errorTypeInNestedTypeArgument.txt | 2 ++ .../types/checker/ClassicTypeSystemContext.kt | 2 +- 9 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt create mode 100644 analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt index b453b5e45d1..91a9f1b064b 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10PsiTypeProvider.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.load.kotlin.getOptimalModeForReturnType import org.jetbrains.kotlin.load.kotlin.getOptimalModeForValueParameter import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.types.model.SimpleTypeMarker import java.text.StringCharacterIterator internal class KtFe10PsiTypeProvider( @@ -43,8 +44,10 @@ internal class KtFe10PsiTypeProvider( ): PsiType? { val kotlinType = (type as KtFe10Type).type - if (kotlinType.isError || kotlinType.arguments.any { !it.isStarProjection && it.type.isError }) { - return null + with(typeMapper.typeContext) { + if (kotlinType.contains { it.isError() }) { + return null + } } return asPsiType(simplifyType(kotlinType), useSitePosition, mode.toTypeMappingMode(type, isAnnotationMethod)) @@ -79,6 +82,8 @@ internal class KtFe10PsiTypeProvider( } private fun asPsiType(type: KotlinType, useSitePosition: PsiElement, mode: TypeMappingMode): PsiType? { + if (type !is SimpleTypeMarker) return null + val signatureWriter = BothSignatureWriter(BothSignatureWriter.Mode.SKIP_CHECKS) typeMapper.mapType(type, mode, signatureWriter) diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index 1794b62226d..97c87fe716f 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/psiTypeProvider/Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -64,6 +64,12 @@ public class Fe10IdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGene runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/anonymousObject_exposedAsReturnValue.kt"); } + @Test + @TestMetadata("errorTypeInNestedTypeArgument.kt") + public void testErrorTypeInNestedTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { 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 932edc1e5d6..bbada4dd898 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 @@ -53,12 +53,18 @@ internal class KtFirPsiTypeProvider( useSitePosition: PsiElement, mode: KtTypeMappingMode, isAnnotationMethod: Boolean, - ): PsiType? = type.coneType.asPsiType( - rootModuleSession, - mode.toTypeMappingMode(type, isAnnotationMethod), - useSitePosition - ) + ): PsiType? { + val coneType = type.coneType + with(rootModuleSession.typeContext) { + if (coneType.contains { it.isError() }) { + return null + } + } + + return coneType.simplifyType(rootModuleSession, useSitePosition) + .asPsiType(rootModuleSession, mode.toTypeMappingMode(type, isAnnotationMethod), useSitePosition) + } private fun KtTypeMappingMode.toTypeMappingMode(type: KtType, isAnnotationMethod: Boolean): TypeMappingMode { require(type is KtFirType) @@ -174,21 +180,17 @@ private fun ConeKotlinType.isLocalButAvailableAtPosition( context.parents.any { it == localPsi } } -internal fun ConeKotlinType.asPsiType( +private fun ConeKotlinType.asPsiType( session: FirSession, mode: TypeMappingMode, useSitePosition: PsiElement, ): PsiType? { - val correctedType = simplifyType(session, useSitePosition) - - if (correctedType is ConeErrorType || correctedType !is SimpleTypeMarker) return null - - if (correctedType.typeArguments.any { it is ConeErrorType }) return null + if (this !is SimpleTypeMarker) return null val signatureWriter = BothSignatureWriter(BothSignatureWriter.Mode.SKIP_CHECKS) //TODO Check thread safety - session.jvmTypeMapper.mapType(correctedType, mode, signatureWriter) + session.jvmTypeMapper.mapType(this, mode, signatureWriter) val canonicalSignature = signatureWriter.toString() require(!canonicalSignature.contains(SpecialNames.ANONYMOUS_STRING)) diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index 97dd1178183..f711ceb6353 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -64,6 +64,12 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGe runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/anonymousObject_exposedAsReturnValue.kt"); } + @Test + @TestMetadata("errorTypeInNestedTypeArgument.kt") + public void testErrorTypeInNestedTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index d8162a953a1..0129c04b830 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -64,6 +64,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGener runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/anonymousObject_exposedAsReturnValue.kt"); } + @Test + @TestMetadata("errorTypeInNestedTypeArgument.kt") + public void testErrorTypeInNestedTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java index 731ce4bc046..af647b5e92f 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTestGenerated.java @@ -64,6 +64,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiPsiTypeProviderTe runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/anonymousObject_exposedAsReturnValue.kt"); } + @Test + @TestMetadata("errorTypeInNestedTypeArgument.kt") + public void testErrorTypeInNestedTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt"); + } + @Test @TestMetadata("localClass_exposedAsReturnValue.kt") public void testLocalClass_exposedAsReturnValue() throws Exception { diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt new file mode 100644 index 00000000000..5cb6d9330e7 --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.kt @@ -0,0 +1,9 @@ +class A + +class B + +class C { + fun foo() = object : B> { + + } +} diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.txt new file mode 100644 index 00000000000..593c38a31ba --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forDeclaration/errorTypeInNestedTypeArgument.txt @@ -0,0 +1,2 @@ +KtType: B> +PsiType: null diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt index c0ac684d1c1..a7edda92184 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -362,7 +362,7 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy * - type for type parameter * - captured type * - * Such types can contains error types in our arguments, but type constructor isn't errorTypeConstructor + * Such types can contain error types in our arguments, but type constructor isn't errorTypeConstructor */ override fun SimpleTypeMarker.isSingleClassifierType(): Boolean { require(this is SimpleType, this::errorMessage)