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.types.impl.IrSimpleTypeImpl
|
||||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
import org.jetbrains.kotlin.ir.util.constructors
|
import org.jetbrains.kotlin.ir.util.constructors
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
class Fir2IrClassifierStorage(
|
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 {
|
private fun FirRegularClass.enumClassModality(): Modality {
|
||||||
return when {
|
return when {
|
||||||
declarations.any { it is FirCallableMemberDeclaration<*> && it.modality == Modality.ABSTRACT } -> {
|
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? {
|
private fun findIrClass(classId: ClassId): IrClass? =
|
||||||
return if (parentClassId != null) {
|
if (classId.isLocal) {
|
||||||
// TODO: this will never work for local classes
|
classifierStorage.getCachedLocalClass(classId)
|
||||||
val parentFirSymbol = firSymbolProvider.getClassLikeSymbolByFqName(parentClassId)
|
} else {
|
||||||
if (parentFirSymbol is FirClassSymbol) {
|
val firSymbol = firSymbolProvider.getClassLikeSymbolByFqName(classId)
|
||||||
val parentIrSymbol = classifierStorage.getIrClassSymbol(parentFirSymbol)
|
if (firSymbol is FirClassSymbol) {
|
||||||
parentIrSymbol.owner
|
classifierStorage.getIrClassSymbol(firSymbol).owner
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun findIrParent(packageFqName: FqName, parentClassId: ClassId?, firBasedSymbol: FirBasedSymbol<*>): IrDeclarationParent? {
|
||||||
|
return if (parentClassId != null) {
|
||||||
|
findIrClass(parentClassId)
|
||||||
} else {
|
} else {
|
||||||
val containerFile = when (firBasedSymbol) {
|
val containerFile = when (firBasedSymbol) {
|
||||||
is FirCallableSymbol -> firProvider.getFirCallableContainerFile(firBasedSymbol)
|
is FirCallableSymbol -> firProvider.getFirCallableContainerFile(firBasedSymbol)
|
||||||
@@ -1039,13 +1044,12 @@ class Fir2IrDeclarationStorage(
|
|||||||
is FirEnumEntry -> {
|
is FirEnumEntry -> {
|
||||||
classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol }
|
classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return it.symbol }
|
||||||
val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol)
|
val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol)
|
||||||
val parentClassSymbol = firVariableSymbol.callableId.classId?.let { firSymbolProvider.getClassLikeSymbolByFqName(it) }
|
val irParentClass = firVariableSymbol.callableId.classId?.let { findIrClass(it) }
|
||||||
val irParentClass = (parentClassSymbol?.fir as? FirClass<*>)?.let { classifierStorage.getCachedIrClass(it) }
|
|
||||||
classifierStorage.createIrEnumEntry(
|
classifierStorage.createIrEnumEntry(
|
||||||
firDeclaration,
|
firDeclaration,
|
||||||
irParent = irParentClass,
|
irParent = irParentClass,
|
||||||
origin = if (containingFile != null) IrDeclarationOrigin.DEFINED else
|
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
|
).symbol
|
||||||
}
|
}
|
||||||
is FirValueParameter -> {
|
is FirValueParameter -> {
|
||||||
|
|||||||
@@ -5,14 +5,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.backend
|
package org.jetbrains.kotlin.fir.backend
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
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.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|
||||||
class Fir2IrLocalStorage {
|
class Fir2IrLocalStorage {
|
||||||
|
|
||||||
@@ -49,6 +47,10 @@ class Fir2IrLocalStorage {
|
|||||||
return localClassCache[localClass]
|
return localClassCache[localClass]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getLocalClass(classId: ClassId): IrClass? {
|
||||||
|
return localClassCache.entries.find { (firClass, _) -> firClass.classId == classId }?.value
|
||||||
|
}
|
||||||
|
|
||||||
fun getLocalFunction(localFunction: FirFunction<*>): IrSimpleFunction? {
|
fun getLocalFunction(localFunction: FirFunction<*>): IrSimpleFunction? {
|
||||||
for (cache in cacheStack.asReversed()) {
|
for (cache in cacheStack.asReversed()) {
|
||||||
val local = cache.getLocalFunction(localFunction)
|
val local = cache.getLocalFunction(localFunction)
|
||||||
|
|||||||
-1
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// FILE: anonymousObjectInPropertyInitializer.kt
|
// FILE: anonymousObjectInPropertyInitializer.kt
|
||||||
import c.C
|
import c.C
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user