IR: use buildField where possible

This commit is contained in:
Alexander Udalov
2020-07-08 17:14:54 +02:00
parent 2d723f1c51
commit c9fdef8233
7 changed files with 73 additions and 115 deletions
@@ -14,15 +14,13 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildClass import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildFun
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.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.types.defaultType
@@ -618,21 +616,16 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
} }
fun IrClass.addField(name: Name, type: IrType, isMutable: Boolean): IrField { fun IrClass.addField(name: Name, type: IrType, isMutable: Boolean): IrField {
val descriptor = WrappedFieldDescriptor() val klass = this
val symbol = IrFieldSymbolImpl(descriptor) return buildField {
return IrFieldImpl( this.startOffset = klass.startOffset
startOffset, this.endOffset = klass.endOffset
endOffset, this.origin = DECLARATION_ORIGIN_COROUTINE_IMPL
DECLARATION_ORIGIN_COROUTINE_IMPL, this.name = name
symbol, this.type = type
name, this.visibility = Visibilities.PRIVATE
type, this.isFinal = !isMutable
Visibilities.PRIVATE, }.also {
isFinal = !isMutable,
isExternal = false,
isStatic = false
).also {
descriptor.bind(it)
it.parent = this it.parent = this
addChild(it) addChild(it)
} }
@@ -18,17 +18,15 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter import org.jetbrains.kotlin.ir.builders.declarations.buildValueParameter
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.descriptors.WrappedFieldDescriptor
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.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.types.impl.IrTypeAbbreviationImpl import org.jetbrains.kotlin.ir.types.impl.IrTypeAbbreviationImpl
@@ -725,25 +723,20 @@ class LocalDeclarationsLowering(
parent: IrClass, parent: IrClass,
fieldType: IrType, fieldType: IrType,
isCrossinline: Boolean isCrossinline: Boolean
): IrField { ): IrField =
val descriptor = WrappedFieldDescriptor() buildField {
val symbol = IrFieldSymbolImpl(descriptor) this.startOffset = startOffset
return IrFieldImpl( this.endOffset = endOffset
startOffset, this.origin =
endOffset, if (isCrossinline) DECLARATION_ORIGIN_FIELD_FOR_CROSSINLINE_CAPTURED_VALUE
if (isCrossinline) DECLARATION_ORIGIN_FIELD_FOR_CROSSINLINE_CAPTURED_VALUE else DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE, else DECLARATION_ORIGIN_FIELD_FOR_CAPTURED_VALUE
symbol, this.name = name
name, this.type = fieldType
fieldType, this.visibility = visibility
visibility, this.isFinal = true
isFinal = true, }.also {
isExternal = false,
isStatic = false
).also {
descriptor.bind(it)
it.parent = parent it.parent = parent
} }
}
private fun createFieldsForCapturedValues(localClassContext: LocalClassContext) { private fun createFieldsForCapturedValues(localClassContext: LocalClassContext) {
val classDeclaration = localClassContext.declaration val classDeclaration = localClassContext.declaration
@@ -72,7 +72,8 @@ fun IrClass.addField(fieldName: Name, fieldType: IrType, fieldVisibility: Visibi
fun IrClass.addField(fieldName: String, fieldType: IrType, fieldVisibility: Visibility = Visibilities.PRIVATE): IrField = fun IrClass.addField(fieldName: String, fieldType: IrType, fieldVisibility: Visibility = Visibilities.PRIVATE): IrField =
addField(Name.identifier(fieldName), fieldType, fieldVisibility) addField(Name.identifier(fieldName), fieldType, fieldVisibility)
fun IrPropertyBuilder.buildProperty(originalDescriptor: PropertyDescriptor? = null): IrProperty { @PublishedApi
internal fun IrPropertyBuilder.buildProperty(originalDescriptor: PropertyDescriptor? = null): IrProperty {
val wrappedDescriptor = when (originalDescriptor) { val wrappedDescriptor = when (originalDescriptor) {
is DescriptorWithContainerSource -> WrappedPropertyDescriptorWithContainerSource(originalDescriptor.containerSource) is DescriptorWithContainerSource -> WrappedPropertyDescriptorWithContainerSource(originalDescriptor.containerSource)
else -> WrappedPropertyDescriptor() else -> WrappedPropertyDescriptor()
@@ -81,8 +82,7 @@ fun IrPropertyBuilder.buildProperty(originalDescriptor: PropertyDescriptor? = nu
startOffset, endOffset, origin, startOffset, endOffset, origin,
IrPropertySymbolImpl(wrappedDescriptor), IrPropertySymbolImpl(wrappedDescriptor),
name, visibility, modality, name, visibility, modality,
isVar = isVar, isConst = isConst, isLateinit = isLateinit, isDelegated = isDelegated, isExpect = isExpect, isExternal = isExternal, isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride
isFakeOverride = isFakeOverride
).also { ).also {
wrappedDescriptor.bind(it) wrappedDescriptor.bind(it)
} }
@@ -13,15 +13,12 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsMapping import org.jetbrains.kotlin.ir.backend.js.JsMapping
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.utils.Namer import org.jetbrains.kotlin.ir.backend.js.utils.Namer
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField
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.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.dump
@@ -51,27 +48,20 @@ class JsDeclarationFactory(mapping: JsMapping) : DeclarationFactory {
} }
} }
private fun createPropertyWithBackingField(name: Name, visibility: Visibility, parent: IrClass, fieldType: IrType, origin: IrDeclarationOrigin): IrField { private fun createPropertyWithBackingField(
val descriptor = WrappedFieldDescriptor() name: Name, visibility: Visibility, parent: IrClass, fieldType: IrType, origin: IrDeclarationOrigin
val symbol = IrFieldSymbolImpl(descriptor) ): IrField =
buildField {
return IrFieldImpl( this.origin = origin
UNDEFINED_OFFSET, this.name = name
UNDEFINED_OFFSET, this.type = fieldType
origin, this.visibility = visibility
symbol, this.isFinal = true
name, this.isExternal = false
fieldType, this.isStatic = false
visibility, }.also {
isFinal = true,
isExternal = false,
isStatic = false
).also {
descriptor.bind(it)
it.parent = parent it.parent = parent
} }
}
override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: IrConstructor): IrConstructor { override fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: IrConstructor): IrConstructor {
val innerClass = innerClassConstructor.parent as IrClass val innerClass = innerClassConstructor.parent as IrClass
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.backend.common.lower.irBlockBody
import org.jetbrains.kotlin.backend.common.lower.irIfThen import org.jetbrains.kotlin.backend.common.lower.irIfThen
import org.jetbrains.kotlin.backend.common.lower.parents import org.jetbrains.kotlin.backend.common.lower.parents
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
@@ -25,14 +24,11 @@ import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildField
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.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.types.makeNullable
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
@@ -64,24 +60,24 @@ class EnumUsageLowering(val context: JsIrBackendContext) : BodyLoweringPass {
return JsIrBuilder.buildCall(intrinsic, context.irBuiltIns.anyType, listOf(irClass.defaultType)) return JsIrBuilder.buildCall(intrinsic, context.irBuiltIns.anyType, listOf(irClass.defaultType))
} }
private fun createFieldForEntry(entry: IrEnumEntry, irClass: IrClass): IrField { private fun createFieldForEntry(entry: IrEnumEntry, irClass: IrClass): IrField =
val descriptor = WrappedFieldDescriptor() buildField {
val symbol = IrFieldSymbolImpl(descriptor) startOffset = entry.startOffset
return entry.run { endOffset = entry.endOffset
IrFieldImpl( origin = entry.origin
startOffset, endOffset, origin, symbol, name, irClass.defaultType, Visibilities.PUBLIC, name = entry.name
isFinal = false, isExternal = true, isStatic = true type = irClass.defaultType
).also { isFinal = false
descriptor.bind(it) isExternal = true
it.parent = irClass isStatic = true
}.also {
it.parent = irClass
// TODO need a way to emerge local declarations from BodyLoweringPass // TODO need a way to emerge local declarations from BodyLoweringPass
stageController.unrestrictDeclarationListsAccess { stageController.unrestrictDeclarationListsAccess {
irClass.declarations += it irClass.declarations += it
}
} }
} }
}
private fun lowerEnumEntry(enumEntry: IrEnumEntry, klass: IrClass) = private fun lowerEnumEntry(enumEntry: IrEnumEntry, klass: IrClass) =
enumEntry.getInstanceFun!!.run { JsIrBuilder.buildCall(symbol) } enumEntry.getInstanceFun!!.run { JsIrBuilder.buildCall(symbol) }
@@ -15,15 +15,13 @@ import org.jetbrains.kotlin.ir.backend.js.lower.CallableReferenceLowering
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.builders.declarations.buildClass import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.builders.declarations.buildFun
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.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.types.defaultType
@@ -516,23 +514,18 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
} }
fun IrClass.addField(name: Name, type: IrType, isMutable: Boolean): IrField { fun IrClass.addField(name: Name, type: IrType, isMutable: Boolean): IrField {
val descriptor = WrappedFieldDescriptor() val klass = this
val symbol = IrFieldSymbolImpl(descriptor) return buildField {
return IrFieldImpl( this.startOffset = klass.startOffset
startOffset, this.endOffset = klass.endOffset
endOffset, this.origin = DECLARATION_ORIGIN_COROUTINE_IMPL
DECLARATION_ORIGIN_COROUTINE_IMPL, this.name = name
symbol, this.type = type
name, this.visibility = Visibilities.PRIVATE
type, this.isFinal = !isMutable
Visibilities.PRIVATE, }.also {
isFinal = !isMutable,
isExternal = false,
isStatic = false
).also {
descriptor.bind(it)
it.parent = this it.parent = this
addChild(it) addChild(it)
} }
} }
} }
@@ -10,19 +10,17 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.declarations.buildField
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedFieldDescriptor
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrGetField import org.jetbrains.kotlin.ir.expressions.IrGetField
import org.jetbrains.kotlin.ir.expressions.IrSetField import org.jetbrains.kotlin.ir.expressions.IrSetField
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.util.hasAnnotation import org.jetbrains.kotlin.ir.util.hasAnnotation
import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.patchDeclarationParents
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -105,21 +103,16 @@ private class FieldRenamer(private val newNames: Map<IrField, Name>) : IrElement
override fun visitField(declaration: IrField): IrStatement { override fun visitField(declaration: IrField): IrStatement {
val newName = newNames[declaration] ?: return super.visitField(declaration) val newName = newNames[declaration] ?: return super.visitField(declaration)
return buildField {
val descriptor = WrappedFieldDescriptor() updateFrom(declaration)
val symbol = IrFieldSymbolImpl(descriptor) name = newName
return IrFieldImpl( }.also {
declaration.startOffset, declaration.endOffset, declaration.origin, symbol, newName,
declaration.type, declaration.visibility, declaration.isFinal, declaration.isExternal, declaration.isStatic,
).also {
descriptor.bind(it)
it.parent = declaration.parent it.parent = declaration.parent
it.initializer = declaration.initializer it.initializer = declaration.initializer
?.transform(this, null) ?.transform(this, null)
?.patchDeclarationParents(it) ?.patchDeclarationParents(it)
it.metadata = declaration.metadata
newSymbols[declaration] = symbol newSymbols[declaration] = it.symbol
} }
} }
} }