From 05eb38f1b9436d42014ae6dd5960432cdca87296 Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Tue, 23 Feb 2021 14:42:07 -0800 Subject: [PATCH] IDE FIR: fix resolving vararg parameter type For a vararg parameter type, there corresponding FIR element has a fake source of kind ArrayTypeFromVarargParameter. As a result, `getOrBuildFir` returns the whole `FirValueParameter` for the parameter type reference. Therefore, we need some special handling for this case in order to resolve the proper `KtSymbol`. Original commit: 17617ffd3ffcc06d1596dae0c4b4797b4c90e7cc GitOrigin-RevId: 808dc907687f22ebb6fb60eacdde1b66244d6d4a --- .../resolve/FirReferenceResolveTestGenerated.java | 15 +++++++++++++++ .../idea/references/FirReferenceResolveHelper.kt | 12 +++++++----- .../resolve/ReferenceResolveTestGenerated.java | 15 +++++++++++++++ .../resolve/references/InMethodVarargParameter.kt | 9 +++++++++ .../references/InVaragReferenceInFunctionBody.kt | 9 +++++++++ .../InVaragReferenceInNamedParameter.kt | 10 ++++++++++ 6 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/resolve/references/InMethodVarargParameter.kt create mode 100644 plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInFunctionBody.kt create mode 100644 plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInNamedParameter.kt diff --git a/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java b/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java index 1b8c6c4e294d..a9a51cc6fac3 100644 --- a/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java +++ b/plugins/kotlin/fir/test/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java @@ -216,6 +216,11 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv runTest("../idea/tests/testData/resolve/references/InMethodParameter.kt"); } + @TestMetadata("InMethodVarargParameter.kt") + public void testInMethodVarargParameter() throws Exception { + runTest("idea/testData/resolve/references/InMethodVarargParameter.kt"); + } + @TestMetadata("InObjectClassObject.kt") public void testInObjectClassObject() throws Exception { runTest("../idea/tests/testData/resolve/references/InObjectClassObject.kt"); @@ -226,6 +231,16 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv runTest("../idea/tests/testData/resolve/references/InSecondClassObject.kt"); } + @TestMetadata("InVaragReferenceInFunctionBody.kt") + public void testInVaragReferenceInFunctionBody() throws Exception { + runTest("idea/testData/resolve/references/InVaragReferenceInFunctionBody.kt"); + } + + @TestMetadata("InVaragReferenceInNamedParameter.kt") + public void testInVaragReferenceInNamedParameter() throws Exception { + runTest("idea/testData/resolve/references/InVaragReferenceInNamedParameter.kt"); + } + @TestMetadata("JavaAnnotationParameter.kt") public void testJavaAnnotationParameter() throws Exception { runTest("../idea/tests/testData/resolve/references/JavaAnnotationParameter.kt"); diff --git a/plugins/kotlin/frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/plugins/kotlin/frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index 1887b75d494a..4b1176dcb3cd 100644 --- a/plugins/kotlin/frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/plugins/kotlin/frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.tree.TokenSet +import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE import org.jetbrains.kotlin.fir.declarations.* @@ -22,10 +23,7 @@ import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl -import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType -import org.jetbrains.kotlin.fir.types.FirErrorTypeRef -import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef -import org.jetbrains.kotlin.fir.types.classId +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.idea.fir.getCandidateSymbols import org.jetbrains.kotlin.idea.fir.isImplicitFunctionCall import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir @@ -47,7 +45,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult internal object FirReferenceResolveHelper { fun FirResolvedTypeRef.toTargetSymbol(session: FirSession, symbolBuilder: KtSymbolByFirBuilder): KtSymbol? { - val type = type as? ConeLookupTagBasedType + val type = getDeclaredType() as? ConeLookupTagBasedType val resolvedSymbol = type?.lookupTag?.toSymbol(session) as? AbstractFirBasedSymbol<*> val symbol = resolvedSymbol ?: run { @@ -58,6 +56,10 @@ internal object FirReferenceResolveHelper { return symbol?.fir?.buildSymbol(symbolBuilder) } + private fun FirResolvedTypeRef.getDeclaredType() = + if (this.delegatedTypeRef?.source?.kind == FirFakeSourceElementKind.ArrayTypeFromVarargParameter) type.arrayElementType() + else type + private fun ClassId.toTargetPsi( session: FirSession, symbolBuilder: KtSymbolByFirBuilder, diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java index 6048a945e112..8b2245564aa4 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java @@ -527,6 +527,11 @@ public abstract class ReferenceResolveTestGenerated extends AbstractReferenceRes runTest("testData/resolve/references/InMethodParameter.kt"); } + @TestMetadata("InMethodVarargParameter.kt") + public void testInMethodVarargParameter() throws Exception { + runTest("idea/testData/resolve/references/InMethodVarargParameter.kt"); + } + @TestMetadata("InObjectClassObject.kt") public void testInObjectClassObject() throws Exception { runTest("testData/resolve/references/InObjectClassObject.kt"); @@ -537,6 +542,16 @@ public abstract class ReferenceResolveTestGenerated extends AbstractReferenceRes runTest("testData/resolve/references/InSecondClassObject.kt"); } + @TestMetadata("InVaragReferenceInFunctionBody.kt") + public void testInVaragReferenceInFunctionBody() throws Exception { + runTest("idea/testData/resolve/references/InVaragReferenceInFunctionBody.kt"); + } + + @TestMetadata("InVaragReferenceInNamedParameter.kt") + public void testInVaragReferenceInNamedParameter() throws Exception { + runTest("idea/testData/resolve/references/InVaragReferenceInNamedParameter.kt"); + } + @TestMetadata("JavaAnnotationParameter.kt") public void testJavaAnnotationParameter() throws Exception { runTest("testData/resolve/references/JavaAnnotationParameter.kt"); diff --git a/plugins/kotlin/idea/tests/testData/resolve/references/InMethodVarargParameter.kt b/plugins/kotlin/idea/tests/testData/resolve/references/InMethodVarargParameter.kt new file mode 100644 index 000000000000..8f61bacb7036 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/resolve/references/InMethodVarargParameter.kt @@ -0,0 +1,9 @@ +package test + +class A + +class Test { + fun some(vararg a: A) = 12 +} + +// REF: (test).A diff --git a/plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInFunctionBody.kt b/plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInFunctionBody.kt new file mode 100644 index 000000000000..c4b14eacb783 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInFunctionBody.kt @@ -0,0 +1,9 @@ +package test + +class A + +class Test { + fun some(vararg a: A) = a +} + +// REF: a diff --git a/plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInNamedParameter.kt b/plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInNamedParameter.kt new file mode 100644 index 000000000000..0c4e83ad8ae1 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/resolve/references/InVaragReferenceInNamedParameter.kt @@ -0,0 +1,10 @@ +package test + +class A + +class Test { + fun some(vararg a: A) {} + fun call() = some(a = arrayOf(A())) +} + +// REF: a