[SIR] Use SirVisitorVoid i/o SirVisitor for SirAsSwiftSourcesPrinter

This commit is contained in:
Sergej Jaskiewicz
2023-12-11 18:34:17 +01:00
committed by Space Team
parent 80847b9ee2
commit 1bc2ac2c87
@@ -6,43 +6,49 @@
package org.jetbrains.sir.printer package org.jetbrains.sir.printer
import org.jetbrains.kotlin.sir.* import org.jetbrains.kotlin.sir.*
import org.jetbrains.kotlin.sir.visitors.SirVisitor import org.jetbrains.kotlin.sir.visitors.SirVisitorVoid
import org.jetbrains.kotlin.utils.SmartPrinter import org.jetbrains.kotlin.utils.SmartPrinter
private const val DEFAULT_INDENT: String = " " private const val DEFAULT_INDENT: String = " "
public class SirAsSwiftSourcesPrinter : SirVisitor<Unit, SmartPrinter>() { public class SirAsSwiftSourcesPrinter(private val printer: SmartPrinter) : SirVisitorVoid() {
public fun print(element: SirElement): String = buildString {
element.accept(this@SirAsSwiftSourcesPrinter, SmartPrinter(this))
}.trim()
override fun visitModule(module: SirModule, data: SmartPrinter): Unit = with(data) { public constructor() : this(SmartPrinter(StringBuilder()))
public fun print(element: SirElement): String {
element.accept(this)
return printer.toString().trim()
}
override fun visitModule(module: SirModule): Unit = with(printer) {
module.declarations.forEach { module.declarations.forEach {
it.accept(this@SirAsSwiftSourcesPrinter, this) it.accept(this@SirAsSwiftSourcesPrinter)
if (module.declarations.last() != it) { if (module.declarations.last() != it) {
println() println()
} }
} }
} }
override fun visitFunction(function: SirFunction, data: SmartPrinter): Unit = with(data) { override fun visitFunction(function: SirFunction): Unit = with(printer) {
println(listOfNotNull( println(
function.visibility.takeIf { it != SirVisibility.INTERNAL }?.let { "${it.swift} " }, listOfNotNull(
"func ", function.visibility.takeIf { it != SirVisibility.INTERNAL }?.let { "${it.swift} " },
function.name.swiftIdentifier, "func ",
function.parameters.takeIf { it.isNotEmpty() } function.name.swiftIdentifier,
?.joinToString(prefix = "(\n", postfix = "\n)", separator = ",\n") { function.parameters.takeIf { it.isNotEmpty() }
it.swift.prependIndent(DEFAULT_INDENT) ?.joinToString(prefix = "(\n", postfix = "\n)", separator = ",\n") {
} ?: "()", it.swift.prependIndent(DEFAULT_INDENT)
" -> ", } ?: "()",
function.returnType.swift, " -> ",
" { fatalError() }" function.returnType.swift,
).joinToString(separator = "")) " { fatalError() }",
).joinToString(separator = ""),
)
} }
override fun visitForeignFunction(function: SirForeignFunction, data: SmartPrinter) {} // we do not write Foreign nodes override fun visitForeignFunction(function: SirForeignFunction) {} // we do not write foreign nodes
override fun visitElement(element: SirElement, data: SmartPrinter): Unit = with(data) { override fun visitElement(element: SirElement): Unit = with(printer) {
println("/* ERROR: unsupported element type: " + element.javaClass.simpleName + " */") println("/* ERROR: unsupported element type: " + element.javaClass.simpleName + " */")
} }
} }