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")
}