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 063eba0d6dc..7065828dd50 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 @@ -766,6 +766,30 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samConstructorCall.kt"); } + @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 { 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 db528470469..d565b3ef046 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 @@ internal class KtFirCallResolver( // 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()?.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 69685553e1c..31c28e3d016 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 @@ -766,6 +766,30 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samConstructorCall.kt"); } + @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 { 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 d7d78ec599b..b35ea74720a 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 @@ -766,6 +766,30 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/samConstructorCall.kt"); } + @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 { 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 00000000000..985240ed4da --- /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(: test.pkg.MyHandler, actor: test.pkg.MyInterface!, actors: (kotlin.collections.MutableList..kotlin.collections.List?)): 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..kotlin.collections.List?) + symbol = actors: (kotlin.collections.MutableList..kotlin.collections.List?) + 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..kotlin.collections.List?) + symbol = actors: (kotlin.collections.MutableList..kotlin.collections.List?) + 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 00000000000..2052aa861ec --- /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 actors) { + actors.add(actor); + } +} + +// FILE: main.kt + +package test.pkg + +fun test(handler: MyHandler, list: List) { + val lambda = { println("hello") } + handler.stash(lambda, list) +} 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 00000000000..16085cb50fe --- /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(: test.pkg.MyHandler, actor: test.pkg.MyInterface!, actors: ft, kotlin.collections.List?>): 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.List?> + symbol = actors: ft, kotlin.collections.List?> + 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.List?> + symbol = actors: ft, kotlin.collections.List?> + 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 00000000000..f87ca93f7ce --- /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) { + handler.act(::callback) +} 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 00000000000..8913e4e0c31 --- /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(: 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 00000000000..1d3ef1cf257 --- /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() { + test { uiMethod() } + } +} \ 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 00000000000..4c563668be5 --- /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(: 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 00000000000..3f7667689ae --- /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() { + test(this::uiMethod) + } +} \ 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 00000000000..14c72cd4118 --- /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(: 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