From 61265a65014ad93fcc5e4628645847c48c4b86d3 Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Thu, 16 Dec 2021 14:20:19 +0100 Subject: [PATCH] Return error candidates from KtFirArrayAccessReference.resolveToSymbols --- .../kotlin/analysis/api/fir/FirUtils.kt | 5 +++- .../references/KtFirArrayAccessReference.kt | 10 ++++---- .../fir/FirReferenceResolveTestGenerated.java | 24 +++++++++++++++++++ .../arrayAccess/getFunction.kt | 5 ++++ .../arrayAccess/getFunction.txt | 2 ++ .../arrayAccess/getOperator.kt | 5 ++++ .../arrayAccess/getOperator.txt | 2 ++ .../arrayAccess/setFunction.kt | 5 ++++ .../arrayAccess/setFunction.txt | 2 ++ .../arrayAccess/setOperator.kt | 5 ++++ .../arrayAccess/setOperator.txt | 2 ++ 11 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.txt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt index 2062ca8a8ac..34645d5cb7b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt @@ -48,6 +48,9 @@ private fun FirBasedSymbol<*>.isInvokeFunction() = fun FirFunctionCall.getCalleeSymbol(): FirBasedSymbol<*>? = calleeReference.getResolvedSymbolOfNameReference() +fun FirFunctionCall.getCandidateSymbols(): Collection> = + calleeReference.getCandidateSymbols() + fun FirReference.getResolvedSymbolOfNameReference(): FirBasedSymbol<*>? = (this as? FirResolvedNamedReference)?.resolvedSymbol @@ -84,4 +87,4 @@ internal fun FirAnnotation.toKtAnnotationApplication(useSiteSession: FirSession) useSiteSession, ) ) -} \ No newline at end of file +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirArrayAccessReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirArrayAccessReference.kt index 33006098854..bb53ea8be5a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirArrayAccessReference.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirArrayAccessReference.kt @@ -6,13 +6,13 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.expressions.FirFunctionCall -import org.jetbrains.kotlin.analysis.api.fir.getCalleeSymbol -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.buildSymbol +import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.psi.KtArrayAccessExpression class KtFirArrayAccessReference( @@ -21,8 +21,8 @@ class KtFirArrayAccessReference( override fun KtAnalysisSession.resolveToSymbols(): Collection { check(this is KtFirAnalysisSession) val fir = element.getOrBuildFirSafe(firResolveState) ?: return emptyList() - return listOfNotNull(fir.getCalleeSymbol()?.fir?.buildSymbol(firSymbolBuilder)) + return fir.getCandidateSymbols().map { it.fir.buildSymbol(firSymbolBuilder) } } override fun handleElementRename(newElementName: String): PsiElement = TODO("Not yet implemented") -} \ No newline at end of file +} diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java index d31510d43d9..184d838784d 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/FirReferenceResolveTestGenerated.java @@ -675,11 +675,35 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv runTest("analysis/analysis-api/testData/referenceResolve/arrayAccess/get.kt"); } + @Test + @TestMetadata("getFunction.kt") + public void testGetFunction() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.kt"); + } + + @Test + @TestMetadata("getOperator.kt") + public void testGetOperator() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.kt"); + } + @Test @TestMetadata("set.kt") public void testSet() throws Exception { runTest("analysis/analysis-api/testData/referenceResolve/arrayAccess/set.kt"); } + + @Test + @TestMetadata("setFunction.kt") + public void testSetFunction() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.kt"); + } + + @Test + @TestMetadata("setOperator.kt") + public void testSetOperator() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.kt"); + } } @Nested diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.kt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.kt new file mode 100644 index 00000000000..8fd09d8986d --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.kt @@ -0,0 +1,5 @@ +fun Int.get(index: Int) = 42 + +fun f() { + 1[2] +} diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.txt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.txt new file mode 100644 index 00000000000..9691fedc7ca --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getFunction.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in ROOT) fun kotlin.Int.get(index: kotlin.Int): kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.kt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.kt new file mode 100644 index 00000000000..5c7cf10147b --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.kt @@ -0,0 +1,5 @@ +operator fun Int.get(index: Int) = 42 + +fun f() { + 1[2] +} diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.txt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.txt new file mode 100644 index 00000000000..f448b7b8ebb --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/getOperator.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in ROOT) operator fun kotlin.Int.get(index: kotlin.Int): kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.kt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.kt new file mode 100644 index 00000000000..e4be567db85 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.kt @@ -0,0 +1,5 @@ +fun Int.set(index: Int, value: Int) = value + +fun f() { + 1[2] = 42 +} diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.txt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.txt new file mode 100644 index 00000000000..7ce119473a6 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setFunction.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in ROOT) fun kotlin.Int.set(index: kotlin.Int, value: kotlin.Int): kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.kt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.kt new file mode 100644 index 00000000000..bb0170e7bd7 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.kt @@ -0,0 +1,5 @@ +operator fun Int.set(index: Int, value: Int) = value + +fun f() { + 1[2] = 42 +} diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.txt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.txt new file mode 100644 index 00000000000..4f85400c785 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/setOperator.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in ROOT) operator fun kotlin.Int.set(index: kotlin.Int, value: kotlin.Int): kotlin.Int