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.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 } -> {
@@ -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,5 +1,4 @@
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField // !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
// IGNORE_BACKEND_FIR: JVM_IR
// FILE: anonymousObjectInPropertyInitializer.kt // FILE: anonymousObjectInPropertyInitializer.kt
import c.C import c.C