From bf5ab4934232274f0f34cd98f3400599a14647ce Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 10 Jun 2022 23:20:49 +0200 Subject: [PATCH] IR tree gen: restore strict cast in IrProperty.transformChildren --- .../org/jetbrains/kotlin/ir/declarations/IrProperty.kt | 4 ++-- .../src/org/jetbrains/kotlin/ir/generator/IrTree.kt | 8 ++++++-- .../jetbrains/kotlin/ir/generator/config/ConfigModel.kt | 1 + .../src/org/jetbrains/kotlin/ir/generator/model/Model.kt | 7 +++++-- .../kotlin/ir/generator/model/Transformations.kt | 2 ++ .../org/jetbrains/kotlin/ir/generator/print/Elements.kt | 9 +++++++-- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/declarations/IrProperty.kt b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/declarations/IrProperty.kt index 542e9058936..c7397ea523d 100644 --- a/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/declarations/IrProperty.kt +++ b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/declarations/IrProperty.kt @@ -55,7 +55,7 @@ abstract class IrProperty : IrDeclarationBase(), IrPossiblyExternalDeclaration, override fun transformChildren(transformer: IrElementTransformer, data: D) { backingField = backingField?.transform(transformer, data) as? IrField - getter = getter?.transform(transformer, data) as? IrSimpleFunction - setter = setter?.transform(transformer, data) as? IrSimpleFunction + getter = getter?.transform(transformer, data) as IrSimpleFunction? + setter = setter?.transform(transformer, data) as IrSimpleFunction? } } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt index bc95a4d73b4..d414de8d1bf 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt @@ -380,8 +380,12 @@ object IrTree : AbstractTreeBuilder() { +field("isExpect", boolean) +field("isFakeOverride", boolean) +field("backingField", field, mutable = true, nullable = true, isChild = true) - +field("getter", simpleFunction, mutable = true, nullable = true, isChild = true) - +field("setter", simpleFunction, mutable = true, nullable = true, isChild = true) + +field("getter", simpleFunction, mutable = true, nullable = true, isChild = true) { + strictCastInTransformChildren = true + } + +field("setter", simpleFunction, mutable = true, nullable = true, isChild = true) { + strictCastInTransformChildren = true + } } //TODO: make IrScript as IrPackageFragment, because script is used as a file, not as a class diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt index bdde5eab644..defc12511aa 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt @@ -87,6 +87,7 @@ sealed class FieldConfig( var baseDefaultValue: CodeBlock? = null var baseGetter: CodeBlock? = null var printProperty = true + var strictCastInTransformChildren = false var generationCallback: (PropertySpec.Builder.() -> Unit)? = null diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt index 08b6bfca72e..71acdf64a8f 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt @@ -74,6 +74,7 @@ sealed class Field( val nullable: Boolean, val mutable: Boolean, val isChild: Boolean, + val strictCastInTransformChildren: Boolean, ) { abstract val type: TypeRef abstract val baseDefaultValue: CodeBlock? @@ -95,9 +96,10 @@ class SingleField( nullable: Boolean, mutable: Boolean, isChild: Boolean, + strictCastInTransformChildren: Boolean, override val baseDefaultValue: CodeBlock?, override val baseGetter: CodeBlock?, -) : Field(config, name, nullable, mutable, isChild) { +) : Field(config, name, nullable, mutable, isChild, strictCastInTransformChildren) { override val transformable: Boolean get() = mutable } @@ -110,10 +112,11 @@ class ListField( nullable: Boolean, mutable: Boolean, isChild: Boolean, + strictCastInTransformChildren: Boolean, override val transformable: Boolean, override val baseDefaultValue: CodeBlock?, override val baseGetter: CodeBlock?, -) : Field(config, name, nullable, mutable, isChild) { +) : Field(config, name, nullable, mutable, isChild, strictCastInTransformChildren) { override val type: TypeRef get() = listType.withArgs(elementType) } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt index 69e395f35e5..93970d8b16c 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt @@ -28,6 +28,7 @@ fun config2model(config: Config): Model { fc.nullable, fc.mutable, fc.isChild, + fc.strictCastInTransformChildren, fc.baseDefaultValue, fc.baseGetter ) @@ -44,6 +45,7 @@ fun config2model(config: Config): Model { fc.nullable, fc.mutability == ListFieldConfig.Mutability.Var, fc.isChild, + fc.strictCastInTransformChildren, fc.mutability != ListFieldConfig.Mutability.Immutable, fc.baseDefaultValue, fc.baseGetter diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt index b92fd38c6c3..523b509fc29 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/print/Elements.kt @@ -158,8 +158,13 @@ fun printElements(generationPath: File, model: Model) = sequence { val elRef = child.type as ElementRef if (!elRef.element.transform) { append(" as") - if (child.nullable) append("?") - append(" %T") + if (child.strictCastInTransformChildren) { + append(" %T") + if (child.nullable) append("?") + } else { + if (child.nullable) append("?") + append(" %T") + } args.add(elRef.toPoet()) } }