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 45279c0ba40..317efa4633c 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 @@ -58,6 +58,12 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProv runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/class_object_constructor.kt"); } + @Test + @TestMetadata("localClassWithUnresolvedSuperType.kt") + public void testLocalClassWithUnresolvedSuperType() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.kt"); + } + @Test @TestMetadata("typeParamFlexibleUpperBound.kt") public void testTypeParamFlexibleUpperBound() throws Exception { 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 6cedaac04e3..0ff138948ec 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 @@ -58,6 +58,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProvide runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/class_object_constructor.kt"); } + @Test + @TestMetadata("localClassWithUnresolvedSuperType.kt") + public void testLocalClassWithUnresolvedSuperType() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.kt"); + } + @Test @TestMetadata("typeParamFlexibleUpperBound.kt") public void testTypeParamFlexibleUpperBound() throws Exception { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt index 72ed94e9b2e..e47c461c3e0 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt @@ -6,8 +6,12 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.psiTypeProvider import org.jetbrains.kotlin.analysis.api.analyze +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.psiTypeProvider.AnalysisApiPsiTypeProviderTestUtils.findLightDeclarationContext +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.psiTypeProvider.AnalysisApiPsiTypeProviderTestUtils.getContainingKtLightClass import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.utils.printer.parentOfType +import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule @@ -15,13 +19,18 @@ import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.assertions import org.jetbrains.kotlin.types.Variance -abstract class AbstractAnalysisApiExpressionPsiTypeProviderTest : AbstractAnalysisApiSingleFileTest(){ +abstract class AbstractAnalysisApiExpressionPsiTypeProviderTest : AbstractAnalysisApiSingleFileTest() { override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { val declarationAtCaret = testServices.expressionMarkerProvider.getSelectedElement(ktFile) as KtExpression + val containingDeclaration = declarationAtCaret.parentOfType() + ?: error("Can't find containing declaration for $declarationAtCaret") + val containingClass = getContainingKtLightClass(containingDeclaration, ktFile) + val psiContext = containingClass.findLightDeclarationContext(containingDeclaration) + ?: error("Can't find psi context for $containingDeclaration") val actual = analyze(ktFile) { val returnType = declarationAtCaret.getKtType() ?: error("Not a typable expression ${declarationAtCaret::class} ${declarationAtCaret.text}") - val psiType = returnType.asPsiType(declarationAtCaret) + val psiType = returnType.asPsiType(psiContext) buildString { appendLine("KtType: ${returnType.render(position = Variance.INVARIANT)}") appendLine("PsiType: $psiType") 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 0b62b2dd116..3870d2cca86 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 @@ -58,6 +58,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiType runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/class_object_constructor.kt"); } + @Test + @TestMetadata("localClassWithUnresolvedSuperType.kt") + public void testLocalClassWithUnresolvedSuperType() throws Exception { + runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.kt"); + } + @Test @TestMetadata("typeParamFlexibleUpperBound.kt") public void testTypeParamFlexibleUpperBound() throws Exception { diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.kt new file mode 100644 index 00000000000..ac83b98ca9a --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.kt @@ -0,0 +1,11 @@ +fun box() { + class Foo { + fun foo() { + Bar().unknown() + } + + private inner class Bar: Unknown() { + override fun unknown() {} + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.txt new file mode 100644 index 00000000000..ee178d22a7d --- /dev/null +++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/localClassWithUnresolvedSuperType.txt @@ -0,0 +1,2 @@ +KtType: Foo +PsiType: PsiType:Bar diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt index 7aab274950f..76d49e4d49e 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/types/AbstractTypeApproximator.kt @@ -179,8 +179,8 @@ abstract class AbstractTypeApproximator( errorTypesEqualToAnything = false, stubTypesEqualToAnything = false ) - return AbstractTypeChecker.findCorrespondingSupertypes(typeCheckerContext, type, superConstructor).first() - .withNullability(type.isMarkedNullable()) + return AbstractTypeChecker.findCorrespondingSupertypes(typeCheckerContext, type, superConstructor).firstOrNull() + ?.withNullability(type.isMarkedNullable()) } private fun isIntersectionTypeEffectivelyNothing(constructor: IntersectionTypeConstructorMarker): Boolean {