bir: mutable values and inspection

This commit is contained in:
Alex Zenla 2023-12-27 16:44:32 -08:00
parent 962d079acc
commit 35ce58bb44
Signed by: alex
GPG Key ID: C0780728420EBFE5
36 changed files with 125 additions and 66 deletions

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrBreak(val target: IrSymbol) : IrCodeElement { data class IrBreak(var target: IrSymbol) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(target) block(target)
} }

View File

@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrCall( data class IrCall(
override val target: IrSymbol, override var target: IrSymbol,
val arguments: List<IrCodeElement>, var arguments: List<IrCodeElement>,
val variableArguments: List<IrCodeElement>? var variableArguments: List<IrCodeElement>?
) : IrCodeElement, IrSymbolUser { ) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(target) block(target)
arguments.forEach(block) arguments.forEach(block)

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrCodeBlock(val items: List<IrCodeElement>) : IrCodeElement { data class IrCodeBlock(var items: List<IrCodeElement>) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
items.forEach(block) items.forEach(block)
} }

View File

@ -3,4 +3,4 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
sealed interface IrCodeElement : IrElement sealed class IrCodeElement : IrElement()

View File

@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrConditional( data class IrConditional(
val conditional: IrCodeElement, var conditional: IrCodeElement,
val ifTrue: IrCodeElement, var ifTrue: IrCodeElement,
val ifFalse: IrCodeElement var ifFalse: IrCodeElement
) : IrCodeElement { ) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(conditional) block(conditional)
block(ifTrue) block(ifTrue)

View File

@ -3,24 +3,24 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
sealed interface IrConstant : IrCodeElement { sealed class IrConstant : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {} override fun crawl(block: (IrElement) -> Unit) {}
} }
@Serializable @Serializable
data class IrIntegerConstant(val value: Int) : IrConstant data class IrIntegerConstant(var value: Int) : IrConstant()
@Serializable @Serializable
data class IrLongConstant(val value: Long) : IrConstant data class IrLongConstant(var value: Long) : IrConstant()
@Serializable @Serializable
data class IrDoubleConstant(val value: Double) : IrConstant data class IrDoubleConstant(var value: Double) : IrConstant()
@Serializable @Serializable
data class IrStringConstant(val value: String) : IrConstant data class IrStringConstant(var value: String) : IrConstant()
@Serializable @Serializable
data class IrBooleanConstant(val value: Boolean) : IrConstant data class IrBooleanConstant(var value: Boolean) : IrConstant()
@Serializable @Serializable
data object IrNoneConstant : IrConstant data object IrNoneConstant : IrConstant()

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrContinue(override val target: IrSymbol) : IrCodeElement, IrSymbolUser { data class IrContinue(override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(target) block(target)
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrDeclare(override val symbol: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolOwner { data class IrDeclare(override var symbol: IrSymbol, var value: IrCodeElement) : IrCodeElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
value.crawl(block) value.crawl(block)
} }

View File

@ -4,11 +4,11 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrDefinition( data class IrDefinition(
override val symbol: IrSymbol, override var symbol: IrSymbol,
val type: IrDefinitionType, var type: IrDefinitionType,
val arguments: List<IrFunctionArgument>, var arguments: List<IrFunctionArgument>,
val code: IrCodeBlock var code: IrCodeBlock
) : IrElement, IrSymbolOwner { ) : IrElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(symbol) block(symbol)
arguments.forEach(block) arguments.forEach(block)

View File

@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
sealed interface IrElement { sealed class IrElement {
fun crawl(block: (IrElement) -> Unit) abstract fun crawl(block: (IrElement) -> Unit)
} }

View File

@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrFunctionArgument(override val symbol: IrSymbol) : IrSymbolOwner { data class IrFunctionArgument(override var symbol: IrSymbol) : IrElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) {} override fun crawl(block: (IrElement) -> Unit) {}
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrIndex(val data: IrCodeElement, val index: IrCodeElement) : IrCodeElement { data class IrIndex(var data: IrCodeElement, var index: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(data) block(data)
block(index) block(index)

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrInfix(val op: IrInfixOp, val left: IrCodeElement, val right: IrCodeElement) : IrCodeElement { data class IrInfix(var op: IrInfixOp, var left: IrCodeElement, var right: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(left) block(left)
block(right) block(right)

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrList(val items: List<IrCodeElement>) : IrCodeElement { data class IrList(var items: List<IrCodeElement>) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
items.forEach(block) items.forEach(block)
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrListSize(val list: IrCodeElement) : IrCodeElement { data class IrListSize(var list: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(list) block(list)
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrLoad(override val target: IrSymbol) : IrCodeElement, IrSymbolUser { data class IrLoad(override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(target) block(target)
} }

View File

@ -4,10 +4,10 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrLoop( data class IrLoop(
override val symbol: IrSymbol, override var symbol: IrSymbol,
val condition: IrCodeElement, var condition: IrCodeElement,
val inner: IrCodeElement var inner: IrCodeElement
) : IrCodeElement, IrSymbolOwner { ) : IrCodeElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(symbol) block(symbol)
block(condition) block(condition)

View File

@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrNativeDefinition(val form: String, val definitions: List<String>) : IrCodeElement { data class IrNativeDefinition(var form: String, var definitions: List<String>) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) {} override fun crawl(block: (IrElement) -> Unit) {}
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrPrefix(val op: IrPrefixOp, val value: IrCodeElement) : IrCodeElement { data class IrPrefix(var op: IrPrefixOp, var value: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(value) block(value)
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrReturn(val from: IrSymbol, val value: IrCodeElement) : IrCodeElement { data class IrReturn(var from: IrSymbol, var value: IrCodeElement) : IrCodeElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(from) block(from)
block(value) block(value)

View File

@ -4,9 +4,10 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrSlab( data class IrSlab(
val location: IrSlabLocation, override var symbol: IrSymbol,
val definitions: List<IrDefinition> var location: IrSlabLocation,
) : IrElement { var definitions: List<IrDefinition>
) : IrElement(), IrSymbolOwner {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(location) block(location)
definitions.forEach(block) definitions.forEach(block)

View File

@ -4,8 +4,8 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrSlabLocation( data class IrSlabLocation(
val form: String, var form: String,
val path: String var path: String
) : IrElement { ) : IrElement() {
override fun crawl(block: (IrElement) -> Unit) {} override fun crawl(block: (IrElement) -> Unit) {}
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrStore(override val target: IrSymbol, val value: IrCodeElement) : IrCodeElement, IrSymbolUser { data class IrStore(override var target: IrSymbol, var value: IrCodeElement) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
value.crawl(block) value.crawl(block)
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrSuffix(val op: IrSuffixOp, override val target: IrSymbol) : IrCodeElement, IrSymbolUser { data class IrSuffix(var op: IrSuffixOp, override var target: IrSymbol) : IrCodeElement(), IrSymbolUser {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
block(target) block(target)
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrSymbol(val id: UInt, val tag: IrSymbolTag, val name: String? = null) : IrElement { data class IrSymbol(val id: UInt, val tag: IrSymbolTag, val name: String? = null) : IrElement() {
override fun crawl(block: (IrElement) -> Unit) {} override fun crawl(block: (IrElement) -> Unit) {}
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {

View File

@ -1,7 +1,10 @@
package gay.pizza.pork.bir package gay.pizza.pork.bir
import kotlinx.serialization.Serializable
@Serializable(with = IrSymbolGraphSerializer::class)
class IrSymbolGraph { class IrSymbolGraph {
private val edges = mutableSetOf<Pair<IrSymbolUser, IrSymbolOwner>>() private val edges = mutableSetOf<IrSymbolGraphEdge>()
private fun crawlForKnown(known: MutableMap<IrSymbol, IrSymbolOwner>, root: IrElement) { private fun crawlForKnown(known: MutableMap<IrSymbol, IrSymbolOwner>, root: IrElement) {
if (root is IrSymbolOwner) { if (root is IrSymbolOwner) {
@ -17,7 +20,7 @@ class IrSymbolGraph {
if (root is IrSymbolUser) { if (root is IrSymbolUser) {
val what = known[root.target] val what = known[root.target]
if (what != null) { if (what != null) {
edges.add(root to what) edges.add(IrSymbolGraphEdge(root, what))
} }
} }
@ -26,12 +29,16 @@ class IrSymbolGraph {
} }
} }
fun crawl(root: IrElement) { fun buildFromRoot(root: IrElement) {
val known = mutableMapOf<IrSymbol, IrSymbolOwner>() val known = mutableMapOf<IrSymbol, IrSymbolOwner>()
crawlForKnown(known, root) crawlForKnown(known, root)
crawlForAssociations(known, root) crawlForAssociations(known, root)
} }
fun buildFromEdges(edges: Collection<IrSymbolGraphEdge>) {
this.edges.addAll(edges)
}
fun forEachEdge(block: (IrSymbolUser, IrSymbolOwner) -> Unit) { fun forEachEdge(block: (IrSymbolUser, IrSymbolOwner) -> Unit) {
for ((from, to) in edges) { for ((from, to) in edges) {
block(from, to) block(from, to)

View File

@ -0,0 +1,6 @@
package gay.pizza.pork.bir
import kotlinx.serialization.Serializable
@Serializable
data class IrSymbolGraphEdge(val user: IrSymbolUser, val owner: IrSymbolOwner)

View File

@ -0,0 +1,26 @@
package gay.pizza.pork.bir
import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
class IrSymbolGraphSerializer : KSerializer<IrSymbolGraph> {
private val serializer = ListSerializer(IrSymbolGraphEdge.serializer())
override val descriptor: SerialDescriptor = serializer.descriptor
override fun deserialize(decoder: Decoder): IrSymbolGraph {
val graph = IrSymbolGraph()
graph.buildFromEdges(serializer.deserialize(decoder))
return graph
}
override fun serialize(encoder: Encoder, value: IrSymbolGraph) {
val edges = mutableListOf<IrSymbolGraphEdge>()
value.forEachEdge { user, owner ->
edges.add(IrSymbolGraphEdge(user, owner))
}
serializer.serialize(encoder, edges)
}
}

View File

@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
sealed interface IrSymbolOwner : IrElement { sealed interface IrSymbolOwner {
val symbol: IrSymbol var symbol: IrSymbol
} }

View File

@ -4,6 +4,7 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
enum class IrSymbolTag { enum class IrSymbolTag {
Slab,
Function, Function,
Variable, Variable,
Local, Local,

View File

@ -3,6 +3,6 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
sealed interface IrSymbolUser : IrElement { sealed interface IrSymbolUser {
val target: IrSymbol var target: IrSymbol
} }

View File

@ -3,7 +3,7 @@ package gay.pizza.pork.bir
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class IrWorld(val slabs: List<IrSlab>) : IrElement { data class IrWorld(var slabs: List<IrSlab>) : IrElement() {
override fun crawl(block: (IrElement) -> Unit) { override fun crawl(block: (IrElement) -> Unit) {
slabs.forEach(block) slabs.forEach(block)
} }

View File

@ -6,7 +6,7 @@ import gay.pizza.pork.bir.*
import gay.pizza.pork.frontend.scope.ScopeSymbol import gay.pizza.pork.frontend.scope.ScopeSymbol
import gay.pizza.pork.frontend.scope.SlabScope import gay.pizza.pork.frontend.scope.SlabScope
class IrCodeEmitter( class AstIrEmitter(
val self: IrSymbol, val self: IrSymbol,
val irSymbolWorld: IrSymbolWorld<Any>, val irSymbolWorld: IrSymbolWorld<Any>,
val irSymbolAssignment: IrSymbolAssignment, val irSymbolAssignment: IrSymbolAssignment,

View File

@ -4,6 +4,7 @@ import gay.pizza.pork.ast.gen.Symbol
import gay.pizza.pork.bir.IrDefinition import gay.pizza.pork.bir.IrDefinition
import gay.pizza.pork.bir.IrSlab import gay.pizza.pork.bir.IrSlab
import gay.pizza.pork.bir.IrSlabLocation import gay.pizza.pork.bir.IrSlabLocation
import gay.pizza.pork.bir.IrSymbolTag
import gay.pizza.pork.frontend.Slab import gay.pizza.pork.frontend.Slab
class CompilableSlab(val compiler: Compiler, val slab: Slab) { class CompilableSlab(val compiler: Compiler, val slab: Slab) {
@ -20,11 +21,12 @@ class CompilableSlab(val compiler: Compiler, val slab: Slab) {
} }
private fun compileIrSlab(): IrSlab { private fun compileIrSlab(): IrSlab {
val slabSymbol = compiler.irSymbolAssignment.next(IrSymbolTag.Slab, slab.location.commonLocationIdentity)
val definitions = mutableListOf<IrDefinition>() val definitions = mutableListOf<IrDefinition>()
for (compilableSymbol in compilableSymbols) { for (compilableSymbol in compilableSymbols) {
definitions.add(compilableSymbol.compiledIrDefinition) definitions.add(compilableSymbol.compiledIrDefinition)
} }
val irSlabLocation = IrSlabLocation(slab.location.form, slab.location.filePath) val irSlabLocation = IrSlabLocation(slab.location.form, slab.location.filePath)
return IrSlab(irSlabLocation, definitions) return IrSlab(slabSymbol, irSlabLocation, definitions)
} }
} }

View File

@ -29,7 +29,7 @@ class CompilableSymbol(val compilableSlab: CompilableSlab, val scopeSymbol: Scop
private fun compileIrDefinition(): IrDefinition { private fun compileIrDefinition(): IrDefinition {
val compiler = compilableSlab.compiler val compiler = compilableSlab.compiler
val functionSymbol = compiler.irSymbolWorld.create(scopeSymbol, IrSymbolTag.Function, scopeSymbol.symbol.id) val functionSymbol = compiler.irSymbolWorld.create(scopeSymbol, IrSymbolTag.Function, scopeSymbol.symbol.id)
val irCodeEmitter = IrCodeEmitter( val irCodeEmitter = AstIrEmitter(
self = functionSymbol, self = functionSymbol,
irSymbolWorld = compiler.irSymbolWorld, irSymbolWorld = compiler.irSymbolWorld,
irSymbolAssignment = compiler.irSymbolAssignment, irSymbolAssignment = compiler.irSymbolAssignment,

View File

@ -4,16 +4,26 @@ import com.charleskorn.kaml.PolymorphismStyle
import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.Yaml
import com.github.ajalt.clikt.core.CliktCommand import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.arguments.argument import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.options.flag
import com.github.ajalt.clikt.parameters.options.option
import gay.pizza.dough.fs.PlatformFsProvider import gay.pizza.dough.fs.PlatformFsProvider
import gay.pizza.pork.ast.gen.Symbol import gay.pizza.pork.ast.gen.Symbol
import gay.pizza.pork.bir.IrSymbolGraph
import gay.pizza.pork.bir.IrWorld import gay.pizza.pork.bir.IrWorld
import gay.pizza.pork.bytecode.CompiledWorld import gay.pizza.pork.bytecode.CompiledWorld
import gay.pizza.pork.compiler.Compiler import gay.pizza.pork.compiler.Compiler
import gay.pizza.pork.minimal.FileTool import gay.pizza.pork.minimal.FileTool
class CompileCommand : CliktCommand(help = "Compile Pork to Bytecode", name = "compile") { class CompileCommand : CliktCommand(help = "Compile Pork", name = "compile") {
val showIrCode by option("--show-ir-code").flag(default = false)
val showIrSymbolGraph by option("--show-ir-symbol-graph").flag(default = false)
val path by argument("file") val path by argument("file")
private val yaml = Yaml(configuration = Yaml.default.configuration.copy(
polymorphismStyle = PolymorphismStyle.Property
))
override fun run() { override fun run() {
val tool = FileTool(PlatformFsProvider.resolve(path)) val tool = FileTool(PlatformFsProvider.resolve(path))
val world = tool.buildWorld() val world = tool.buildWorld()
@ -22,16 +32,22 @@ class CompileCommand : CliktCommand(help = "Compile Pork to Bytecode", name = "c
val compiledSlab = compiler.compilableSlabs.of(slab) val compiledSlab = compiler.compilableSlabs.of(slab)
val compiledMain = compiledSlab.resolve(Symbol("main")) val compiledMain = compiledSlab.resolve(Symbol("main"))
?: throw RuntimeException("'main' function not found.") ?: throw RuntimeException("'main' function not found.")
val compiledWorld = compiler.compile(compiledMain)
val irWorld = compiler.compileIrWorld() val irWorld = compiler.compileIrWorld()
printCompiledIr(irWorld) val compiledWorld = compiler.compile(compiledMain)
if (showIrCode) {
printCompiledIr(irWorld)
}
if (showIrSymbolGraph) {
val irSymbolGraph = IrSymbolGraph()
irSymbolGraph.buildFromRoot(irWorld)
println(yaml.encodeToString(IrSymbolGraph.serializer(), irSymbolGraph))
}
printCompiledWorld(compiledWorld) printCompiledWorld(compiledWorld)
} }
private fun printCompiledIr(irWorld: IrWorld) { private fun printCompiledIr(irWorld: IrWorld) {
val yaml = Yaml(configuration = Yaml.default.configuration.copy(
polymorphismStyle = PolymorphismStyle.Property
))
println(yaml.encodeToString(IrWorld.serializer(), irWorld)) println(yaml.encodeToString(IrWorld.serializer(), irWorld))
} }