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.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
const val ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE = "_root_ide_package_"
|
||||||
|
|
||||||
class FirQualifiedNameResolver(private val components: BodyResolveComponents) {
|
class FirQualifiedNameResolver(private val components: BodyResolveComponents) {
|
||||||
private val session = components.session
|
private val session = components.session
|
||||||
private var qualifierStack = mutableListOf<NameWithTypeArguments>()
|
private var qualifierStack = mutableListOf<NameWithTypeArguments>()
|
||||||
@@ -66,6 +68,11 @@ class FirQualifiedNameResolver(private val components: BodyResolveComponents) {
|
|||||||
}
|
}
|
||||||
val symbolProvider = session.symbolProvider
|
val symbolProvider = session.symbolProvider
|
||||||
var qualifierParts = qualifierStack.asReversed().map { it.name.asString() }
|
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?
|
var resolved: PackageOrClass?
|
||||||
do {
|
do {
|
||||||
resolved = resolveToPackageOrClass(
|
resolved = resolveToPackageOrClass(
|
||||||
@@ -78,6 +85,11 @@ class FirQualifiedNameResolver(private val components: BodyResolveComponents) {
|
|||||||
|
|
||||||
if (resolved != null) {
|
if (resolved != null) {
|
||||||
qualifierPartsToDrop = qualifierParts.size - 1
|
qualifierPartsToDrop = qualifierParts.size - 1
|
||||||
|
// we would need to drop fake package too
|
||||||
|
if (fakeRootIdePrefixIsPresent) {
|
||||||
|
qualifierPartsToDrop += 1
|
||||||
|
}
|
||||||
|
|
||||||
return buildResolvedQualifier {
|
return buildResolvedQualifier {
|
||||||
this.source = source
|
this.source = source
|
||||||
packageFqName = resolved.packageFqName
|
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.FirSession
|
||||||
import org.jetbrains.kotlin.fir.NoMutableState
|
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.FirQualifierResolver
|
||||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
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<*>? {
|
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
|
val firProvider = session.symbolProvider
|
||||||
|
|
||||||
if (parts.isNotEmpty()) {
|
if (parts.isNotEmpty()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user