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
This commit is contained in:
Tianyu Geng
2022-01-22 10:51:06 +00:00
committed by intellij-monorepo-bot
parent df7aa3e20b
commit 05eb38f1b9
6 changed files with 65 additions and 5 deletions
@@ -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");
@@ -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,
@@ -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");
@@ -0,0 +1,9 @@
package test
class A
class Test {
fun some(vararg a: <caret>A) = 12
}
// REF: (test).A
@@ -0,0 +1,9 @@
package test
class A
class Test {
fun some(vararg a: A) = <caret>a
}
// REF: a
@@ -0,0 +1,10 @@
package test
class A
class Test {
fun some(vararg a: A) {}
fun call() = some(<caret>a = arrayOf(A()))
}
// REF: a