FIR: Fix super-type nested qualifier resolution
This commit is contained in:
committed by
Mikhail Glukhikh
parent
06cb24db7c
commit
e010a96055
+5
-1
@@ -73,7 +73,11 @@ class FirTypeResolverImpl : FirTypeResolver {
|
|||||||
scope.processClassifiersByName(type.qualifier.first().name, position) { symbol ->
|
scope.processClassifiersByName(type.qualifier.first().name, position) { symbol ->
|
||||||
resolvedSymbol = when (symbol) {
|
resolvedSymbol = when (symbol) {
|
||||||
is ConeClassLikeSymbol -> {
|
is ConeClassLikeSymbol -> {
|
||||||
qualifierResolver.resolveSymbolWithPrefix(type.qualifier, symbol.classId)
|
if (type.qualifier.size == 1) {
|
||||||
|
symbol
|
||||||
|
} else {
|
||||||
|
qualifierResolver.resolveSymbolWithPrefix(type.qualifier, symbol.classId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is ConeTypeParameterSymbol -> {
|
is ConeTypeParameterSymbol -> {
|
||||||
assert(type.qualifier.size == 1)
|
assert(type.qualifier.size == 1)
|
||||||
|
|||||||
+15
-5
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||||
import org.jetbrains.kotlin.fir.render
|
import org.jetbrains.kotlin.fir.render
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
|
import org.jetbrains.kotlin.fir.resolve.FirTypeResolver
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||||
@@ -49,8 +50,8 @@ open class FirTypeResolveTransformer : FirTransformer<Nothing?>() {
|
|||||||
return super.transformFile(file, data)
|
return super.transformFile(file, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun lookupSuperTypes(klass: FirClass): List<ClassId> {
|
private fun lookupSuperTypes(klass: FirClass): List<ConeClassLikeType> {
|
||||||
return mutableListOf<ConeClassLikeType>().also { klass.symbol.collectSuperTypes(it) }.map { it.symbol.classId }
|
return mutableListOf<ConeClassLikeType>().also { klass.symbol.collectSuperTypes(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveSuperTypesAndExpansions(element: FirMemberDeclaration) {
|
private fun resolveSuperTypesAndExpansions(element: FirMemberDeclaration) {
|
||||||
@@ -69,14 +70,23 @@ open class FirTypeResolveTransformer : FirTransformer<Nothing?>() {
|
|||||||
scope.scopes += FirClassLikeTypeParameterScope(klass)
|
scope.scopes += FirClassLikeTypeParameterScope(klass)
|
||||||
resolveSuperTypesAndExpansions(klass)
|
resolveSuperTypesAndExpansions(klass)
|
||||||
|
|
||||||
scope.scopes += FirNestedClassifierScope(classId, klass.session)
|
|
||||||
|
val firProvider = FirProvider.getInstance(klass.session)
|
||||||
|
scope.scopes += FirNestedClassifierScope(classId, firProvider)
|
||||||
val companionObjects = klass.declarations.filterIsInstance<FirClass>().filter { it.isCompanion }
|
val companionObjects = klass.declarations.filterIsInstance<FirClass>().filter { it.isCompanion }
|
||||||
for (companionObject in companionObjects) {
|
for (companionObject in companionObjects) {
|
||||||
val companionId = ClassId(packageFqName, classLikeName.child(companionObject.name), false)
|
val companionId = ClassId(packageFqName, classLikeName.child(companionObject.name), false)
|
||||||
scope.scopes += FirNestedClassifierScope(companionId, klass.session)
|
scope.scopes += FirNestedClassifierScope(companionId, firProvider)
|
||||||
}
|
}
|
||||||
|
|
||||||
val superTypeScopes = lookupSuperTypes(klass).map { FirNestedClassifierScope(it, klass.session) }
|
val superTypeScopes = lookupSuperTypes(klass).map {
|
||||||
|
val symbol = it.symbol
|
||||||
|
if (symbol is FirBasedSymbol<*>) {
|
||||||
|
FirNestedClassifierScope(symbol.classId, FirProvider.getInstance(symbol.fir.session))
|
||||||
|
} else {
|
||||||
|
FirNestedClassifierScope(symbol.classId, FirSymbolProvider.getInstance(klass.session))
|
||||||
|
}
|
||||||
|
}
|
||||||
scope.scopes.addAll(superTypeScopes)
|
scope.scopes.addAll(superTypeScopes)
|
||||||
val result = super.transformClass(klass, data)
|
val result = super.transformClass(klass, data)
|
||||||
scope = scope.scopes[0] as FirCompositeScope
|
scope = scope.scopes[0] as FirCompositeScope
|
||||||
|
|||||||
+6
-7
@@ -5,18 +5,17 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.scopes.impl
|
package org.jetbrains.kotlin.fir.scopes.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class FirNestedClassifierScope(val classId: ClassId, val session: FirSession) : FirScope {
|
class FirNestedClassifierScope(
|
||||||
|
val classId: ClassId,
|
||||||
private val firProvider = FirProvider.getInstance(session)
|
private val symbolProvider: FirSymbolProvider
|
||||||
|
) : FirScope {
|
||||||
|
|
||||||
override fun processClassifiersByName(
|
override fun processClassifiersByName(
|
||||||
name: Name,
|
name: Name,
|
||||||
@@ -24,7 +23,7 @@ class FirNestedClassifierScope(val classId: ClassId, val session: FirSession) :
|
|||||||
processor: (ConeSymbol) -> Boolean
|
processor: (ConeSymbol) -> Boolean
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val child = classId.createNestedClassId(name)
|
val child = classId.createNestedClassId(name)
|
||||||
val symbol = firProvider.getSymbolByFqName(child)
|
val symbol = symbolProvider.getSymbolByFqName(child)
|
||||||
|
|
||||||
return symbol == null || processor(symbol)
|
return symbol == null || processor(symbol)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user