From 7a1ef25333d265fed362d7a54b3187303deca6e0 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Wed, 2 Feb 2022 11:04:41 +0000 Subject: [PATCH] Analysis API: Rename `resolveCandidates` to `collectCallCandidates`. Didn't bother to rename the directory in the test data. --- .../descriptors/components/KtFe10CallResolver.kt | 2 +- .../api/fir/components/KtFirCallResolver.kt | 10 +++++----- .../components/AbstractResolveCandidatesTest.kt | 14 ++++++-------- .../analysis/api/components/KtCallResolver.kt | 13 ++++++++++--- 4 files changed, 22 insertions(+), 17 deletions(-) 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 4e183b9b2e9..7b1e3e96dd4 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 @@ -147,7 +147,7 @@ internal class KtFe10CallResolver( } // TODO: See Call.resolveCandidates() in plugins/kotlin/core/src/org/jetbrains/kotlin/idea/core/Utils.kt - override fun resolveCandidates(psi: KtElement): List = TODO() + override fun collectCallCandidates(psi: KtElement): List = TODO() private fun handleAsCompoundAssignment(context: BindingContext, binaryExpression: KtBinaryExpression): KtCallInfo? { val left = binaryExpression.left ?: return null 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 c21f6a15e1e..0c5e9022a91 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 @@ -698,9 +698,9 @@ internal class KtFirCallResolver( private fun FirValueParameterSymbol.toKtSymbol(): KtValueParameterSymbol = firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(this) - override fun resolveCandidates(psi: KtElement): List = withValidityAssertion { + override fun collectCallCandidates(psi: KtElement): List = withValidityAssertion { getKtCallInfos(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> - resolveCandidates( + collectCallCandidates( psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall @@ -709,7 +709,7 @@ internal class KtFirCallResolver( } // TODO: Refactor common code with FirElement.toKtCallInfo() when other FirResolvables are handled - private fun FirElement.resolveCandidates( + private fun FirElement.collectCallCandidates( psi: KtElement, resolveCalleeExpressionOfFunctionCall: Boolean, resolveFragmentOfCall: Boolean, @@ -725,7 +725,7 @@ internal class KtFirCallResolver( // // This way `f` is also the explicit receiver of this implicit `invoke` call // } // ``` - return explicitReceiver?.resolveCandidates( + return explicitReceiver?.collectCallCandidates( psi, resolveCalleeExpressionOfFunctionCall = false, resolveFragmentOfCall = resolveFragmentOfCall @@ -736,7 +736,7 @@ internal class KtFirCallResolver( val firFile = psi.containingKtFile.getOrBuildFirFile(firResolveState) AllCandidatesResolver(analysisSession.rootModuleSession, firFile).getAllCandidates(this, psi, resolveFragmentOfCall) } - is FirSafeCallExpression -> selector.resolveCandidates( + is FirSafeCallExpression -> selector.collectCallCandidates( psi, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractResolveCandidatesTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractResolveCandidatesTest.kt index 247db770518..861eca618a6 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractResolveCandidatesTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/AbstractResolveCandidatesTest.kt @@ -7,9 +7,7 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.components import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.calls.KtCall import org.jetbrains.kotlin.analysis.api.calls.KtCallInfo -import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleModuleTest import org.jetbrains.kotlin.psi.* @@ -24,7 +22,7 @@ abstract class AbstractResolveCandidatesTest : AbstractHLApiSingleModuleTest() { val actual = executeOnPooledThreadInReadAction { analyseForTest(expression) { - val candidates = resolveCandidates(expression) + val candidates = collectCallCandidates(expression) if (candidates.isEmpty()) { "NO_CANDIDATES" } else { @@ -35,19 +33,19 @@ abstract class AbstractResolveCandidatesTest : AbstractHLApiSingleModuleTest() { testServices.assertions.assertEqualsToTestDataFileSibling(actual) } - private fun KtAnalysisSession.resolveCandidates(element: PsiElement): List = when (element) { - is KtValueArgument -> resolveCandidates(element.getArgumentExpression()!!) + private fun KtAnalysisSession.collectCallCandidates(element: PsiElement): List = when (element) { + is KtValueArgument -> this@collectCallCandidates.collectCallCandidates(element.getArgumentExpression()!!) is KtDeclarationModifierList -> { val annotationEntry = element.annotationEntries.singleOrNull() ?: error("Only single annotation entry is supported for now") - annotationEntry.resolveCandidates() + annotationEntry.collectCallCandidates() } is KtFileAnnotationList -> { val annotationEntry = element.annotationEntries.singleOrNull() ?: error("Only single annotation entry is supported for now") - annotationEntry.resolveCandidates() + annotationEntry.collectCallCandidates() } - is KtElement -> element.resolveCandidates() + is KtElement -> element.collectCallCandidates() else -> error("Selected element type (${element::class.simpleName}) is not supported for resolveCandidates()") } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt index 64c849175ab..306f905401f 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCallResolver.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.psi.KtUnaryExpression public abstract class KtCallResolver : KtAnalysisSessionComponent() { public abstract fun resolveCall(psi: KtElement): KtCallInfo? - public abstract fun resolveCandidates(psi: KtElement): List + public abstract fun collectCallCandidates(psi: KtElement): List } public interface KtCallResolverMixIn : KtAnalysisSessionMixIn { @@ -31,6 +31,13 @@ public interface KtCallResolverMixIn : KtAnalysisSessionMixIn { public fun KtArrayAccessExpression.resolveCall(): KtCallInfo = analysisSession.callResolver.resolveCall(this) ?: error("KtArrayAccessExpression should always resolve to a KtCallInfo") - public fun KtElement.resolveCandidates(): List = - analysisSession.callResolver.resolveCandidates(this) + /** + * Returns all the candidates considered during [overload resolution](https://kotlinlang.org/spec/overload-resolution.html) for the call + * corresponding to this [KtElement]. + * + * [resolveCall] only returns the final result of overload resolution, i.e., the selected callable after considering candidate + * applicability and choosing the most specific candidate. + */ + public fun KtElement.collectCallCandidates(): List = + analysisSession.callResolver.collectCallCandidates(this) } \ No newline at end of file