From 0147d725fbd24f26b72d2057e43889708c6c9b11 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 22 Feb 2024 02:17:14 +0900 Subject: [PATCH] [Analysis API] Provide type mapping for callable references Strictly speaking, callable references are not calls. However, type arguments are still inferred for references, and 'KtCall' is the only place in Analysis API that exposes call-substituted types. ^KT-66485 Fixed --- .../components/KtFe10CallResolver.kt | 6 + ...sSourceModuleResolveCallTestGenerated.java | 124 ++++++++++++++++++ .../api/fir/components/KtFirCallResolver.kt | 15 ++- ...tSourceModuleResolveCallTestGenerated.java | 10 ++ ...sSourceModuleResolveCallTestGenerated.java | 124 ++++++++++++++++++ .../base/components/AbstractKtCallResolver.kt | 1 + ...sSourceModuleResolveCallTestGenerated.java | 124 ++++++++++++++++++ .../annotationConstructor.kt | 8 ++ .../annotationConstructor.txt | 21 +++ .../boundMemberExtensionFunction.kt | 15 +++ .../boundMemberExtensionFunction.txt | 30 +++++ .../callableReferences/boundMemberFunction.kt | 9 ++ .../boundMemberFunction.txt | 24 ++++ .../callableReferences/boundMemberProperty.kt | 10 ++ .../boundMemberProperty.txt | 17 +++ .../boundTopLevelExtensionFunction.kt | 9 ++ .../boundTopLevelExtensionFunction.txt | 24 ++++ .../boundTopLevelExtensionProperty.kt | 10 ++ .../boundTopLevelExtensionProperty.txt | 17 +++ .../callableReferences/constructor.kt | 7 + .../callableReferences/constructor.txt | 21 +++ .../genericParameterType.kt | 9 ++ .../genericParameterType.txt | 21 +++ .../genericParameterTypeGenericConsumer.kt | 9 ++ .../genericParameterTypeGenericConsumer.txt | 21 +++ .../callableReferences/genericReturnType.kt | 9 ++ .../callableReferences/genericReturnType.txt | 14 ++ .../genericReturnTypeGenericConsumer.kt | 9 ++ .../genericReturnTypeGenericConsumer.txt | 14 ++ .../memberExtensionProperty.kt | 16 +++ .../memberExtensionProperty.txt | 23 ++++ .../callableReferences/memberFunction.kt | 9 ++ .../callableReferences/memberFunction.txt | 21 +++ .../callableReferences/memberProperty.kt | 10 ++ .../callableReferences/memberProperty.txt | 14 ++ .../resolveCall/callableReferences/simple.kt | 3 + .../resolveCall/callableReferences/simple.txt | 14 ++ .../topLevelExtensionFunction.kt | 9 ++ .../topLevelExtensionFunction.txt | 21 +++ .../topLevelExtensionProperty.kt | 10 ++ .../topLevelExtensionProperty.txt | 14 ++ .../callableReferences/topLevelFunction.kt | 7 + .../callableReferences/topLevelFunction.txt | 21 +++ .../callableReferences/topLevelProperty.kt | 8 ++ .../callableReferences/topLevelProperty.txt | 14 ++ 45 files changed, 940 insertions(+), 6 deletions(-) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt index 949a578a387..ce11356d80e 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt @@ -154,6 +154,7 @@ internal class KtFe10CallResolver( val parentBinaryExpression = psi.parentOfType() val lhs = KtPsiUtil.deparenthesize(parentBinaryExpression?.left) val unwrappedPsi = KtPsiUtil.deparenthesize(psi as? KtExpression) ?: psi + if (parentBinaryExpression != null && parentBinaryExpression.operationToken == KtTokens.EQ && (lhs == unwrappedPsi || (lhs as? KtQualifiedExpression)?.selectorExpression == unwrappedPsi) && @@ -163,6 +164,11 @@ internal class KtFe10CallResolver( // treated as a property read. return resolveCall(parentBinaryExpression) } + + if (psi is KtCallableReferenceExpression) { + return resolveCall(psi.callableReference) + } + when (unwrappedPsi) { is KtBinaryExpression -> { handleAsCompoundAssignment(this, unwrappedPsi)?.let { return@with it } 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 76d87ee2f8e..3961268d36f 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 @@ -1010,6 +1010,130 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A } } + @Nested + @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences") + @TestDataPath("$PROJECT_ROOT") + public class CallableReferences { + @Test + public void testAllFilesPresentInCallableReferences() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("annotationConstructor.kt") + public void testAnnotationConstructor() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt"); + } + + @Test + @TestMetadata("boundMemberExtensionFunction.kt") + public void testBoundMemberExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt"); + } + + @Test + @TestMetadata("boundMemberFunction.kt") + public void testBoundMemberFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt"); + } + + @Test + @TestMetadata("boundMemberProperty.kt") + public void testBoundMemberProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt"); + } + + @Test + @TestMetadata("boundTopLevelExtensionFunction.kt") + public void testBoundTopLevelExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt"); + } + + @Test + @TestMetadata("boundTopLevelExtensionProperty.kt") + public void testBoundTopLevelExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt"); + } + + @Test + @TestMetadata("constructor.kt") + public void testConstructor() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt"); + } + + @Test + @TestMetadata("genericParameterType.kt") + public void testGenericParameterType() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt"); + } + + @Test + @TestMetadata("genericParameterTypeGenericConsumer.kt") + public void testGenericParameterTypeGenericConsumer() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt"); + } + + @Test + @TestMetadata("genericReturnType.kt") + public void testGenericReturnType() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt"); + } + + @Test + @TestMetadata("genericReturnTypeGenericConsumer.kt") + public void testGenericReturnTypeGenericConsumer() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt"); + } + + @Test + @TestMetadata("memberExtensionProperty.kt") + public void testMemberExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt"); + } + + @Test + @TestMetadata("memberFunction.kt") + public void testMemberFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt"); + } + + @Test + @TestMetadata("memberProperty.kt") + public void testMemberProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt"); + } + + @Test + @TestMetadata("simple.kt") + public void testSimple() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt"); + } + + @Test + @TestMetadata("topLevelExtensionFunction.kt") + public void testTopLevelExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt"); + } + + @Test + @TestMetadata("topLevelExtensionProperty.kt") + public void testTopLevelExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt"); + } + + @Test + @TestMetadata("topLevelFunction.kt") + public void testTopLevelFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt"); + } + + @Test + @TestMetadata("topLevelProperty.kt") + public void testTopLevelProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt"); + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode") @TestDataPath("$PROJECT_ROOT") 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 d063a8e27ef..5094fd67c31 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 @@ -554,7 +554,9 @@ internal class KtFirCallResolver( KtSimpleVariableAccess.Write(rhs) ) } - is FirPropertyAccessExpression -> { + is FirPropertyAccessExpression, is FirCallableReferenceAccess -> { + @Suppress("USELESS_IS_CHECK") // K2 warning suppression, TODO: KT-62472 + require(fir is FirQualifiedAccessExpression) when (unsubstitutedKtSignature.symbol) { is KtVariableLikeSymbol -> { @Suppress("UNCHECKED_CAST") // safe because of the above check on targetKtSymbol @@ -999,11 +1001,12 @@ internal class KtFirCallResolver( is FirArrayLiteral, is FirEqualityOperatorCall -> { toKtCallInfo(psi, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall).toKtCallCandidateInfos() } - is FirComparisonExpression -> compareToCall.toKtCallInfo( - psi, - resolveCalleeExpressionOfFunctionCall, - resolveFragmentOfCall - ).toKtCallCandidateInfos() + is FirComparisonExpression -> { + compareToCall.toKtCallInfo(psi, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall).toKtCallCandidateInfos() + } + is FirCallableReferenceAccess -> { + calleeReference.toKtCallInfo(psi, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall).toKtCallCandidateInfos() + } is FirResolvedQualifier -> toKtCallCandidateInfos() is FirDelegatedConstructorCall -> collectCallCandidatesForDelegatedConstructorCall(psi, resolveFragmentOfCall) else -> toKtCallInfo(psi, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall).toKtCallCandidateInfos() diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleResolveCallTestGenerated.java index 1e51431a166..ef56998c2a7 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleResolveCallTestGenerated.java @@ -56,6 +56,16 @@ public class FirIdeNormalAnalysisScriptSourceModuleResolveCallTestGenerated exte } } + @Nested + @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences") + @TestDataPath("$PROJECT_ROOT") + public class CallableReferences { + @Test + public void testAllFilesPresentInCallableReferences() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode") @TestDataPath("$PROJECT_ROOT") 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 dfc560d430c..4082aa71b5f 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 @@ -1010,6 +1010,130 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab } } + @Nested + @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences") + @TestDataPath("$PROJECT_ROOT") + public class CallableReferences { + @Test + public void testAllFilesPresentInCallableReferences() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("annotationConstructor.kt") + public void testAnnotationConstructor() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt"); + } + + @Test + @TestMetadata("boundMemberExtensionFunction.kt") + public void testBoundMemberExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt"); + } + + @Test + @TestMetadata("boundMemberFunction.kt") + public void testBoundMemberFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt"); + } + + @Test + @TestMetadata("boundMemberProperty.kt") + public void testBoundMemberProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt"); + } + + @Test + @TestMetadata("boundTopLevelExtensionFunction.kt") + public void testBoundTopLevelExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt"); + } + + @Test + @TestMetadata("boundTopLevelExtensionProperty.kt") + public void testBoundTopLevelExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt"); + } + + @Test + @TestMetadata("constructor.kt") + public void testConstructor() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt"); + } + + @Test + @TestMetadata("genericParameterType.kt") + public void testGenericParameterType() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt"); + } + + @Test + @TestMetadata("genericParameterTypeGenericConsumer.kt") + public void testGenericParameterTypeGenericConsumer() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt"); + } + + @Test + @TestMetadata("genericReturnType.kt") + public void testGenericReturnType() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt"); + } + + @Test + @TestMetadata("genericReturnTypeGenericConsumer.kt") + public void testGenericReturnTypeGenericConsumer() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt"); + } + + @Test + @TestMetadata("memberExtensionProperty.kt") + public void testMemberExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt"); + } + + @Test + @TestMetadata("memberFunction.kt") + public void testMemberFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt"); + } + + @Test + @TestMetadata("memberProperty.kt") + public void testMemberProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt"); + } + + @Test + @TestMetadata("simple.kt") + public void testSimple() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt"); + } + + @Test + @TestMetadata("topLevelExtensionFunction.kt") + public void testTopLevelExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt"); + } + + @Test + @TestMetadata("topLevelExtensionProperty.kt") + public void testTopLevelExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt"); + } + + @Test + @TestMetadata("topLevelFunction.kt") + public void testTopLevelFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt"); + } + + @Test + @TestMetadata("topLevelProperty.kt") + public void testTopLevelProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt"); + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtCallResolver.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtCallResolver.kt index 815cb6342a9..b455ee207fd 100644 --- a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtCallResolver.kt +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/components/AbstractKtCallResolver.kt @@ -54,6 +54,7 @@ abstract class AbstractKtCallResolver : KtCallResolver() { is KtNameReferenceExpression -> true is KtOperationExpression -> true is KtArrayAccessExpression -> true + is KtCallableReferenceExpression -> true else -> false } 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 6573a720629..6057c7a91e1 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 @@ -1010,6 +1010,130 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext } } + @Nested + @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences") + @TestDataPath("$PROJECT_ROOT") + public class CallableReferences { + @Test + public void testAllFilesPresentInCallableReferences() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences"), Pattern.compile("^(.+)\\.kt$"), null, true, "withTestCompilerPluginEnabled"); + } + + @Test + @TestMetadata("annotationConstructor.kt") + public void testAnnotationConstructor() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt"); + } + + @Test + @TestMetadata("boundMemberExtensionFunction.kt") + public void testBoundMemberExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt"); + } + + @Test + @TestMetadata("boundMemberFunction.kt") + public void testBoundMemberFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt"); + } + + @Test + @TestMetadata("boundMemberProperty.kt") + public void testBoundMemberProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt"); + } + + @Test + @TestMetadata("boundTopLevelExtensionFunction.kt") + public void testBoundTopLevelExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt"); + } + + @Test + @TestMetadata("boundTopLevelExtensionProperty.kt") + public void testBoundTopLevelExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt"); + } + + @Test + @TestMetadata("constructor.kt") + public void testConstructor() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt"); + } + + @Test + @TestMetadata("genericParameterType.kt") + public void testGenericParameterType() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt"); + } + + @Test + @TestMetadata("genericParameterTypeGenericConsumer.kt") + public void testGenericParameterTypeGenericConsumer() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt"); + } + + @Test + @TestMetadata("genericReturnType.kt") + public void testGenericReturnType() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt"); + } + + @Test + @TestMetadata("genericReturnTypeGenericConsumer.kt") + public void testGenericReturnTypeGenericConsumer() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt"); + } + + @Test + @TestMetadata("memberExtensionProperty.kt") + public void testMemberExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt"); + } + + @Test + @TestMetadata("memberFunction.kt") + public void testMemberFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt"); + } + + @Test + @TestMetadata("memberProperty.kt") + public void testMemberProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt"); + } + + @Test + @TestMetadata("simple.kt") + public void testSimple() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt"); + } + + @Test + @TestMetadata("topLevelExtensionFunction.kt") + public void testTopLevelExtensionFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt"); + } + + @Test + @TestMetadata("topLevelExtensionProperty.kt") + public void testTopLevelExtensionProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt"); + } + + @Test + @TestMetadata("topLevelFunction.kt") + public void testTopLevelFunction() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt"); + } + + @Test + @TestMetadata("topLevelProperty.kt") + public void testTopLevelProperty() { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt"); + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt new file mode 100644 index 00000000000..c551f73587d --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt @@ -0,0 +1,8 @@ +annotation class Anno(val value: String) + +fun test() { + // Annotation class cannot be instantiated + consume(::Anno) +} + +fun consume(f: (String) -> Any) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.txt new file mode 100644 index 00000000000..9ff3ce3291e --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.txt @@ -0,0 +1,21 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = Anno + symbol = (value: kotlin.String): Anno + valueParameters = [ + KtVariableLikeSignature: + name = value + receiverType = null + returnType = kotlin.String + symbol = value: kotlin.String + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = null + typeArgumentsMapping = {} + argumentMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt new file mode 100644 index 00000000000..10bd522cf9c --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt @@ -0,0 +1,15 @@ +interface Foo { + fun Bar.foo(a: Int) +} + +interface Bar + +fun test(foo: Foo) { + with(foo) { + // 'foo' is a member and an extension at the same time. + // References to such elements are prohibited. + consume(Bar::foo) + } +} + +fun consume(f: (Bar, Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.txt new file mode 100644 index 00000000000..35f05ed6a4b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.txt @@ -0,0 +1,30 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtImplicitReceiverValue: + symbol = KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtAnonymousFunctionSymbol(/) + type: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: Foo + type = Foo + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = Bar + returnType = kotlin.Unit + symbol = /Foo.foo(: Bar, : Foo, a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /Foo.foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt new file mode 100644 index 00000000000..a0576c40ba5 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt @@ -0,0 +1,9 @@ +interface Foo { + fun foo(a: Int) +} + +fun test(obj: Foo) { + consume(obj::foo) +} + +fun consume(f: (Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.txt new file mode 100644 index 00000000000..40336c29768 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.txt @@ -0,0 +1,24 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = obj + isSafeNavigation = false + type = Foo + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /Foo.foo(: Foo, a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /Foo.foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt new file mode 100644 index 00000000000..8c9ccba67fc --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt @@ -0,0 +1,10 @@ +class Foo { + val foo: String + get() = "" +} + +fun test(obj: Foo) { + consume(obj::foo) +} + +fun consume(f: () -> String) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.txt new file mode 100644 index 00000000000..f320cc729a6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.txt @@ -0,0 +1,17 @@ +KtSuccessCallInfo: + call = KtSimpleVariableAccessCall: + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = obj + isSafeNavigation = false + type = Foo + extensionReceiver = null + signature = KtVariableLikeSignature: + name = foo + receiverType = null + returnType = kotlin.String + symbol = val foo: kotlin.String + callableIdIfNonLocal = /Foo.foo + simpleAccess = Read: + + typeArgumentsMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt new file mode 100644 index 00000000000..3039ab02ac4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt @@ -0,0 +1,9 @@ +interface Foo + +fun Foo.foo(a: Int) {} + +fun test(obj: Foo) { + consume(obj::foo) +} + +fun consume(f: (Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.txt new file mode 100644 index 00000000000..3dc7e40c072 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.txt @@ -0,0 +1,24 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = obj + isSafeNavigation = false + type = Foo + signature = KtFunctionLikeSignature: + receiverType = Foo + returnType = kotlin.Unit + symbol = /foo(: Foo, a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt new file mode 100644 index 00000000000..ae024667114 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt @@ -0,0 +1,10 @@ +interface Foo + +val Foo.foo: String + get() = "" + +fun test(obj: Foo) { + consume(obj::foo) +} + +fun consume(f: () -> String) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.txt new file mode 100644 index 00000000000..aac012c24ce --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.txt @@ -0,0 +1,17 @@ +KtSuccessCallInfo: + call = KtSimpleVariableAccessCall: + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = obj + isSafeNavigation = false + type = Foo + signature = KtVariableLikeSignature: + name = foo + receiverType = Foo + returnType = kotlin.String + symbol = val foo: kotlin.String + callableIdIfNonLocal = /foo + simpleAccess = Read: + + typeArgumentsMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt new file mode 100644 index 00000000000..447544908be --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt @@ -0,0 +1,7 @@ +class Foo(val value: String) + +fun test() { + consume(::Foo) +} + +fun consume(f: (String) -> Foo) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.txt new file mode 100644 index 00000000000..83d809e4bf7 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.txt @@ -0,0 +1,21 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = Foo + symbol = (value: kotlin.String): Foo + valueParameters = [ + KtVariableLikeSignature: + name = value + receiverType = null + returnType = kotlin.String + symbol = value: kotlin.String + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = null + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt new file mode 100644 index 00000000000..4e8fc190dd0 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt @@ -0,0 +1,9 @@ +interface Foo { + fun foo(value: T) +} + +fun test() { + consume(Foo::foo) +} + +fun consume(f: (Foo, Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.txt new file mode 100644 index 00000000000..396fa4de3d1 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.txt @@ -0,0 +1,21 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /Foo.foo(: Foo, value: T): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = value + receiverType = null + returnType = kotlin.Int + symbol = value: T + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /Foo.foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt new file mode 100644 index 00000000000..e60c187b710 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt @@ -0,0 +1,9 @@ +interface Foo { + fun foo(value: T) +} + +fun test() { + consume(Foo::foo) +} + +fun consume(f: (Foo, T) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.txt new file mode 100644 index 00000000000..396fa4de3d1 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.txt @@ -0,0 +1,21 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /Foo.foo(: Foo, value: T): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = value + receiverType = null + returnType = kotlin.Int + symbol = value: T + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /Foo.foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt new file mode 100644 index 00000000000..50b0cb38397 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt @@ -0,0 +1,9 @@ +interface Foo { + fun foo(): T +} + +fun test() { + consume(Foo::foo) +} + +fun consume(f: (Foo) -> Int) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.txt new file mode 100644 index 00000000000..76fea4aaaf4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Int + symbol = /Foo.foo(: Foo): T + valueParameters = [] + callableIdIfNonLocal = /Foo.foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt new file mode 100644 index 00000000000..1c43dacd4a7 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt @@ -0,0 +1,9 @@ +interface Foo { + fun foo(): T +} + +fun test() { + consume(Foo::foo) +} + +fun consume(f: (Foo) -> T) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.txt new file mode 100644 index 00000000000..76fea4aaaf4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Int + symbol = /Foo.foo(: Foo): T + valueParameters = [] + callableIdIfNonLocal = /Foo.foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt new file mode 100644 index 00000000000..f53b92f699f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt @@ -0,0 +1,16 @@ +interface Foo { + val Bar.foo: String + get() = "" +} + +interface Bar + +fun test(foo: Foo) { + with(foo) { + // 'foo' is a member and an extension at the same time. + // References to such elements are prohibited. + consume(Bar::foo) + } +} + +fun consume(f: (Bar) -> String) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.txt new file mode 100644 index 00000000000..ee0f2aa0eea --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.txt @@ -0,0 +1,23 @@ +KtSuccessCallInfo: + call = KtSimpleVariableAccessCall: + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtImplicitReceiverValue: + symbol = KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtAnonymousFunctionSymbol(/) + type: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: Foo + type = Foo + extensionReceiver = null + signature = KtVariableLikeSignature: + name = foo + receiverType = Bar + returnType = kotlin.String + symbol = val foo: kotlin.String + callableIdIfNonLocal = /Foo.foo + simpleAccess = Read: + + typeArgumentsMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt new file mode 100644 index 00000000000..277d352db2c --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt @@ -0,0 +1,9 @@ +interface Foo { + fun foo(a: Int) +} + +fun test() { + consume(Foo::foo) +} + +fun consume(f: (Foo, Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.txt new file mode 100644 index 00000000000..b57ffb94e65 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.txt @@ -0,0 +1,21 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /Foo.foo(: Foo, a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /Foo.foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt new file mode 100644 index 00000000000..8e72d869b3b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt @@ -0,0 +1,10 @@ +class Foo { + val foo: String + get() = "" +} + +fun test() { + consume(Foo::foo) +} + +fun consume(f: (Foo) -> String) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.txt new file mode 100644 index 00000000000..18d8111514f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleVariableAccessCall: + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtVariableLikeSignature: + name = foo + receiverType = null + returnType = kotlin.String + symbol = val foo: kotlin.String + callableIdIfNonLocal = /Foo.foo + simpleAccess = Read: + + typeArgumentsMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt new file mode 100644 index 00000000000..c9bcb9672eb --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt @@ -0,0 +1,3 @@ +fun foo() { + ::foo +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.txt new file mode 100644 index 00000000000..4b9e67cd38f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /foo(): kotlin.Unit + valueParameters = [] + callableIdIfNonLocal = /foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt new file mode 100644 index 00000000000..33883836cc7 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt @@ -0,0 +1,9 @@ +interface Foo + +fun Foo.foo(a: Int) {} + +fun test(foo: Foo) { + consume(Foo::foo) +} + +fun consume(f: (Foo, Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.txt new file mode 100644 index 00000000000..e527a425446 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.txt @@ -0,0 +1,21 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = Foo + returnType = kotlin.Unit + symbol = /foo(: Foo, a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /foo + typeArgumentsMapping = {} + argumentMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt new file mode 100644 index 00000000000..f69756844e8 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt @@ -0,0 +1,10 @@ +interface Foo + +val Foo.foo: String + get() = "" + +fun test() { + consume(Foo::foo) +} + +fun consume(f: (Foo) -> String) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.txt new file mode 100644 index 00000000000..98a401dee46 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleVariableAccessCall: + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtVariableLikeSignature: + name = foo + receiverType = Foo + returnType = kotlin.String + symbol = val foo: kotlin.String + callableIdIfNonLocal = /foo + simpleAccess = Read: + + typeArgumentsMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt new file mode 100644 index 00000000000..3bbffd247ba --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt @@ -0,0 +1,7 @@ +fun foo(a: Int) {} + +fun test() { + consume(::foo) +} + +fun consume(f: (Int) -> Unit) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.txt new file mode 100644 index 00000000000..cb6fe8d1220 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.txt @@ -0,0 +1,21 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /foo(a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + callableIdIfNonLocal = null + ] + callableIdIfNonLocal = /foo + typeArgumentsMapping = {} + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt new file mode 100644 index 00000000000..80e26589a1b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt @@ -0,0 +1,8 @@ +val foo: String + get() = "" + +fun test(foo: Foo) { + consume(::foo) +} + +fun consume(f: () -> String) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.txt new file mode 100644 index 00000000000..df538974166 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleVariableAccessCall: + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtVariableLikeSignature: + name = foo + receiverType = null + returnType = kotlin.String + symbol = val foo: kotlin.String + callableIdIfNonLocal = /foo + simpleAccess = Read: + + typeArgumentsMapping = {}