KT-65897: add exporting of kotlin constructors as Swift constructors #KT-65897 fixed

Merge-request: KT-MR-14734
Merged-by: Artem Olkov <artem.olkov@jetbrains.com>
This commit is contained in:
Artem Olkov
2024-03-14 12:21:39 +00:00
committed by Space Team
parent bbcc5c9aed
commit fcc4470b74
18 changed files with 544 additions and 19 deletions
@@ -102,19 +102,7 @@ public class SirAsSwiftSourcesPrinter(private val printer: SmartPrinter) : SirVi
function.name.swiftIdentifier,
"("
)
if (function.parameters.isNotEmpty()) {
println()
withIndent {
function.parameters.forEachIndexed { index, sirParameter ->
print(sirParameter.swift)
if (index != function.parameters.lastIndex) {
println(",")
} else {
println()
}
}
}
}
printParameters(function.parameters)
print(
")",
" -> ",
@@ -129,6 +117,26 @@ public class SirAsSwiftSourcesPrinter(private val printer: SmartPrinter) : SirVi
println("}")
}
override fun visitInit(init: SirInit): Unit = with(printer) {
init.documentation?.let { println(it) }
printVisibility(init)
printInitKind(init.initKind)
print("init")
"?".takeIf { init.isFailable }?.let { print(it) }
print("(")
printParameters(init.parameters)
print(
")"
)
println(" {")
withIndent {
printFunctionBody(init.body).forEach {
println(it)
}
}
println("}")
}
override fun visitEnum(enum: SirEnum): Unit = with(printer) {
printVisibility(enum)
println(
@@ -184,6 +192,16 @@ internal fun SmartPrinter.printVisibility(decl: SirDeclaration) {
)
}
internal fun SmartPrinter.printInitKind(decl: SirInitializerKind) {
print(
when (decl) {
SirInitializerKind.ORDINARY -> ""
SirInitializerKind.REQUIRED -> "required "
SirInitializerKind.CONVENIENCE -> "convenience "
}
)
}
internal fun SmartPrinter.printCallableKind(callableKind: SirCallableKind) {
print(
when (callableKind) {
@@ -194,3 +212,20 @@ internal fun SmartPrinter.printCallableKind(callableKind: SirCallableKind) {
}
)
}
internal fun SmartPrinter.printParameters(params: List<SirParameter>): Unit = params
.takeIf { it.isNotEmpty() }
?.let {
println()
withIndent {
params.forEachIndexed { index, sirParameter ->
print(sirParameter.swift)
if (index != params.lastIndex) {
println(",")
} else {
println()
}
}
}
}
?: Unit
@@ -0,0 +1,37 @@
public class Foo {
public init?(
arg1: Swift.Bool,
arg2: Swift.Int8,
arg3: Swift.Int16,
arg4: Swift.Int32,
arg5: Swift.Int64,
arg6: Swift.Double,
arg7: Swift.Float
) {
fatalError()
}
public init(
arg1: Swift.UInt8,
arg2: Swift.UInt16,
arg3: Swift.UInt32,
arg4: Swift.UInt64
) {
fatalError()
}
public required init(
arg1: Swift.UInt8,
arg2: Swift.UInt16,
arg3: Swift.UInt32,
arg4: Swift.UInt64
) {
fatalError()
}
public convenience init(
arg1: Swift.UInt8,
arg2: Swift.UInt16,
arg3: Swift.UInt32,
arg4: Swift.UInt64
) {
fatalError()
}
}
@@ -460,6 +460,157 @@ class SirAsSwiftSourcesPrinterTests {
)
}
@Test
fun `should print class with constructor`() {
val module = buildModule {
name = "Test"
declarations.add(
buildClass {
origin = SirOrigin.Unknown
name = "Foo"
declarations.add(
buildInit {
origin = SirOrigin.Unknown
kind = SirCallableKind.INSTANCE_METHOD
initKind = SirInitializerKind.ORDINARY
visibility = SirVisibility.PUBLIC
isFailable = true
parameters.addAll(
listOf(
SirParameter(
argumentName = "arg1",
type = SirNominalType(SirSwiftModule.bool)
),
SirParameter(
argumentName = "arg2",
type = SirNominalType(SirSwiftModule.int8)
),
SirParameter(
argumentName = "arg3",
type = SirNominalType(SirSwiftModule.int16)
),
SirParameter(
argumentName = "arg4",
type = SirNominalType(SirSwiftModule.int32)
),
SirParameter(
argumentName = "arg5",
type = SirNominalType(SirSwiftModule.int64)
),
SirParameter(
argumentName = "arg6",
type = SirNominalType(SirSwiftModule.double)
),
SirParameter(
argumentName = "arg7",
type = SirNominalType(SirSwiftModule.float)
),
)
)
}
)
declarations.add(
buildInit {
origin = SirOrigin.Unknown
kind = SirCallableKind.INSTANCE_METHOD
initKind = SirInitializerKind.ORDINARY
visibility = SirVisibility.PUBLIC
isFailable = false
parameters.addAll(
listOf(
SirParameter(
argumentName = "arg1",
type = SirNominalType(SirSwiftModule.uint8)
),
SirParameter(
argumentName = "arg2",
type = SirNominalType(SirSwiftModule.uint16)
),
SirParameter(
argumentName = "arg3",
type = SirNominalType(SirSwiftModule.uint32)
),
SirParameter(
argumentName = "arg4",
type = SirNominalType(SirSwiftModule.uint64)
),
)
)
}
)
declarations.add(
buildInit {
origin = SirOrigin.Unknown
kind = SirCallableKind.INSTANCE_METHOD
initKind = SirInitializerKind.REQUIRED
visibility = SirVisibility.PUBLIC
isFailable = false
parameters.addAll(
listOf(
SirParameter(
argumentName = "arg1",
type = SirNominalType(SirSwiftModule.uint8)
),
SirParameter(
argumentName = "arg2",
type = SirNominalType(SirSwiftModule.uint16)
),
SirParameter(
argumentName = "arg3",
type = SirNominalType(SirSwiftModule.uint32)
),
SirParameter(
argumentName = "arg4",
type = SirNominalType(SirSwiftModule.uint64)
),
)
)
}
)
declarations.add(
buildInit {
origin = SirOrigin.Unknown
kind = SirCallableKind.INSTANCE_METHOD
initKind = SirInitializerKind.CONVENIENCE
visibility = SirVisibility.PUBLIC
isFailable = false
parameters.addAll(
listOf(
SirParameter(
argumentName = "arg1",
type = SirNominalType(SirSwiftModule.uint8)
),
SirParameter(
argumentName = "arg2",
type = SirNominalType(SirSwiftModule.uint16)
),
SirParameter(
argumentName = "arg3",
type = SirNominalType(SirSwiftModule.uint32)
),
SirParameter(
argumentName = "arg4",
type = SirNominalType(SirSwiftModule.uint64)
),
)
)
}
)
}
)
}
runTest(
module,
"testData/class_with_init"
)
}
@Test
fun `should print class with variable`() {