diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt index d846721ccdc..4c0f5d58a87 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.calls.components.isVararg import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing import org.jetbrains.kotlin.resolve.calls.smartcasts.MultipleSmartCasts import org.jetbrains.kotlin.resolve.calls.smartcasts.SingleSmartCast @@ -210,9 +211,14 @@ class KtFe10ExpressionTypeProvider( if (parameterDescriptor != null) { val kotlinType = when (val originalCallableDescriptor = parameterDescriptor.containingDeclaration) { is SamConstructorDescriptor -> originalCallableDescriptor.returnTypeOrNothing - else -> parameterDescriptor.type + else -> { + if (parameterDescriptor.isVararg) + parameterDescriptor.varargElementType + else + parameterDescriptor.type + } } - return kotlinType.toKtType(analysisContext) + return kotlinType?.toKtType(analysisContext) } } } diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java index a823749ffd0..4ba0ae73de7 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java @@ -232,6 +232,24 @@ public class Fe10IdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerate runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samAsReturn.kt"); } + @Test + @TestMetadata("samReferenceAsArgument.kt") + public void testSamReferenceAsArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.kt"); + } + + @Test + @TestMetadata("samReferenceAsVararg.kt") + public void testSamReferenceAsVararg() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.kt"); + } + + @Test + @TestMetadata("samReferenceWithTypeCast.kt") + public void testSamReferenceWithTypeCast() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.kt"); + } + @Test @TestMetadata("samWithExplicitTypeFromProperty.kt") public void testSamWithExplicitTypeFromProperty() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index 3ccf458ab88..b58fdd50845 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt @@ -167,7 +167,11 @@ internal class KtFirExpressionTypeProvider( arg.psi == argumentExpression } }?.value ?: return null - return firParameterForExpression.returnTypeRef.coneType.asKtType() + val coneType = firParameterForExpression.returnTypeRef.coneType + return if (firParameterForExpression.isVararg) + coneType.varargElementType().asKtType() + else + coneType.asKtType() } private fun PsiElement.getFunctionCallAsWithThisAsParameter(): KtCallWithArgument? { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java index 80fa950d141..243e7ff3b35 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java @@ -232,6 +232,24 @@ public class FirIdeDependentAnalysisSourceModuleExpectedExpressionTypeTestGenera runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samAsReturn.kt"); } + @Test + @TestMetadata("samReferenceAsArgument.kt") + public void testSamReferenceAsArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.kt"); + } + + @Test + @TestMetadata("samReferenceAsVararg.kt") + public void testSamReferenceAsVararg() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.kt"); + } + + @Test + @TestMetadata("samReferenceWithTypeCast.kt") + public void testSamReferenceWithTypeCast() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.kt"); + } + @Test @TestMetadata("samWithExplicitTypeFromProperty.kt") public void testSamWithExplicitTypeFromProperty() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java index 2eaab97cece..ea9ded70bfd 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java @@ -232,6 +232,24 @@ public class FirIdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samAsReturn.kt"); } + @Test + @TestMetadata("samReferenceAsArgument.kt") + public void testSamReferenceAsArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.kt"); + } + + @Test + @TestMetadata("samReferenceAsVararg.kt") + public void testSamReferenceAsVararg() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.kt"); + } + + @Test + @TestMetadata("samReferenceWithTypeCast.kt") + public void testSamReferenceWithTypeCast() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.kt"); + } + @Test @TestMetadata("samWithExplicitTypeFromProperty.kt") public void testSamWithExplicitTypeFromProperty() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java index 5bef8cfd459..c9c0d306813 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated.java @@ -232,6 +232,24 @@ public class FirStandaloneNormalAnalysisSourceModuleExpectedExpressionTypeTestGe runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samAsReturn.kt"); } + @Test + @TestMetadata("samReferenceAsArgument.kt") + public void testSamReferenceAsArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.kt"); + } + + @Test + @TestMetadata("samReferenceAsVararg.kt") + public void testSamReferenceAsVararg() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.kt"); + } + + @Test + @TestMetadata("samReferenceWithTypeCast.kt") + public void testSamReferenceWithTypeCast() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.kt"); + } + @Test @TestMetadata("samWithExplicitTypeFromProperty.kt") public void testSamWithExplicitTypeFromProperty() throws Exception { diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.kt new file mode 100644 index 00000000000..78854dab09b --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.kt @@ -0,0 +1,7 @@ +fun dummy() = Any() + +fun runRunnable(r : java.lang.Runnable) = r() + +fun test() { + runRunnable(::dummy) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.txt new file mode 100644 index 00000000000..a2550e63c46 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsArgument.txt @@ -0,0 +1,2 @@ +expression: ::dummy +expected type: java/lang/Runnable diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.kt new file mode 100644 index 00000000000..e19ded1ce07 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.kt @@ -0,0 +1,11 @@ +fun dummy() = Any() + +fun runRunnables(vararg rs : java.lang.Runnable) { + rs.forEach { + it.run() + } +} + +fun test() { + runRunnables(::dummy) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.txt new file mode 100644 index 00000000000..a2550e63c46 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceAsVararg.txt @@ -0,0 +1,2 @@ +expression: ::dummy +expected type: java/lang/Runnable diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.kt new file mode 100644 index 00000000000..39c6e17b0d8 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.kt @@ -0,0 +1,5 @@ +fun dummy() = Any() + +fun test() { + ::dummy as java.lang.Runnable +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.txt new file mode 100644 index 00000000000..a2550e63c46 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/samReferenceWithTypeCast.txt @@ -0,0 +1,2 @@ +expression: ::dummy +expected type: java/lang/Runnable