FIR: Add fake root prefix for IDE resolution

This commit is contained in:
Roman Golyshev
2020-08-26 16:51:48 +03:00
committed by Space
parent 0de251e50d
commit 68b5f2736e
2 changed files with 17 additions and 0 deletions
@@ -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
@@ -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()) {