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 dddc9c1c249..7442a2c845c 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 @@ -52,6 +52,12 @@ public class Fe10IdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerate KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("annotationPositionalArgument.kt") + public void testAnnotationPositionalArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.kt"); + } + @Test @TestMetadata("arrayAccessExpressionGet.kt") public void testArrayAccessExpressionGet() throws Exception { @@ -88,6 +94,12 @@ public class Fe10IdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerate runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/conditionInWhenWithoutSubject.kt"); } + @Test + @TestMetadata("delegatedConstructorCall.kt") + public void testDelegatedConstructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.kt"); + } + @Test @TestMetadata("elvisExpressionLeftOperand.kt") public void testElvisExpressionLeftOperand() 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 fae620c9185..0e1ee6426ec 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 @@ -110,10 +110,13 @@ internal class KtFirExpressionTypeProvider( private data class SubstitutedValueParameter(val parameter: FirValueParameter, val substitutedType: ConeKotlinType) - private fun FirFunctionCall.argumentsToSubstitutedValueParameters( - substituteWithErrorTypes: Boolean = true + private fun FirCall.argumentsToSubstitutedValueParameters( + substituteWithErrorTypes: Boolean = true, ): LinkedHashMap? { - val substitutor = createConeSubstitutorFromTypeArguments(discardErrorTypes = !substituteWithErrorTypes) ?: ConeSubstitutor.Empty + val substitutor = (this as? FirQualifiedAccessExpression) + ?.createConeSubstitutorFromTypeArguments(discardErrorTypes = !substituteWithErrorTypes) + ?: ConeSubstitutor.Empty + return resolvedArgumentMapping?.mapValuesTo(LinkedHashMap()) { (_, parameter) -> SubstitutedValueParameter(parameter, substitutor.substituteOrSelf(parameter.returnTypeRef.coneType)) } @@ -170,8 +173,8 @@ internal class KtFirExpressionTypeProvider( } private fun getExpectedTypeOfFunctionParameter(expression: PsiElement): KtType? { - val (ktCallExpression, argumentExpression) = expression.getFunctionCallAsWithThisAsParameter() ?: return null - val firCall = ktCallExpression.getOrBuildFirSafe(firResolveSession) ?: return null + val (ktCallElement, argumentExpression) = expression.getFunctionCallAsWithThisAsParameter() ?: return null + val firCall = ktCallElement.getOrBuildFirSafe(firResolveSession) ?: return null val callee = (firCall.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol if (callee?.fir?.origin == FirDeclarationOrigin.SamConstructor) { @@ -221,8 +224,8 @@ internal class KtFirExpressionTypeProvider( valueArg.getArgumentExpression()?.unwrap() == expr } ?: return null val callExpression = - (valueArgument.parent as? KtValueArgumentList)?.parent as? KtCallExpression - ?: valueArgument.parent as? KtCallExpression // KtLambdaArgument + (valueArgument.parent as? KtValueArgumentList)?.parent as? KtCallElement + ?: valueArgument.parent as? KtCallElement // KtLambdaArgument ?: return null val argumentExpression = valueArgument.getArgumentExpression() ?: return null return KtCallWithArgument(callExpression, argumentExpression) @@ -397,7 +400,7 @@ internal class KtFirExpressionTypeProvider( } } -private data class KtCallWithArgument(val call: KtCallExpression, val argument: KtExpression) +private data class KtCallWithArgument(val call: KtCallElement, val argument: KtExpression) private inline fun PsiElement.unwrapQualified(check: (R, PsiElement) -> Boolean): R? { val parent = nonContainerParent 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 647afc0b70b..841a0a9e266 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 @@ -52,6 +52,12 @@ public class FirIdeDependentAnalysisSourceModuleExpectedExpressionTypeTestGenera KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("annotationPositionalArgument.kt") + public void testAnnotationPositionalArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.kt"); + } + @Test @TestMetadata("arrayAccessExpressionGet.kt") public void testArrayAccessExpressionGet() throws Exception { @@ -88,6 +94,12 @@ public class FirIdeDependentAnalysisSourceModuleExpectedExpressionTypeTestGenera runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/conditionInWhenWithoutSubject.kt"); } + @Test + @TestMetadata("delegatedConstructorCall.kt") + public void testDelegatedConstructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.kt"); + } + @Test @TestMetadata("elvisExpressionLeftOperand.kt") public void testElvisExpressionLeftOperand() 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 6283464485e..70922ce02dc 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 @@ -52,6 +52,12 @@ public class FirIdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("annotationPositionalArgument.kt") + public void testAnnotationPositionalArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.kt"); + } + @Test @TestMetadata("arrayAccessExpressionGet.kt") public void testArrayAccessExpressionGet() throws Exception { @@ -88,6 +94,12 @@ public class FirIdeNormalAnalysisSourceModuleExpectedExpressionTypeTestGenerated runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/conditionInWhenWithoutSubject.kt"); } + @Test + @TestMetadata("delegatedConstructorCall.kt") + public void testDelegatedConstructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.kt"); + } + @Test @TestMetadata("elvisExpressionLeftOperand.kt") public void testElvisExpressionLeftOperand() 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 c87e42d68e5..566736f909f 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 @@ -52,6 +52,12 @@ public class FirStandaloneNormalAnalysisSourceModuleExpectedExpressionTypeTestGe KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("annotationPositionalArgument.kt") + public void testAnnotationPositionalArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.kt"); + } + @Test @TestMetadata("arrayAccessExpressionGet.kt") public void testArrayAccessExpressionGet() throws Exception { @@ -88,6 +94,12 @@ public class FirStandaloneNormalAnalysisSourceModuleExpectedExpressionTypeTestGe runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/conditionInWhenWithoutSubject.kt"); } + @Test + @TestMetadata("delegatedConstructorCall.kt") + public void testDelegatedConstructorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.kt"); + } + @Test @TestMetadata("elvisExpressionLeftOperand.kt") public void testElvisExpressionLeftOperand() throws Exception { diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.kt new file mode 100644 index 00000000000..20e5777f3c6 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.kt @@ -0,0 +1,4 @@ +annotation class A(val n: Int) + +@A(av) +class B \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.txt new file mode 100644 index 00000000000..44fc8010e0f --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/annotationPositionalArgument.txt @@ -0,0 +1,5 @@ +expression: av +expected type: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.kt new file mode 100644 index 00000000000..d920a0e91d9 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.kt @@ -0,0 +1,5 @@ +class Base(val p1: Int, val p2: Int) + +class Derived(override val p1: Int, override val p2: Int) : Base(p1, p2) { + constructor(s: String) : this(s.length, av) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.txt new file mode 100644 index 00000000000..44fc8010e0f --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expectedExpressionType/delegatedConstructorCall.txt @@ -0,0 +1,5 @@ +expression: av +expected type: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Int \ No newline at end of file