AA FIR: build argument mapping for SAM conversion node ^KT-64910 fixed
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 063eba0..7065828 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
@@ -767,6 +767,30 @@ } @Test + @TestMetadata("samFromJava_lambda.kt") + public void testSamFromJava_lambda() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.kt"); + } + + @Test + @TestMetadata("samFromJava_methodReference.kt") + public void testSamFromJava_methodReference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.kt"); + } + + @Test + @TestMetadata("samLambda.kt") + public void testSamLambda() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.kt"); + } + + @Test + @TestMetadata("samMethodReference.kt") + public void testSamMethodReference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.kt"); + } + + @Test @TestMetadata("simpleCallWithNonMatchingArgs.kt") public void testSimpleCallWithNonMatchingArgs() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/simpleCallWithNonMatchingArgs.kt");
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 db52847..d565b3e 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
@@ -1343,7 +1343,10 @@ // 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 FirSamConversionExpression -> + expression.realPsi as? KtExpression + is FirSmartCastExpression -> + originalExpression.realPsi as? KtExpression is FirNamedArgumentExpression, is FirSpreadArgumentExpression, is FirLambdaArgumentExpression -> realPsi.safeAs<KtValueArgument>()?.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 6968555..31c28e3 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
@@ -767,6 +767,30 @@ } @Test + @TestMetadata("samFromJava_lambda.kt") + public void testSamFromJava_lambda() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.kt"); + } + + @Test + @TestMetadata("samFromJava_methodReference.kt") + public void testSamFromJava_methodReference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.kt"); + } + + @Test + @TestMetadata("samLambda.kt") + public void testSamLambda() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.kt"); + } + + @Test + @TestMetadata("samMethodReference.kt") + public void testSamMethodReference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.kt"); + } + + @Test @TestMetadata("simpleCallWithNonMatchingArgs.kt") public void testSimpleCallWithNonMatchingArgs() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/simpleCallWithNonMatchingArgs.kt");
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 d7d78ec..b35ea74 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
@@ -767,6 +767,30 @@ } @Test + @TestMetadata("samFromJava_lambda.kt") + public void testSamFromJava_lambda() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.kt"); + } + + @Test + @TestMetadata("samFromJava_methodReference.kt") + public void testSamFromJava_methodReference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.kt"); + } + + @Test + @TestMetadata("samLambda.kt") + public void testSamLambda() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.kt"); + } + + @Test + @TestMetadata("samMethodReference.kt") + public void testSamMethodReference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.kt"); + } + + @Test @TestMetadata("simpleCallWithNonMatchingArgs.kt") public void testSimpleCallWithNonMatchingArgs() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/simpleCallWithNonMatchingArgs.kt");
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.descriptors.txt new file mode 100644 index 0000000..985240e --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.descriptors.txt
@@ -0,0 +1,43 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = handler + isSafeNavigation = false + type = test.pkg.MyHandler + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = test/pkg/MyHandler.stash(<dispatch receiver>: test.pkg.MyHandler, actor: test.pkg.MyInterface!, actors: (kotlin.collections.MutableList<test.pkg.MyInterface!>..kotlin.collections.List<test.pkg.MyInterface!>?)): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = actor + receiverType = null + returnType = test.pkg.MyInterface! + symbol = actor: test.pkg.MyInterface! + callableIdIfNonLocal = null, + KtVariableLikeSignature: + name = actors + receiverType = null + returnType = (kotlin.collections.MutableList<test.pkg.MyInterface!>..kotlin.collections.List<test.pkg.MyInterface!>?) + symbol = actors: (kotlin.collections.MutableList<test.pkg.MyInterface!>..kotlin.collections.List<test.pkg.MyInterface!>?) + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = test/pkg/MyHandler.stash + typeArgumentsMapping = {} + argumentMapping = { + lambda -> (KtVariableLikeSignature: + name = actor + receiverType = null + returnType = test.pkg.MyInterface! + symbol = actor: test.pkg.MyInterface! + callableIdIfNonLocal = null), + list -> (KtVariableLikeSignature: + name = actors + receiverType = null + returnType = (kotlin.collections.MutableList<test.pkg.MyInterface!>..kotlin.collections.List<test.pkg.MyInterface!>?) + symbol = actors: (kotlin.collections.MutableList<test.pkg.MyInterface!>..kotlin.collections.List<test.pkg.MyInterface!>?) + callableIdIfNonLocal = null) + } \ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.kt new file mode 100644 index 0000000..2052aa8 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.kt
@@ -0,0 +1,30 @@ +// WITH_STDLIB + +// FILE: MyInterface.java + +package test.pkg; + +interface MyInterface { + void act(); +} + +// FILE: MyHandler.java + +package test.pkg; + +import java.util.List; + +public class MyHandler { + public void stash(MyInterface actor, List<MyInterface> actors) { + actors.add(actor); + } +} + +// FILE: main.kt + +package test.pkg + +fun test(handler: MyHandler, list: List<MyInterface>) { + val lambda = { println("hello") } + <expr>handler.stash(lambda, list)</expr> +}
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.txt new file mode 100644 index 0000000..16085cb --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_lambda.txt
@@ -0,0 +1,43 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = handler + isSafeNavigation = false + type = test.pkg.MyHandler + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = test/pkg/MyHandler.stash(<dispatch receiver>: test.pkg.MyHandler, actor: test.pkg.MyInterface!, actors: ft<kotlin.collections.MutableList<test.pkg.MyInterface!>, kotlin.collections.List<test.pkg.MyInterface!>?>): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = actor + receiverType = null + returnType = test.pkg.MyInterface! + symbol = actor: test.pkg.MyInterface! + callableIdIfNonLocal = null, + KtVariableLikeSignature: + name = actors + receiverType = null + returnType = ft<kotlin.collections.MutableList<test.pkg.MyInterface!>, kotlin.collections.List<test.pkg.MyInterface!>?> + symbol = actors: ft<kotlin.collections.MutableList<test.pkg.MyInterface!>, kotlin.collections.List<test.pkg.MyInterface!>?> + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = test/pkg/MyHandler.stash + typeArgumentsMapping = {} + argumentMapping = { + lambda -> (KtVariableLikeSignature: + name = actor + receiverType = null + returnType = test.pkg.MyInterface! + symbol = actor: test.pkg.MyInterface! + callableIdIfNonLocal = null), + list -> (KtVariableLikeSignature: + name = actors + receiverType = null + returnType = ft<kotlin.collections.MutableList<test.pkg.MyInterface!>, kotlin.collections.List<test.pkg.MyInterface!>?> + symbol = actors: ft<kotlin.collections.MutableList<test.pkg.MyInterface!>, kotlin.collections.List<test.pkg.MyInterface!>?> + callableIdIfNonLocal = null) + } \ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.kt new file mode 100644 index 0000000..f87ca93 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.kt
@@ -0,0 +1,33 @@ +// WITH_STDLIB + +// FILE: MyInterface.java + +package test.pkg; + +interface MyInterface { + void act(); +} + +// FILE: MyHandler.java + +package test.pkg; + +import java.util.List; + +public class MyHandler { + public void act(MyInterface actor) { + if (actor != null) { + actor.act(); + } + } +} + +// FILE: main.kt + +package test.pkg + +fun callback() {} + +fun test(handler: MyHandler, list: List<MyInterface>) { + <expr>handler.act(::callback)</expr> +}
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.txt new file mode 100644 index 0000000..8913e4e --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samFromJava_methodReference.txt
@@ -0,0 +1,31 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = handler + isSafeNavigation = false + type = test.pkg.MyHandler + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = test/pkg/MyHandler.act(<dispatch receiver>: test.pkg.MyHandler, actor: test.pkg.MyInterface!): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = actor + receiverType = null + returnType = test.pkg.MyInterface! + symbol = actor: test.pkg.MyInterface! + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = test/pkg/MyHandler.act + typeArgumentsMapping = {} + argumentMapping = { + ::callback -> (KtVariableLikeSignature: + name = actor + receiverType = null + returnType = test.pkg.MyInterface! + symbol = actor: test.pkg.MyInterface! + callableIdIfNonLocal = null) + } \ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.kt new file mode 100644 index 0000000..1d3ef1c --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.kt
@@ -0,0 +1,13 @@ +class Test { + fun interface Foo { + fun foo() + } + + fun uiMethod() {} + + fun test(foo: Foo) {} + + fun testLambda() { + <expr>test { uiMethod() }</expr> + } +} \ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.txt new file mode 100644 index 0000000..4c56366 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samLambda.txt
@@ -0,0 +1,54 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtImplicitReceiverValue: + symbol = KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: Test + classKind: CLASS + companionObject: null + contextReceivers: [] + isActual: false + isData: false + isExpect: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: Test + origin: SOURCE + superTypes: [ + KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + type = Test + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /Test.test(<dispatch receiver>: Test, foo: Test.Foo): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = foo + receiverType = null + returnType = Test.Foo + symbol = foo: Test.Foo + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /Test.test + typeArgumentsMapping = {} + argumentMapping = { + { uiMethod() } -> (KtVariableLikeSignature: + name = foo + receiverType = null + returnType = Test.Foo + symbol = foo: Test.Foo + callableIdIfNonLocal = null) + }
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.kt new file mode 100644 index 0000000..3f76676 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.kt
@@ -0,0 +1,13 @@ +class Test { + fun interface Foo { + fun foo() + } + + fun uiMethod() {} + + fun test(foo: Foo) {} + + fun testMethodRef() { + <expr>test(this::uiMethod)</expr> + } +} \ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.txt new file mode 100644 index 0000000..14c72cd4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/samMethodReference.txt
@@ -0,0 +1,54 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtImplicitReceiverValue: + symbol = KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: Test + classKind: CLASS + companionObject: null + contextReceivers: [] + isActual: false + isData: false + isExpect: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: Test + origin: SOURCE + superTypes: [ + KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + type = Test + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /Test.test(<dispatch receiver>: Test, foo: Test.Foo): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = foo + receiverType = null + returnType = Test.Foo + symbol = foo: Test.Foo + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /Test.test + typeArgumentsMapping = {} + argumentMapping = { + this::uiMethod -> (KtVariableLikeSignature: + name = foo + receiverType = null + returnType = Test.Foo + symbol = foo: Test.Foo + callableIdIfNonLocal = null) + } \ No newline at end of file