FIR2IR: introduce & use ClassId-based lookup for local class as IrParent

This commit is contained in:
Jinseong Jeon
2020-08-24 22:23:47 -07:00
committed by Mikhail Glukhikh
parent 777b16e0a3
commit 99286a6ce3
4 changed files with 28 additions and 15 deletions
@@ -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 } -> {
@@ -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,5 +1,4 @@
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
// IGNORE_BACKEND_FIR: JVM_IR
// FILE: anonymousObjectInPropertyInitializer.kt
import c.C