diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index 37342a8b9b1..e62a412f845 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -784,6 +784,18 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.kt"); } + @Test + @TestMetadata("smartCastedArg.kt") + public void testSmartCastedArg() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.kt"); + } + + @Test + @TestMetadata("smartCastedNonNullArg.kt") + public void testSmartCastedNonNullArg() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.kt"); + } + @Test @TestMetadata("substituteOverrideResolution.kt") public void testSubstituteOverrideResolution() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt index 0e6932d11a2..1a13d99f252 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt @@ -1272,9 +1272,11 @@ internal class KtFirCallResolver( } private fun FirExpression.findSourceKtExpressionForCallArgument(): KtExpression? { + // For smart-casted expression, refer to the source of the original expression // For spread, named, and lambda arguments, the source is the KtValueArgument. // For other arguments (including array indices), the source is the KtExpression. return when (this) { + is FirSmartCastExpression -> originalExpression.realPsi as? KtExpression is FirNamedArgumentExpression, is FirSpreadArgumentExpression, is FirLambdaArgumentExpression -> realPsi.safeAs()?.getArgumentExpression() else -> realPsi as? KtExpression diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index 1e842f26d1c..2b71e5a86c4 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -784,6 +784,18 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.kt"); } + @Test + @TestMetadata("smartCastedArg.kt") + public void testSmartCastedArg() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.kt"); + } + + @Test + @TestMetadata("smartCastedNonNullArg.kt") + public void testSmartCastedNonNullArg() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.kt"); + } + @Test @TestMetadata("substituteOverrideResolution.kt") public void testSubstituteOverrideResolution() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java index c9559e3cfc1..6662ee57731 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -784,6 +784,18 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastImplicitExtensionReceiver.kt"); } + @Test + @TestMetadata("smartCastedArg.kt") + public void testSmartCastedArg() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.kt"); + } + + @Test + @TestMetadata("smartCastedNonNullArg.kt") + public void testSmartCastedNonNullArg() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.kt"); + } + @Test @TestMetadata("substituteOverrideResolution.kt") public void testSubstituteOverrideResolution() throws Exception { diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.kt new file mode 100644 index 00000000000..90da541e306 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.kt @@ -0,0 +1,10 @@ +open class A +class B : A() + +private fun processB(b: B): Int = 2 + +fun test(a: A) { + if (a is B) { + processB(a) + } +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.txt new file mode 100644 index 00000000000..81840d35fd8 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedArg.txt @@ -0,0 +1,28 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Int + symbol = /processB(b: B): kotlin.Int + valueParameters = [ + KtVariableLikeSignature: + name = b + receiverType = null + returnType = B + symbol = b: B + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /processB + typeArgumentsMapping = {} + argumentMapping = { + a -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = B + symbol = b: B + callableIdIfNonLocal = null) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.kt new file mode 100644 index 00000000000..47e6fdc80e0 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.kt @@ -0,0 +1,8 @@ +private fun test(s: String?) { + if (s != null) { + foo(s) + } +} + +private fun foo(s: String) { +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.txt new file mode 100644 index 00000000000..ca8fd4678e5 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/smartCastedNonNullArg.txt @@ -0,0 +1,28 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /foo(s: kotlin.String): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = s + receiverType = null + returnType = kotlin.String + symbol = s: kotlin.String + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /foo + typeArgumentsMapping = {} + argumentMapping = { + s -> (KtVariableLikeSignature: + name = s + receiverType = null + returnType = kotlin.String + symbol = s: kotlin.String + callableIdIfNonLocal = null) + }