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:
+48
-13
@@ -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()
|
||||
}
|
||||
}
|
||||
+151
@@ -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`() {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user