FIR2IR: introduce & use ClassId-based lookup for local class as IrParent
This commit is contained in:
committed by
Mikhail Glukhikh
parent
777b16e0a3
commit
99286a6ce3
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.ir.util.constructors
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class Fir2IrClassifierStorage(
|
||||
@@ -141,6 +142,13 @@ class Fir2IrClassifierStorage(
|
||||
}
|
||||
}
|
||||
|
||||
internal fun getCachedLocalClass(classId: ClassId): IrClass? {
|
||||
require(classId.isLocal) {
|
||||
"As the function name implies, it ought to be used to look up _local_ classes."
|
||||
}
|
||||
return localStorage.getLocalClass(classId)
|
||||
}
|
||||
|
||||
private fun FirRegularClass.enumClassModality(): Modality {
|
||||
return when {
|
||||
declarations.any { it is FirCallableMemberDeclaration<*> && it.modality == Modality.ABSTRACT } -> {
|
||||
|
||||
+14
-10
@@ -201,16 +201,21 @@ class Fir2IrDeclarationStorage(
|
||||
}
|
||||
}
|
||||
|
||||
internal fun findIrParent(packageFqName: FqName, parentClassId: ClassId?, firBasedSymbol: FirBasedSymbol<*>): IrDeclarationParent? {
|
||||
return if (parentClassId != null) {
|
||||
// TODO: this will never work for local classes
|
||||
val parentFirSymbol = firSymbolProvider.getClassLikeSymbolByFqName(parentClassId)
|
||||
if (parentFirSymbol is FirClassSymbol) {
|
||||
val parentIrSymbol = classifierStorage.getIrClassSymbol(parentFirSymbol)
|
||||
parentIrSymbol.owner
|
||||
private fun findIrClass(classId: ClassId): IrClass? =
|
||||
if (classId.isLocal) {
|
||||
classifierStorage.getCachedLocalClass(classId)
|
||||
} else {
|
||||
val firSymbol = firSymbolProvider.getClassLikeSymbolByFqName(classId)
|
||||
if (firSymbol is FirClassSymbol) {
|
||||
classifierStorage.getIrClassSymbol(firSymbol).owner
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun findIrParent(packageFqName: FqName, parentClassId: ClassId?, firBasedSymbol: FirBasedSymbol<*>): IrDeclarationParent? {
|
||||
return if (parentClassId != null) {
|
||||
findIrClass(parentClassId)
|
||||
} else {
|
||||
val containerFile = when (firBasedSymbol) {
|
||||
is FirCallableSymbol -> firProvider.getFirCallableContainerFile(firBasedSymbol)
|
||||
@@ -1039,13 +1044,12 @@ class Fir2IrDeclarationStorage(
|
||||
is FirEnumEntry -> {
|
||||
classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol }
|
||||
val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol)
|
||||
val parentClassSymbol = firVariableSymbol.callableId.classId?.let { firSymbolProvider.getClassLikeSymbolByFqName(it) }
|
||||
val irParentClass = (parentClassSymbol?.fir as? FirClass<*>)?.let { classifierStorage.getCachedIrClass(it) }
|
||||
val irParentClass = firVariableSymbol.callableId.classId?.let { findIrClass(it) }
|
||||
classifierStorage.createIrEnumEntry(
|
||||
firDeclaration,
|
||||
irParent = irParentClass,
|
||||
origin = if (containingFile != null) IrDeclarationOrigin.DEFINED else
|
||||
(parentClassSymbol?.fir as? FirClass<*>)?.irOrigin(firProvider) ?: IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
|
||||
irParentClass?.origin ?: IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
|
||||
).symbol
|
||||
}
|
||||
is FirValueParameter -> {
|
||||
|
||||
@@ -5,14 +5,12 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.backend
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
class Fir2IrLocalStorage {
|
||||
|
||||
@@ -49,6 +47,10 @@ class Fir2IrLocalStorage {
|
||||
return localClassCache[localClass]
|
||||
}
|
||||
|
||||
fun getLocalClass(classId: ClassId): IrClass? {
|
||||
return localClassCache.entries.find { (firClass, _) -> firClass.classId == classId }?.value
|
||||
}
|
||||
|
||||
fun getLocalFunction(localFunction: FirFunction<*>): IrSimpleFunction? {
|
||||
for (cache in cacheStack.asReversed()) {
|
||||
val local = cache.getLocalFunction(localFunction)
|
||||
|
||||
-1
@@ -1,5 +1,4 @@
|
||||
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FILE: anonymousObjectInPropertyInitializer.kt
|
||||
import c.C
|
||||
|
||||
|
||||
Reference in New Issue
Block a user