[FIR2IR] Introduce & use components storage

This commit is contained in:
Mikhail Glukhikh
2020-03-16 12:35:28 +03:00
parent 175145ce4e
commit 8f27129c36
7 changed files with 95 additions and 83 deletions
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.backend package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
@@ -24,14 +23,12 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.types.IrType 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.SymbolTable
import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class Fir2IrClassifierStorage( class Fir2IrClassifierStorage(
session: FirSession, private val components: Fir2IrComponents
private val irSymbolTable: SymbolTable ) : Fir2IrComponents by components {
) {
private val firProvider = session.firProvider private val firProvider = session.firProvider
private val classCache = mutableMapOf<FirRegularClass, IrClass>() private val classCache = mutableMapOf<FirRegularClass, IrClass>()
@@ -44,10 +41,6 @@ class Fir2IrClassifierStorage(
private val localStorage = Fir2IrLocalStorage() private val localStorage = Fir2IrLocalStorage()
lateinit var typeConverter: Fir2IrTypeConverter
lateinit var declarationStorage: Fir2IrDeclarationStorage
private fun FirTypeRef.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType = private fun FirTypeRef.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType =
with(typeConverter) { toIrType(typeContext) } with(typeConverter) { toIrType(typeContext) }
@@ -59,7 +52,7 @@ class Fir2IrClassifierStorage(
endOffset: Int = this.endOffset endOffset: Int = this.endOffset
): IrValueParameter { ): IrValueParameter {
val receiverDescriptor = WrappedReceiverParameterDescriptor() val receiverDescriptor = WrappedReceiverParameterDescriptor()
return irSymbolTable.declareValueParameter( return symbolTable.declareValueParameter(
startOffset, endOffset, thisOrigin, receiverDescriptor, thisType startOffset, endOffset, thisOrigin, receiverDescriptor, thisType
) { symbol -> ) { symbol ->
IrValueParameterImpl( IrValueParameterImpl(
@@ -74,7 +67,7 @@ class Fir2IrClassifierStorage(
} }
private fun IrClass.setThisReceiver() { private fun IrClass.setThisReceiver() {
irSymbolTable.enterScope(descriptor) symbolTable.enterScope(descriptor)
val typeArguments = this.typeParameters.map { val typeArguments = this.typeParameters.map {
IrSimpleTypeImpl(it.symbol, false, emptyList(), emptyList()) IrSimpleTypeImpl(it.symbol, false, emptyList(), emptyList())
} }
@@ -83,7 +76,7 @@ class Fir2IrClassifierStorage(
thisType = IrSimpleTypeImpl(symbol, false, typeArguments, emptyList()), thisType = IrSimpleTypeImpl(symbol, false, typeArguments, emptyList()),
thisOrigin = IrDeclarationOrigin.INSTANCE_RECEIVER thisOrigin = IrDeclarationOrigin.INSTANCE_RECEIVER
) )
irSymbolTable.leaveScope(descriptor) symbolTable.leaveScope(descriptor)
} }
internal fun preCacheTypeParameters(owner: FirTypeParametersOwner) { internal fun preCacheTypeParameters(owner: FirTypeParametersOwner) {
@@ -167,7 +160,7 @@ class Fir2IrClassifierStorage(
regularClass.modality ?: Modality.FINAL regularClass.modality ?: Modality.FINAL
} }
val irClass = regularClass.convertWithOffsets { startOffset, endOffset -> val irClass = regularClass.convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol -> symbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol ->
IrClassImpl( IrClassImpl(
startOffset, startOffset,
endOffset, endOffset,
@@ -210,7 +203,7 @@ class Fir2IrClassifierStorage(
val origin = IrDeclarationOrigin.DEFINED val origin = IrDeclarationOrigin.DEFINED
val modality = Modality.FINAL val modality = Modality.FINAL
val result = anonymousObject.convertWithOffsets { startOffset, endOffset -> val result = anonymousObject.convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol -> symbolTable.declareClass(startOffset, endOffset, origin, descriptor, modality, visibility) { symbol ->
IrClassImpl( IrClassImpl(
startOffset, endOffset, origin, symbol, name, startOffset, endOffset, origin, symbol, name,
// NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects // NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects
@@ -267,7 +260,7 @@ class Fir2IrClassifierStorage(
val origin = IrDeclarationOrigin.DEFINED val origin = IrDeclarationOrigin.DEFINED
val irTypeParameter = val irTypeParameter =
convertWithOffsets { startOffset, endOffset -> convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareGlobalTypeParameter(startOffset, endOffset, origin, descriptor) { symbol -> symbolTable.declareGlobalTypeParameter(startOffset, endOffset, origin, descriptor) { symbol ->
IrTypeParameterImpl( IrTypeParameterImpl(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
name, if (index < 0) 0 else index, name, if (index < 0) 0 else index,
@@ -304,7 +297,7 @@ class Fir2IrClassifierStorage(
return enumEntry.convertWithOffsets { startOffset, endOffset -> return enumEntry.convertWithOffsets { startOffset, endOffset ->
val desc = WrappedEnumEntryDescriptor() val desc = WrappedEnumEntryDescriptor()
declarationStorage.enterScope(desc) declarationStorage.enterScope(desc)
val result = irSymbolTable.declareEnumEntry(startOffset, endOffset, origin, desc) { symbol -> val result = symbolTable.declareEnumEntry(startOffset, endOffset, origin, desc) { symbol ->
IrEnumEntryImpl( IrEnumEntryImpl(
startOffset, endOffset, origin, symbol, enumEntry.name startOffset, endOffset, origin, symbol, enumEntry.name
).apply { ).apply {
@@ -334,11 +327,11 @@ class Fir2IrClassifierStorage(
fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>): IrClassSymbol { fun getIrClassSymbol(firClassSymbol: FirClassSymbol<*>): IrClassSymbol {
val firClass = firClassSymbol.fir val firClass = firClassSymbol.fir
getCachedIrClass(firClass)?.let { return irSymbolTable.referenceClass(it.descriptor) } getCachedIrClass(firClass)?.let { return symbolTable.referenceClass(it.descriptor) }
// TODO: remove all this code and change to unbound symbol creation // TODO: remove all this code and change to unbound symbol creation
val irClass = createIrClass(firClass) val irClass = createIrClass(firClass)
if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.LOCAL) { if (firClass is FirAnonymousObject || firClass is FirRegularClass && firClass.visibility == Visibilities.LOCAL) {
return irSymbolTable.referenceClass(irClass.descriptor) return symbolTable.referenceClass(irClass.descriptor)
} }
val classId = firClassSymbol.classId val classId = firClassSymbol.classId
val parentId = classId.outerClassId val parentId = classId.outerClassId
@@ -350,7 +343,7 @@ class Fir2IrClassifierStorage(
declarationStorage.addDeclarationsToExternalClass(firClass as FirRegularClass, irClass) declarationStorage.addDeclarationsToExternalClass(firClass as FirRegularClass, irClass)
} }
return irSymbolTable.referenceClass(irClass.descriptor) return symbolTable.referenceClass(irClass.descriptor)
} }
fun getIrTypeParameterSymbol( fun getIrTypeParameterSymbol(
@@ -359,6 +352,6 @@ class Fir2IrClassifierStorage(
): IrTypeParameterSymbol { ): IrTypeParameterSymbol {
// TODO: use cached type parameter here // TODO: use cached type parameter here
val irTypeParameter = getIrTypeParameter(firTypeParameterSymbol.fir, typeContext = typeContext) val irTypeParameter = getIrTypeParameter(firTypeParameterSymbol.fir, typeContext = typeContext)
return irSymbolTable.referenceTypeParameter(irTypeParameter.descriptor) return symbolTable.referenceTypeParameter(irTypeParameter.descriptor)
} }
} }
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.SymbolTable
interface Fir2IrComponents {
val session: FirSession
val symbolTable: SymbolTable
val irBuiltIns: IrBuiltIns
val classifierStorage: Fir2IrClassifierStorage
val declarationStorage: Fir2IrDeclarationStorage
val typeConverter: Fir2IrTypeConverter
}
@@ -0,0 +1,20 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.SymbolTable
class Fir2IrComponentsStorage(
override val session: FirSession,
override val symbolTable: SymbolTable,
override val irBuiltIns: IrBuiltIns
) : Fir2IrComponents {
override lateinit var classifierStorage: Fir2IrClassifierStorage
override lateinit var declarationStorage: Fir2IrDeclarationStorage
override lateinit var typeConverter: Fir2IrTypeConverter
}
@@ -21,9 +21,8 @@ import org.jetbrains.kotlin.psi2ir.PsiSourceManager
class Fir2IrConverter( class Fir2IrConverter(
private val moduleDescriptor: FirModuleDescriptor, private val moduleDescriptor: FirModuleDescriptor,
private val sourceManager: PsiSourceManager, private val sourceManager: PsiSourceManager,
private val classifierStorage: Fir2IrClassifierStorage, private val components: Fir2IrComponents
private val declarationStorage: Fir2IrDeclarationStorage ) : Fir2IrComponents by components {
) {
fun processLocalClassAndNestedClasses(regularClass: FirRegularClass, parent: IrDeclarationParent) { fun processLocalClassAndNestedClasses(regularClass: FirRegularClass, parent: IrDeclarationParent) {
val irClass = registerClassAndNestedClasses(regularClass, parent) val irClass = registerClassAndNestedClasses(regularClass, parent)
@@ -169,17 +168,17 @@ class Fir2IrConverter(
typeTranslator.constantValueGenerator = constantValueGenerator typeTranslator.constantValueGenerator = constantValueGenerator
val builtIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, signaturer, symbolTable) val builtIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, signaturer, symbolTable)
val sourceManager = PsiSourceManager() val sourceManager = PsiSourceManager()
val declarationStorage = Fir2IrDeclarationStorage(session, symbolTable, moduleDescriptor) val components = Fir2IrComponentsStorage(session, symbolTable, builtIns)
val classifierStorage = Fir2IrClassifierStorage(session, symbolTable) val declarationStorage = Fir2IrDeclarationStorage(components, moduleDescriptor)
val typeConverter = Fir2IrTypeConverter(session, classifierStorage, builtIns) val classifierStorage = Fir2IrClassifierStorage(components)
declarationStorage.typeConverter = typeConverter val typeConverter = Fir2IrTypeConverter(components)
classifierStorage.typeConverter = typeConverter components.declarationStorage = declarationStorage
declarationStorage.classifierStorage = classifierStorage components.classifierStorage = classifierStorage
classifierStorage.declarationStorage = declarationStorage components.typeConverter = typeConverter
typeConverter.initBuiltinTypes() typeConverter.initBuiltinTypes()
val irFiles = mutableListOf<IrFile>() val irFiles = mutableListOf<IrFile>()
val converter = Fir2IrConverter(moduleDescriptor, sourceManager, classifierStorage, declarationStorage) val converter = Fir2IrConverter(moduleDescriptor, sourceManager, components)
for (firFile in firFiles) { for (firFile in firFiles) {
converter.registerFileAndClasses(firFile) converter.registerFileAndClasses(firFile)
} }
@@ -190,9 +189,7 @@ class Fir2IrConverter(
converter.processFileAndClassMembers(firFile) converter.processFileAndClassMembers(firFile)
} }
val fir2irVisitor = Fir2IrVisitor( val fir2irVisitor = Fir2IrVisitor(converter, components, fakeOverrideMode)
session, symbolTable, classifierStorage, declarationStorage, converter, typeConverter, builtIns, fakeOverrideMode
)
for (firFile in firFiles) { for (firFile in firFiles) {
val irFile = firFile.accept(fir2irVisitor, null) as IrFile val irFile = firFile.accept(fir2irVisitor, null) as IrFile
val fileEntry = sourceManager.getOrCreateFileEntry(firFile.psi as KtFile) val fileEntry = sourceManager.getOrCreateFileEntry(firFile.psi as KtFile)
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
@@ -34,7 +33,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -43,10 +41,9 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
class Fir2IrDeclarationStorage( class Fir2IrDeclarationStorage(
private val session: FirSession, private val components: Fir2IrComponents,
private val irSymbolTable: SymbolTable,
private val moduleDescriptor: FirModuleDescriptor private val moduleDescriptor: FirModuleDescriptor
) { ) : Fir2IrComponents by components {
private val firSymbolProvider = session.firSymbolProvider private val firSymbolProvider = session.firSymbolProvider
private val firProvider = session.firProvider private val firProvider = session.firProvider
@@ -67,10 +64,6 @@ class Fir2IrDeclarationStorage(
private val localStorage = Fir2IrLocalStorage() private val localStorage = Fir2IrLocalStorage()
lateinit var typeConverter: Fir2IrTypeConverter
lateinit var classifierStorage: Fir2IrClassifierStorage
fun registerFile(firFile: FirFile, irFile: IrFile) { fun registerFile(firFile: FirFile, irFile: IrFile) {
fileCache[firFile] = irFile fileCache[firFile] = irFile
} }
@@ -80,7 +73,7 @@ class Fir2IrDeclarationStorage(
} }
fun enterScope(descriptor: DeclarationDescriptor) { fun enterScope(descriptor: DeclarationDescriptor) {
irSymbolTable.enterScope(descriptor) symbolTable.enterScope(descriptor)
if (descriptor is WrappedSimpleFunctionDescriptor || if (descriptor is WrappedSimpleFunctionDescriptor ||
descriptor is WrappedClassConstructorDescriptor || descriptor is WrappedClassConstructorDescriptor ||
descriptor is WrappedPropertyDescriptor || descriptor is WrappedPropertyDescriptor ||
@@ -98,7 +91,7 @@ class Fir2IrDeclarationStorage(
) { ) {
localStorage.leaveCallable() localStorage.leaveCallable()
} }
irSymbolTable.leaveScope(descriptor) symbolTable.leaveScope(descriptor)
} }
private fun FirTypeRef.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType = private fun FirTypeRef.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType =
@@ -110,7 +103,7 @@ class Fir2IrDeclarationStorage(
private fun getIrExternalPackageFragment(fqName: FqName): IrExternalPackageFragment { private fun getIrExternalPackageFragment(fqName: FqName): IrExternalPackageFragment {
return fragmentCache.getOrPut(fqName) { return fragmentCache.getOrPut(fqName) {
// TODO: module descriptor is wrong here // TODO: module descriptor is wrong here
return irSymbolTable.declareExternalPackageFragment(FirPackageFragmentDescriptor(fqName, moduleDescriptor)) return symbolTable.declareExternalPackageFragment(FirPackageFragmentDescriptor(fqName, moduleDescriptor))
} }
} }
@@ -213,7 +206,7 @@ class Fir2IrDeclarationStorage(
val parent = this val parent = this
val descriptor = WrappedValueParameterDescriptor() val descriptor = WrappedValueParameterDescriptor()
valueParameters = listOf( valueParameters = listOf(
irSymbolTable.declareValueParameter( symbolTable.declareValueParameter(
startOffset, endOffset, origin, descriptor, type startOffset, endOffset, origin, descriptor, type
) { symbol -> ) { symbol ->
IrValueParameterImpl( IrValueParameterImpl(
@@ -338,7 +331,7 @@ class Fir2IrDeclarationStorage(
val visibility = simpleFunction?.visibility ?: Visibilities.LOCAL val visibility = simpleFunction?.visibility ?: Visibilities.LOCAL
val created = function.convertWithOffsets { startOffset, endOffset -> val created = function.convertWithOffsets { startOffset, endOffset ->
enterScope(descriptor) enterScope(descriptor)
val result = irSymbolTable.declareSimpleFunction(startOffset, endOffset, origin, descriptor) { symbol -> val result = symbolTable.declareSimpleFunction(startOffset, endOffset, origin, descriptor) { symbol ->
IrFunctionImpl( IrFunctionImpl(
startOffset, endOffset, updatedOrigin, symbol, startOffset, endOffset, updatedOrigin, symbol,
name, visibility, name, visibility,
@@ -378,7 +371,7 @@ class Fir2IrDeclarationStorage(
irParent: IrClass irParent: IrClass
): IrAnonymousInitializer { ): IrAnonymousInitializer {
return anonymousInitializer.convertWithOffsets { startOffset, endOffset -> return anonymousInitializer.convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareAnonymousInitializer(startOffset, endOffset, IrDeclarationOrigin.DEFINED, irParent.descriptor).apply { symbolTable.declareAnonymousInitializer(startOffset, endOffset, IrDeclarationOrigin.DEFINED, irParent.descriptor).apply {
this.parent = irParent this.parent = irParent
initializerCache[anonymousInitializer] = this initializerCache[anonymousInitializer] = this
} }
@@ -399,7 +392,7 @@ class Fir2IrDeclarationStorage(
else -> constructor.visibility else -> constructor.visibility
} }
val created = constructor.convertWithOffsets { startOffset, endOffset -> val created = constructor.convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol -> symbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol ->
IrConstructorImpl( IrConstructorImpl(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
Name.special("<init>"), visibility, Name.special("<init>"), visibility,
@@ -433,7 +426,7 @@ class Fir2IrDeclarationStorage(
WrappedFunctionDescriptorWithContainerSource(propertyDescriptor.containerSource) WrappedFunctionDescriptorWithContainerSource(propertyDescriptor.containerSource)
else WrappedSimpleFunctionDescriptor() else WrappedSimpleFunctionDescriptor()
val prefix = if (isSetter) "set" else "get" val prefix = if (isSetter) "set" else "get"
return irSymbolTable.declareSimpleFunction( return symbolTable.declareSimpleFunction(
propertyAccessor?.psi?.startOffsetSkippingComments ?: startOffset, propertyAccessor?.psi?.startOffsetSkippingComments ?: startOffset,
propertyAccessor?.psi?.endOffset ?: endOffset, propertyAccessor?.psi?.endOffset ?: endOffset,
origin, descriptor origin, descriptor
@@ -485,7 +478,7 @@ class Fir2IrDeclarationStorage(
classifierStorage.preCacheTypeParameters(property) classifierStorage.preCacheTypeParameters(property)
return property.convertWithOffsets { startOffset, endOffset -> return property.convertWithOffsets { startOffset, endOffset ->
enterScope(descriptor) enterScope(descriptor)
val result = irSymbolTable.declareProperty( val result = symbolTable.declareProperty(
startOffset, endOffset, startOffset, endOffset,
origin, descriptor, property.delegate != null origin, descriptor, property.delegate != null
) { symbol -> ) { symbol ->
@@ -542,7 +535,7 @@ class Fir2IrDeclarationStorage(
val origin = IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB val origin = IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
val type = field.returnTypeRef.toIrType() val type = field.returnTypeRef.toIrType()
return field.convertWithOffsets { startOffset, endOffset -> return field.convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareField( symbolTable.declareField(
startOffset, endOffset, startOffset, endOffset,
origin, descriptor, type origin, descriptor, type
) { symbol -> ) { symbol ->
@@ -571,7 +564,7 @@ class Fir2IrDeclarationStorage(
val origin = IrDeclarationOrigin.DEFINED val origin = IrDeclarationOrigin.DEFINED
val type = valueParameter.returnTypeRef.toIrType() val type = valueParameter.returnTypeRef.toIrType()
val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset -> val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareValueParameter( symbolTable.declareValueParameter(
startOffset, endOffset, origin, descriptor, type startOffset, endOffset, origin, descriptor, type
) { symbol -> ) { symbol ->
IrValueParameterImpl( IrValueParameterImpl(
@@ -614,7 +607,7 @@ class Fir2IrDeclarationStorage(
isVar: Boolean, isConst: Boolean, isLateinit: Boolean isVar: Boolean, isConst: Boolean, isLateinit: Boolean
): IrVariable { ): IrVariable {
val descriptor = WrappedVariableDescriptor() val descriptor = WrappedVariableDescriptor()
return irSymbolTable.declareVariable(startOffset, endOffset, origin, descriptor, type) { symbol -> return symbolTable.declareVariable(startOffset, endOffset, origin, descriptor, type) { symbol ->
IrVariableImpl( IrVariableImpl(
startOffset, endOffset, origin, symbol, name, type, startOffset, endOffset, origin, symbol, name, type,
isVar, isConst, isLateinit isVar, isConst, isLateinit
@@ -656,25 +649,25 @@ class Fir2IrDeclarationStorage(
fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol { fun getIrConstructorSymbol(firConstructorSymbol: FirConstructorSymbol): IrConstructorSymbol {
val firConstructor = firConstructorSymbol.fir val firConstructor = firConstructorSymbol.fir
getCachedIrConstructor(firConstructor)?.let { return irSymbolTable.referenceConstructor(it.descriptor) } getCachedIrConstructor(firConstructor)?.let { return symbolTable.referenceConstructor(it.descriptor) }
val irParent = findIrParent(firConstructor) as IrClass val irParent = findIrParent(firConstructor) as IrClass
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irDeclaration = createIrConstructor(firConstructor, irParent, origin = parentOrigin).apply { val irDeclaration = createIrConstructor(firConstructor, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }
return irSymbolTable.referenceConstructor(irDeclaration.descriptor) return symbolTable.referenceConstructor(irDeclaration.descriptor)
} }
fun getIrFunctionSymbol(firFunctionSymbol: FirFunctionSymbol<*>): IrFunctionSymbol { fun getIrFunctionSymbol(firFunctionSymbol: FirFunctionSymbol<*>): IrFunctionSymbol {
return when (val firDeclaration = firFunctionSymbol.fir) { return when (val firDeclaration = firFunctionSymbol.fir) {
is FirSimpleFunction, is FirAnonymousFunction -> { is FirSimpleFunction, is FirAnonymousFunction -> {
getCachedIrFunction(firDeclaration)?.let { return irSymbolTable.referenceSimpleFunction(it.descriptor) } getCachedIrFunction(firDeclaration)?.let { return symbolTable.referenceSimpleFunction(it.descriptor) }
val irParent = findIrParent(firDeclaration) val irParent = findIrParent(firDeclaration)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irDeclaration = createIrFunction(firDeclaration, irParent, origin = parentOrigin).apply { val irDeclaration = createIrFunction(firDeclaration, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }
irSymbolTable.referenceSimpleFunction(irDeclaration.descriptor) symbolTable.referenceSimpleFunction(irDeclaration.descriptor)
} }
is FirConstructor -> { is FirConstructor -> {
getIrConstructorSymbol(firDeclaration.symbol) getIrConstructorSymbol(firDeclaration.symbol)
@@ -686,20 +679,20 @@ class Fir2IrDeclarationStorage(
fun getIrPropertyOrFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol { fun getIrPropertyOrFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol {
return when (val fir = firVariableSymbol.fir) { return when (val fir = firVariableSymbol.fir) {
is FirProperty -> { is FirProperty -> {
propertyCache[fir]?.let { return irSymbolTable.referenceProperty(it.descriptor) } propertyCache[fir]?.let { return symbolTable.referenceProperty(it.descriptor) }
val irParent = findIrParent(fir) val irParent = findIrParent(fir)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irProperty = createIrProperty(fir, irParent, origin = parentOrigin).apply { val irProperty = createIrProperty(fir, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }
irSymbolTable.referenceProperty(irProperty.descriptor) symbolTable.referenceProperty(irProperty.descriptor)
} }
is FirField -> { is FirField -> {
fieldCache[fir]?.let { return irSymbolTable.referenceField(it.descriptor) } fieldCache[fir]?.let { return symbolTable.referenceField(it.descriptor) }
val irField = createIrField(fir).apply { val irField = createIrField(fir).apply {
setAndModifyParent(findIrParent(fir)) setAndModifyParent(findIrParent(fir))
} }
irSymbolTable.referenceField(irField.descriptor) symbolTable.referenceField(irField.descriptor)
} }
else -> throw IllegalArgumentException("Unexpected fir in property symbol: ${fir.render()}") else -> throw IllegalArgumentException("Unexpected fir in property symbol: ${fir.render()}")
} }
@@ -708,13 +701,13 @@ class Fir2IrDeclarationStorage(
fun getIrBackingFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol { fun getIrBackingFieldSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol {
return when (val fir = firVariableSymbol.fir) { return when (val fir = firVariableSymbol.fir) {
is FirProperty -> { is FirProperty -> {
propertyCache[fir]?.let { return irSymbolTable.referenceField(it.backingField!!.descriptor) } propertyCache[fir]?.let { return symbolTable.referenceField(it.backingField!!.descriptor) }
val irParent = findIrParent(fir) val irParent = findIrParent(fir)
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
val irProperty = createIrProperty(fir, irParent, origin = parentOrigin).apply { val irProperty = createIrProperty(fir, irParent, origin = parentOrigin).apply {
setAndModifyParent(irParent) setAndModifyParent(irParent)
} }
irSymbolTable.referenceField(irProperty.backingField!!.descriptor) symbolTable.referenceField(irProperty.backingField!!.descriptor)
} }
else -> { else -> {
getIrVariableSymbol(fir) getIrVariableSymbol(fir)
@@ -725,13 +718,13 @@ class Fir2IrDeclarationStorage(
private fun getIrVariableSymbol(firVariable: FirVariable<*>): IrVariableSymbol { private fun getIrVariableSymbol(firVariable: FirVariable<*>): IrVariableSymbol {
val irDeclaration = localStorage.getVariable(firVariable) val irDeclaration = localStorage.getVariable(firVariable)
?: throw IllegalArgumentException("Cannot find variable ${firVariable.render()} in local storage") ?: throw IllegalArgumentException("Cannot find variable ${firVariable.render()} in local storage")
return irSymbolTable.referenceVariable(irDeclaration.descriptor) return symbolTable.referenceVariable(irDeclaration.descriptor)
} }
fun getIrValueSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol { fun getIrValueSymbol(firVariableSymbol: FirVariableSymbol<*>): IrSymbol {
return when (val firDeclaration = firVariableSymbol.fir) { return when (val firDeclaration = firVariableSymbol.fir) {
is FirEnumEntry -> { is FirEnumEntry -> {
classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return irSymbolTable.referenceEnumEntry(it.descriptor) } classifierStorage.getCachedIrEnumEntry(firDeclaration)?.let { return symbolTable.referenceEnumEntry(it.descriptor) }
val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol) val containingFile = firProvider.getFirCallableContainerFile(firVariableSymbol)
val parentClassSymbol = firVariableSymbol.callableId.classId?.let { firSymbolProvider.getClassLikeSymbolByFqName(it) } val parentClassSymbol = firVariableSymbol.callableId.classId?.let { firSymbolProvider.getClassLikeSymbolByFqName(it) }
val irParentClass = (parentClassSymbol?.fir as? FirClass<*>)?.let { classifierStorage.getCachedIrClass(it) } val irParentClass = (parentClassSymbol?.fir as? FirClass<*>)?.let { classifierStorage.getCachedIrClass(it) }
@@ -740,13 +733,13 @@ class Fir2IrDeclarationStorage(
irParent = irParentClass, irParent = irParentClass,
origin = if (containingFile == null) IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB else IrDeclarationOrigin.DEFINED origin = if (containingFile == null) IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB else IrDeclarationOrigin.DEFINED
) )
irSymbolTable.referenceEnumEntry(irEnumEntry.descriptor) symbolTable.referenceEnumEntry(irEnumEntry.descriptor)
} }
is FirValueParameter -> { is FirValueParameter -> {
val irDeclaration = localStorage.getParameter(firDeclaration) val irDeclaration = localStorage.getParameter(firDeclaration)
// catch parameter is FirValueParameter in FIR but IrVariable in IR // catch parameter is FirValueParameter in FIR but IrVariable in IR
?: return getIrVariableSymbol(firDeclaration) ?: return getIrVariableSymbol(firDeclaration)
irSymbolTable.referenceValueParameter(irDeclaration.descriptor) symbolTable.referenceValueParameter(irDeclaration.descriptor)
} }
else -> { else -> {
getIrVariableSymbol(firDeclaration) getIrVariableSymbol(firDeclaration)
@@ -5,11 +5,9 @@
package org.jetbrains.kotlin.fir.backend package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.IrTypeArgument import org.jetbrains.kotlin.ir.types.IrTypeArgument
@@ -20,10 +18,8 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
class Fir2IrTypeConverter( class Fir2IrTypeConverter(
private val session: FirSession, private val components: Fir2IrComponents
private val classifierStorage: Fir2IrClassifierStorage, ) : Fir2IrComponents by components {
private val irBuiltIns: IrBuiltIns
) {
lateinit var nothingType: IrType lateinit var nothingType: IrType
lateinit var unitType: IrType lateinit var unitType: IrType
lateinit var booleanType: IrType lateinit var booleanType: IrType
@@ -33,7 +33,6 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
@@ -45,15 +44,10 @@ import org.jetbrains.kotlin.psi.*
import java.util.* import java.util.*
class Fir2IrVisitor( class Fir2IrVisitor(
private val session: FirSession,
private val symbolTable: SymbolTable,
private val classifierStorage: Fir2IrClassifierStorage,
private val declarationStorage: Fir2IrDeclarationStorage,
private val converter: Fir2IrConverter, private val converter: Fir2IrConverter,
private val typeConverter: Fir2IrTypeConverter, private val components: Fir2IrComponents,
override val irBuiltIns: IrBuiltIns,
fakeOverrideMode: FakeOverrideMode fakeOverrideMode: FakeOverrideMode
) : FirDefaultVisitor<IrElement, Any?>(), IrGeneratorContextInterface { ) : Fir2IrComponents by components, FirDefaultVisitor<IrElement, Any?>(), IrGeneratorContextInterface {
companion object { companion object {
private val NEGATED_OPERATIONS: Set<FirOperation> = EnumSet.of(FirOperation.NOT_EQ, FirOperation.NOT_IDENTITY) private val NEGATED_OPERATIONS: Set<FirOperation> = EnumSet.of(FirOperation.NOT_EQ, FirOperation.NOT_IDENTITY)