[IR] Reorder parameters in IrFactory#createClass

This is to prepare for IrFactory auto-generation (KT-59308).
This commit is contained in:
Sergej Jaskiewicz
2023-06-13 19:10:05 +02:00
committed by Space Team
parent bfb314adcb
commit f46761a241
13 changed files with 161 additions and 75 deletions
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.containingClassForLocalAttr import org.jetbrains.kotlin.fir.containingClassForLocalAttr
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression
@@ -352,18 +351,18 @@ class Fir2IrClassifierStorage(
val irClass = regularClass.convertWithOffsets { startOffset, endOffset -> val irClass = regularClass.convertWithOffsets { startOffset, endOffset ->
declareIrClass(signature) { symbol -> declareIrClass(signature) { symbol ->
irFactory.createClass( irFactory.createClass(
startOffset, startOffset = startOffset,
endOffset, endOffset = endOffset,
regularClass.computeIrOrigin(predefinedOrigin), origin = regularClass.computeIrOrigin(predefinedOrigin),
symbol, name = regularClass.name,
regularClass.name, visibility = components.visibilityConverter.convertToDescriptorVisibility(visibility),
regularClass.classKind, symbol = symbol,
components.visibilityConverter.convertToDescriptorVisibility(visibility), kind = regularClass.classKind,
modality, modality = modality,
isExternal = regularClass.isExternal,
isCompanion = regularClass.isCompanion, isCompanion = regularClass.isCompanion,
isInner = regularClass.isInner, isInner = regularClass.isInner,
isData = regularClass.isData, isData = regularClass.isData,
isExternal = regularClass.isExternal,
isValue = regularClass.isInline, isValue = regularClass.isInline,
isExpect = regularClass.isExpect, isExpect = regularClass.isExpect,
isFun = regularClass.isFun isFun = regularClass.isFun
@@ -391,10 +390,15 @@ class Fir2IrClassifierStorage(
val modality = Modality.FINAL val modality = Modality.FINAL
val irAnonymousObject = anonymousObject.convertWithOffsets { startOffset, endOffset -> val irAnonymousObject = anonymousObject.convertWithOffsets { startOffset, endOffset ->
irFactory.createClass( irFactory.createClass(
startOffset, endOffset, origin, IrClassSymbolImpl(), name, startOffset = startOffset,
endOffset = endOffset,
origin = origin,
name = name,
visibility = components.visibilityConverter.convertToDescriptorVisibility(visibility),
symbol = IrClassSymbolImpl(),
// NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects // NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects
anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS, kind = anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS,
components.visibilityConverter.convertToDescriptorVisibility(visibility), modality modality = modality,
).apply { ).apply {
metadata = FirMetadataSource.Class(anonymousObject) metadata = FirMetadataSource.Class(anonymousObject)
} }
@@ -634,8 +638,14 @@ class Fir2IrClassifierStorage(
return symbolTable.referenceClass(signature, { Fir2IrClassSymbol(signature) }) { return symbolTable.referenceClass(signature, { Fir2IrClassSymbol(signature) }) {
irFactory.createClass( irFactory.createClass(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, it, classId.shortClassName, startOffset = UNDEFINED_OFFSET,
ClassKind.CLASS, DescriptorVisibilities.DEFAULT_VISIBILITY, Modality.FINAL, endOffset = UNDEFINED_OFFSET,
origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB,
name = classId.shortClassName,
visibility = DescriptorVisibilities.DEFAULT_VISIBILITY,
symbol = it,
kind = ClassKind.CLASS,
modality = Modality.FINAL,
).apply { ).apply {
parent = irParent parent = irParent
} }
@@ -710,8 +710,21 @@ class IrBuiltInsOverFir(
origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
build() build()
irFactory.createClass( irFactory.createClass(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, startOffset = startOffset,
isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun endOffset = endOffset,
origin = origin,
name = name,
visibility = visibility,
symbol = symbol,
kind = kind,
modality = modality,
isExternal = isExternal,
isCompanion = isCompanion,
isInner = isInner,
isData = isData,
isValue = isValue,
isExpect = isExpect,
isFun = isFun,
) )
}.also { }.also {
it.parent = parent it.parent = parent
@@ -776,8 +789,21 @@ class IrBuiltInsOverFir(
origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
builderBlock() builderBlock()
irFactory.createClass( irFactory.createClass(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, startOffset = startOffset,
isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun endOffset = endOffset,
origin = origin,
name = name,
visibility = visibility,
symbol = symbol,
kind = kind,
modality = modality,
isExternal = isExternal,
isCompanion = isCompanion,
isInner = isInner,
isData = isData,
isValue = isValue,
isExpect = isExpect,
isFun = isFun,
) )
}.also { }.also {
it.parent = this it.parent = this
@@ -19,10 +19,6 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
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.interpreter.state.Complex
import org.jetbrains.kotlin.ir.interpreter.state.ExceptionState
import org.jetbrains.kotlin.ir.interpreter.state.Primitive
import org.jetbrains.kotlin.ir.interpreter.state.State
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
@@ -108,8 +104,14 @@ internal fun createTempFunction(
internal fun createTempClass(name: Name, origin: IrDeclarationOrigin = TEMP_CLASS_FOR_INTERPRETER): IrClass { internal fun createTempClass(name: Name, origin: IrDeclarationOrigin = TEMP_CLASS_FOR_INTERPRETER): IrClass {
return IrFactoryImpl.createClass( return IrFactoryImpl.createClass(
SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, origin, IrClassSymbolImpl(), name, startOffset = SYNTHETIC_OFFSET,
ClassKind.CLASS, DescriptorVisibilities.PRIVATE, Modality.FINAL endOffset = SYNTHETIC_OFFSET,
origin = origin,
name = name,
visibility = DescriptorVisibilities.PRIVATE,
symbol = IrClassSymbolImpl(),
kind = ClassKind.CLASS,
modality = Modality.FINAL,
) )
} }
@@ -433,7 +433,14 @@ class IrDescriptorBasedFunctionFactory(
val name = functionClassName(isK, isSuspend, n) val name = functionClassName(isK, isSuspend, n)
if (symbol.isBound) return symbol.owner if (symbol.isBound) return symbol.owner
val klass = irFactory.createClass( val klass = irFactory.createClass(
offset, offset, classOrigin, symbol, Name.identifier(name), ClassKind.INTERFACE, DescriptorVisibilities.PUBLIC, Modality.ABSTRACT startOffset = offset,
endOffset = offset,
origin = classOrigin,
name = Name.identifier(name),
visibility = DescriptorVisibilities.PUBLIC,
symbol = symbol,
kind = ClassKind.INTERFACE,
modality = Modality.ABSTRACT,
) )
val r = klass.createTypeParameters(n, descriptorFactory) val r = klass.createTypeParameters(n, descriptorFactory)
@@ -27,10 +27,21 @@ import org.jetbrains.kotlin.types.Variance
@PublishedApi @PublishedApi
internal fun IrFactory.buildClass(builder: IrClassBuilder): IrClass = with(builder) { internal fun IrFactory.buildClass(builder: IrClassBuilder): IrClass = with(builder) {
createClass( createClass(
startOffset, endOffset, origin, startOffset = startOffset,
IrClassSymbolImpl(), endOffset = endOffset,
name, kind, visibility, modality, origin = origin,
isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun name = name,
visibility = visibility,
symbol = IrClassSymbolImpl(),
kind = kind,
modality = modality,
isExternal = isExternal,
isCompanion = isCompanion,
isInner = isInner,
isData = isData,
isValue = isValue,
isExpect = isExpect,
isFun = isFun,
) )
} }
@@ -31,15 +31,15 @@ interface IrFactory {
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrClassSymbol,
name: Name, name: Name,
kind: ClassKind,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrClassSymbol,
kind: ClassKind,
modality: Modality, modality: Modality,
isExternal: Boolean = false,
isCompanion: Boolean = false, isCompanion: Boolean = false,
isInner: Boolean = false, isInner: Boolean = false,
isData: Boolean = false, isData: Boolean = false,
isExternal: Boolean = false,
isValue: Boolean = false, isValue: Boolean = false,
isExpect: Boolean = false, isExpect: Boolean = false,
isFun: Boolean = false, isFun: Boolean = false,
@@ -38,15 +38,15 @@ abstract class AbstractIrFactoryImpl : IrFactory {
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrClassSymbol,
name: Name, name: Name,
kind: ClassKind,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrClassSymbol,
kind: ClassKind,
modality: Modality, modality: Modality,
isExternal: Boolean,
isCompanion: Boolean, isCompanion: Boolean,
isInner: Boolean, isInner: Boolean,
isData: Boolean, isData: Boolean,
isExternal: Boolean,
isValue: Boolean, isValue: Boolean,
isExpect: Boolean, isExpect: Boolean,
isFun: Boolean, isFun: Boolean,
@@ -50,15 +50,15 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrClassSymbol,
name: Name, name: Name,
kind: ClassKind,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrClassSymbol,
kind: ClassKind,
modality: Modality, modality: Modality,
isExternal: Boolean,
isCompanion: Boolean, isCompanion: Boolean,
isInner: Boolean, isInner: Boolean,
isData: Boolean, isData: Boolean,
isExternal: Boolean,
isValue: Boolean, isValue: Boolean,
isExpect: Boolean, isExpect: Boolean,
isFun: Boolean, isFun: Boolean,
@@ -68,15 +68,15 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
startOffset, startOffset,
endOffset, endOffset,
origin, origin,
symbol,
name, name,
kind,
visibility, visibility,
symbol,
kind,
modality, modality,
isExternal,
isCompanion, isCompanion,
isInner, isInner,
isData, isData,
isExternal,
isValue, isValue,
isExpect, isExpect,
isFun, isFun,
@@ -24,15 +24,15 @@ class LazyIrFactory(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrClassSymbol,
name: Name, name: Name,
kind: ClassKind,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
symbol: IrClassSymbol,
kind: ClassKind,
modality: Modality, modality: Modality,
isExternal: Boolean,
isCompanion: Boolean, isCompanion: Boolean,
isInner: Boolean, isInner: Boolean,
isData: Boolean, isData: Boolean,
isExternal: Boolean,
isValue: Boolean, isValue: Boolean,
isExpect: Boolean, isExpect: Boolean,
isFun: Boolean, isFun: Boolean,
@@ -41,8 +41,22 @@ class LazyIrFactory(
symbol.owner symbol.owner
else else
delegate.createClass( delegate.createClass(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, startOffset,
isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun, source endOffset,
origin,
name,
visibility,
symbol,
kind,
modality,
isExternal,
isCompanion,
isInner,
isData,
isValue,
isExpect,
isFun,
source,
) )
override fun createConstructor( override fun createConstructor(
@@ -141,20 +141,21 @@ open class DeepCopyIrTreeWithSymbols(
override fun visitClass(declaration: IrClass): IrClass = override fun visitClass(declaration: IrClass): IrClass =
declaration.factory.createClass( declaration.factory.createClass(
declaration.startOffset, declaration.endOffset, startOffset = declaration.startOffset,
mapDeclarationOrigin(declaration.origin), endOffset = declaration.endOffset,
symbolRemapper.getDeclaredClass(declaration.symbol), origin = mapDeclarationOrigin(declaration.origin),
symbolRenamer.getClassName(declaration.symbol), name = symbolRenamer.getClassName(declaration.symbol),
declaration.kind, visibility = declaration.visibility,
declaration.visibility, symbol = symbolRemapper.getDeclaredClass(declaration.symbol),
declaration.modality, kind = declaration.kind,
modality = declaration.modality,
isExternal = declaration.isExternal,
isCompanion = declaration.isCompanion, isCompanion = declaration.isCompanion,
isInner = declaration.isInner, isInner = declaration.isInner,
isData = declaration.isData, isData = declaration.isData,
isExternal = declaration.isExternal,
isValue = declaration.isValue, isValue = declaration.isValue,
isExpect = declaration.isExpect, isExpect = declaration.isExpect,
isFun = declaration.isFun isFun = declaration.isFun,
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
copyTypeParametersFrom(declaration) copyTypeParametersFrom(declaration)
@@ -37,7 +37,20 @@ fun IrFactory.createIrClassFromDescriptor(
visibility: DescriptorVisibility = descriptor.visibility, visibility: DescriptorVisibility = descriptor.visibility,
modality: Modality = descriptor.modality modality: Modality = descriptor.modality
): IrClass = createClass( ): IrClass = createClass(
startOffset, endOffset, origin, symbol, name, descriptor.kind, visibility, modality, startOffset = startOffset,
descriptor.isCompanionObject, descriptor.isInner, descriptor.isData, descriptor.isEffectivelyExternal(), endOffset = endOffset,
descriptor.isValueClass(), descriptor.isExpect, descriptor.isFun, descriptor.source origin = origin,
name = name,
visibility = visibility,
symbol = symbol,
kind = descriptor.kind,
modality = modality,
isExternal = descriptor.isEffectivelyExternal(),
isCompanion = descriptor.isCompanionObject,
isInner = descriptor.isInner,
isData = descriptor.isData,
isValue = descriptor.isValueClass(),
isExpect = descriptor.isExpect,
isFun = descriptor.isFun,
source = descriptor.source,
) )
@@ -69,11 +69,11 @@ internal class MissingDeclarationStubGenerator(private val builtIns: IrBuiltIns)
startOffset = UNDEFINED_OFFSET, startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET, endOffset = UNDEFINED_OFFSET,
origin = PartiallyLinkedDeclarationOrigin.MISSING_DECLARATION, origin = PartiallyLinkedDeclarationOrigin.MISSING_DECLARATION,
symbol = symbol,
name = symbol.guessName(), name = symbol.guessName(),
kind = ClassKind.CLASS,
visibility = DescriptorVisibilities.DEFAULT_VISIBILITY, visibility = DescriptorVisibilities.DEFAULT_VISIBILITY,
modality = Modality.OPEN symbol = symbol,
kind = ClassKind.CLASS,
modality = Modality.OPEN,
).apply { ).apply {
setCommonParent() setCommonParent()
createImplicitParameterDeclarationWithWrappedDescriptor() createImplicitParameterDeclarationWithWrappedDescriptor()
@@ -357,19 +357,21 @@ class IrDeclarationDeserializer(
} }
symbolTable.declareClass(signature, { symbol.checkSymbolType(CLASS_SYMBOL) }) { symbolTable.declareClass(signature, { symbol.checkSymbolType(CLASS_SYMBOL) }) {
irFactory.createClass( irFactory.createClass(
startOffset, endOffset, origin, startOffset = startOffset,
it, endOffset = endOffset,
deserializeName(proto.name), origin = origin,
flags.kind, name = deserializeName(proto.name),
flags.visibility, visibility = flags.visibility,
effectiveModality, symbol = it,
flags.isCompanion, kind = flags.kind,
flags.isInner, modality = effectiveModality,
flags.isData, isExternal = flags.isExternal || isEffectivelyExternal,
flags.isExternal || isEffectivelyExternal, isCompanion = flags.isCompanion,
flags.isValue, isInner = flags.isInner,
flags.isExpect, isData = flags.isData,
flags.isFun, isValue = flags.isValue,
isExpect = flags.isExpect,
isFun = flags.isFun,
) )
}.usingParent { }.usingParent {
typeParameters = deserializeTypeParameters(proto.typeParameterList, true) typeParameters = deserializeTypeParameters(proto.typeParameterList, true)