IR: make casts to nullable types in transformChildren stricter

This commit is contained in:
Alexander Udalov
2022-06-14 00:59:31 +02:00
committed by Space
parent 12ce433bc2
commit a30a351fbb
7 changed files with 9 additions and 24 deletions
@@ -39,6 +39,6 @@ abstract class IrEnumEntry : IrDeclarationBase(), IrDeclarationWithName {
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) { override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
initializerExpression = initializerExpression?.transform(transformer, data) initializerExpression = initializerExpression?.transform(transformer, data)
correspondingClass = correspondingClass?.transform(transformer, data) as? IrClass correspondingClass = correspondingClass?.transform(transformer, data) as IrClass?
} }
} }
@@ -48,6 +48,6 @@ abstract class IrLocalDelegatedProperty : IrDeclarationBase(), IrDeclarationWith
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) { override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
delegate = delegate.transform(transformer, data) as IrVariable delegate = delegate.transform(transformer, data) as IrVariable
getter = getter.transform(transformer, data) as IrSimpleFunction getter = getter.transform(transformer, data) as IrSimpleFunction
setter = setter?.transform(transformer, data) as? IrSimpleFunction setter = setter?.transform(transformer, data) as IrSimpleFunction?
} }
} }
@@ -54,7 +54,7 @@ abstract class IrProperty : IrDeclarationBase(), IrPossiblyExternalDeclaration,
} }
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) { override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
backingField = backingField?.transform(transformer, data) as? IrField backingField = backingField?.transform(transformer, data) as IrField?
getter = getter?.transform(transformer, data) as IrSimpleFunction? getter = getter?.transform(transformer, data) as IrSimpleFunction?
setter = setter?.transform(transformer, data) as IrSimpleFunction? setter = setter?.transform(transformer, data) as IrSimpleFunction?
} }
@@ -380,12 +380,8 @@ object IrTree : AbstractTreeBuilder() {
+field("isExpect", boolean) +field("isExpect", boolean)
+field("isFakeOverride", boolean) +field("isFakeOverride", boolean)
+field("backingField", field, mutable = true, nullable = true, isChild = true) +field("backingField", field, mutable = true, nullable = true, isChild = true)
+field("getter", 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)
}
+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 //TODO: make IrScript as IrPackageFragment, because script is used as a file, not as a class
@@ -75,7 +75,6 @@ sealed class Field(
val nullable: Boolean, val nullable: Boolean,
val mutable: Boolean, val mutable: Boolean,
val isChild: Boolean, val isChild: Boolean,
val strictCastInTransformChildren: Boolean,
) { ) {
abstract val type: TypeRef abstract val type: TypeRef
abstract val baseDefaultValue: CodeBlock? abstract val baseDefaultValue: CodeBlock?
@@ -97,10 +96,9 @@ class SingleField(
nullable: Boolean, nullable: Boolean,
mutable: Boolean, mutable: Boolean,
isChild: Boolean, isChild: Boolean,
strictCastInTransformChildren: Boolean,
override val baseDefaultValue: CodeBlock?, override val baseDefaultValue: CodeBlock?,
override val baseGetter: CodeBlock?, override val baseGetter: CodeBlock?,
) : Field(config, name, nullable, mutable, isChild, strictCastInTransformChildren) { ) : Field(config, name, nullable, mutable, isChild) {
override val transformable: Boolean override val transformable: Boolean
get() = mutable get() = mutable
} }
@@ -113,11 +111,10 @@ class ListField(
nullable: Boolean, nullable: Boolean,
mutable: Boolean, mutable: Boolean,
isChild: Boolean, isChild: Boolean,
strictCastInTransformChildren: Boolean,
override val transformable: Boolean, override val transformable: Boolean,
override val baseDefaultValue: CodeBlock?, override val baseDefaultValue: CodeBlock?,
override val baseGetter: CodeBlock?, override val baseGetter: CodeBlock?,
) : Field(config, name, nullable, mutable, isChild, strictCastInTransformChildren) { ) : Field(config, name, nullable, mutable, isChild) {
override val type: TypeRef override val type: TypeRef
get() = listType.withArgs(elementType) get() = listType.withArgs(elementType)
} }
@@ -28,7 +28,6 @@ fun config2model(config: Config): Model {
fc.nullable, fc.nullable,
fc.mutable, fc.mutable,
fc.isChild, fc.isChild,
fc.strictCastInTransformChildren,
fc.baseDefaultValue, fc.baseDefaultValue,
fc.baseGetter fc.baseGetter
) )
@@ -45,7 +44,6 @@ fun config2model(config: Config): Model {
fc.nullable, fc.nullable,
fc.mutability == ListFieldConfig.Mutability.Var, fc.mutability == ListFieldConfig.Mutability.Var,
fc.isChild, fc.isChild,
fc.strictCastInTransformChildren,
fc.mutability != ListFieldConfig.Mutability.Immutable, fc.mutability != ListFieldConfig.Mutability.Immutable,
fc.baseDefaultValue, fc.baseDefaultValue,
fc.baseGetter fc.baseGetter
@@ -157,14 +157,8 @@ fun printElements(generationPath: File, model: Model) = sequence {
if (child is SingleField) { if (child is SingleField) {
val elRef = child.type as ElementRef val elRef = child.type as ElementRef
if (!elRef.element.transform) { if (!elRef.element.transform) {
append(" as") append(" as %T")
if (child.strictCastInTransformChildren) { if (child.nullable) append("?")
append(" %T")
if (child.nullable) append("?")
} else {
if (child.nullable) append("?")
append(" %T")
}
args.add(elRef.toPoet()) args.add(elRef.toPoet())
} }
} }