diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpressionPsiTypeProviderTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpressionPsiTypeProviderTest.kt new file mode 100644 index 00000000000..efe007195f8 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpressionPsiTypeProviderTest.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2021 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. + */ + +package org.jetbrains.kotlin.analysis.api.fir.components + +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService +import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions + +abstract class AbstractExpressionPsiTypeProviderTest : AbstractHLApiSingleFileTest(FirFrontendApiTestConfiguratorService) { + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { + val declarationAtCaret = testServices.expressionMarkerProvider.getSelectedElement(ktFile) as KtExpression + val actual = analyse(ktFile) { + val returnType = declarationAtCaret.getKtType() + ?: error("Not a typable expression ${declarationAtCaret::class} ${declarationAtCaret.text}") + val psiType = returnType.asPsiType(declarationAtCaret) + buildString { + appendLine("KtType: ${returnType.render()}") + appendLine("PsiType: $psiType") + } + } + testServices.assertions.assertEqualsToFile(testDataFileSibling(".txt"), actual) + } +} diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ExpressionPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ExpressionPsiTypeProviderTestGenerated.java new file mode 100644 index 00000000000..26e637f1cbd --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ExpressionPsiTypeProviderTestGenerated.java @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2021 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. + */ + +package org.jetbrains.kotlin.analysis.api.fir.components; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/expressionPsiType") +@TestDataPath("$PROJECT_ROOT") +public class ExpressionPsiTypeProviderTestGenerated extends AbstractExpressionPsiTypeProviderTest { + @Test + public void testAllFilesPresentInExpressionPsiType() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionPsiType"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("typeParamFlexibleUpperBound.kt") + public void testTypeParamFlexibleUpperBound() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionPsiType/typeParamFlexibleUpperBound.kt"); + } +} diff --git a/analysis/analysis-api/testData/components/expressionPsiType/typeParamFlexibleUpperBound.kt b/analysis/analysis-api/testData/components/expressionPsiType/typeParamFlexibleUpperBound.kt new file mode 100644 index 00000000000..7c3dc289203 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionPsiType/typeParamFlexibleUpperBound.kt @@ -0,0 +1,21 @@ +// FILE: kotlin.kt + +fun bar() { + val xx = JavaClass::foo +} + +// FILE: JavaClass.java + +import org.jetbrains.annotations.NotNull; + +public class JavaClass { + @NotNull + public static T foo(@NotNull T x) { + return x; + } +} + +// FILE: B.java +public class B { + +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionPsiType/typeParamFlexibleUpperBound.txt b/analysis/analysis-api/testData/components/expressionPsiType/typeParamFlexibleUpperBound.txt new file mode 100644 index 00000000000..9dfbb57b725 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionPsiType/typeParamFlexibleUpperBound.txt @@ -0,0 +1,2 @@ +KtType: T!! +PsiType: PsiType:T diff --git a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt index e82bc0c3f8f..417919c8341 100644 --- a/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt +++ b/compiler/backend.common.jvm/src/org/jetbrains/kotlin/types/AbstractTypeMapper.kt @@ -128,6 +128,10 @@ object AbstractTypeMapper { } } + type.isFlexible() -> { + return mapType(context, type.upperBoundIfFlexible(), mode, sw) + } + else -> throw UnsupportedOperationException("Unknown type $type") } } diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt index d8bda8cb042..122b9d2c640 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt @@ -109,6 +109,10 @@ fun main(args: Array) { model("components/psiTypeProvider") } + testClass { + model("components/expressionPsiType") + } + testClass { model("components/smartCastInfo") }