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