FIR: Add fake root prefix for IDE resolution
This commit is contained in:
@@ -20,6 +20,8 @@ import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
const val ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE = "_root_ide_package_"
|
||||
|
||||
class FirQualifiedNameResolver(private val components: BodyResolveComponents) {
|
||||
private val session = components.session
|
||||
private var qualifierStack = mutableListOf<NameWithTypeArguments>()
|
||||
@@ -66,6 +68,11 @@ class FirQualifiedNameResolver(private val components: BodyResolveComponents) {
|
||||
}
|
||||
val symbolProvider = session.symbolProvider
|
||||
var qualifierParts = qualifierStack.asReversed().map { it.name.asString() }
|
||||
|
||||
val fakeRootIdePrefixIsPresent = qualifierParts.firstOrNull() == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
|
||||
if (fakeRootIdePrefixIsPresent) {
|
||||
qualifierParts = qualifierParts.drop(1)
|
||||
}
|
||||
var resolved: PackageOrClass?
|
||||
do {
|
||||
resolved = resolveToPackageOrClass(
|
||||
@@ -78,6 +85,11 @@ class FirQualifiedNameResolver(private val components: BodyResolveComponents) {
|
||||
|
||||
if (resolved != null) {
|
||||
qualifierPartsToDrop = qualifierParts.size - 1
|
||||
// we would need to drop fake package too
|
||||
if (fakeRootIdePrefixIsPresent) {
|
||||
qualifierPartsToDrop += 1
|
||||
}
|
||||
|
||||
return buildResolvedQualifier {
|
||||
this.source = source
|
||||
packageFqName = resolved.packageFqName
|
||||
|
||||
+5
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.providers.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.NoMutableState
|
||||
import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
|
||||
import org.jetbrains.kotlin.fir.resolve.FirQualifierResolver
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
@@ -29,6 +30,10 @@ class FirQualifierResolverImpl(val session: FirSession) : FirQualifierResolver()
|
||||
}
|
||||
|
||||
override fun resolveSymbol(parts: List<FirQualifierPart>): FirClassifierSymbol<*>? {
|
||||
if (parts.firstOrNull()?.name?.asString() == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE) {
|
||||
return resolveSymbol(parts.drop(1))
|
||||
}
|
||||
|
||||
val firProvider = session.symbolProvider
|
||||
|
||||
if (parts.isNotEmpty()) {
|
||||
|
||||
Reference in New Issue
Block a user