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 67803edee55..45888d10454 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 @@ -72,8 +72,13 @@ class KtFe10ExpressionTypeProvider( if (typeReference != null) { val bindingContext = analysisContext.analyze(typeReference, AnalysisMode.PARTIAL) - val kotlinType = bindingContext[BindingContext.TYPE, typeReference] - ?: ErrorUtils.createErrorType(ErrorTypeKind.RETURN_TYPE, typeReference.text) + val kotlinType = + if (declaration is KtParameter && declaration.isVarArg) { + // we want full Array type for parity with FIR implementation + bindingContext[BindingContext.VALUE_PARAMETER, declaration]?.returnType + } else { + bindingContext[BindingContext.TYPE, typeReference] + } ?: ErrorUtils.createErrorType(ErrorTypeKind.RETURN_TYPE, typeReference.text) 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/Fe10IdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java index 6ab495fb585..b90a9b762d3 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java @@ -93,4 +93,10 @@ public class Fe10IdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated public void testTypeParameters() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt"); } + + @Test + @TestMetadata("varargParam.kt") + public void testVarargParam() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.kt"); + } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java index 495dbe6af0b..9ffef19c44f 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java @@ -93,4 +93,10 @@ public class FirIdeDependentAnalysisSourceModuleDeclarationReturnTypeTestGenerat public void testTypeParameters() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt"); } + + @Test + @TestMetadata("varargParam.kt") + public void testVarargParam() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.kt"); + } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java index 1ce5f5ba89d..7143a457569 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java @@ -93,4 +93,10 @@ public class FirIdeNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated public void testTypeParameters() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt"); } + + @Test + @TestMetadata("varargParam.kt") + public void testVarargParam() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.kt"); + } } diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java index 42d886d206d..58fd5a4f75c 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleDeclarationReturnTypeTestGenerated.java @@ -93,4 +93,10 @@ public class FirStandaloneNormalAnalysisSourceModuleDeclarationReturnTypeTestGen public void testTypeParameters() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt"); } + + @Test + @TestMetadata("varargParam.kt") + public void testVarargParam() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.kt"); + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt index 1da5491b782..bd974bd2e42 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtExpressionTypeProvider.kt @@ -35,7 +35,11 @@ public interface KtExpressionTypeProviderMixIn : KtAnalysisSessionMixIn { withValidityAssertion { analysisSession.expressionTypeProvider.getKtExpressionType(this) } /** - * Returns the return type of the given [KtDeclaration] as [KtType] + * Returns the return type of the given [KtDeclaration] as [KtType]. + * + * IMPORTANT: For `vararg foo: T` parameter returns full `Array` type (unlike + * [KtValueParameterSymbol.returnType][org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol.returnType], + * which returns `T`). */ public fun KtDeclaration.getReturnKtType(): KtType = withValidityAssertion { analysisSession.expressionTypeProvider.getReturnTypeForKtDeclaration(this) } diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.kt new file mode 100644 index 00000000000..48837b6cb84 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.kt @@ -0,0 +1,5 @@ +class Foo(vararg constructorValues: String) + +fun test(vararg values: String) {} + +fun test(vararg primitiveValues: Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.txt new file mode 100644 index 00000000000..71888f3abe5 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/varargParam.txt @@ -0,0 +1,7 @@ +Foo@(1,1) + Foo@(1,10) : Foo + constructorValues@(1,11) : kotlin.Array +test@(3,1) : kotlin.Unit + values@(3,10) : kotlin.Array +test@(5,1) : kotlin.Unit + primitiveValues@(5,10) : kotlin.IntArray