Skip to content

Commit

Permalink
Merge pull request #73 from ema987/feat/addOptionalClosureParameterSu…
Browse files Browse the repository at this point in the history
…pport

Add support for optional closure parameter
  • Loading branch information
kdubb authored Apr 26, 2023
2 parents f86bc1f + 1ac4978 commit 75218cf
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
15 changes: 14 additions & 1 deletion src/main/java/io/outfoxx/swiftpoet/ParameterizedTypeName.kt
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,20 @@ class ParameterizedTypeName internal constructor(

override fun emit(out: CodeWriter): CodeWriter {
when (rawType) {
OPTIONAL -> out.emitCode("%T?", typeArguments[0])
OPTIONAL -> {
typeArguments[0].apply {
when (this) {
is FunctionTypeName -> {
out.emitCode("(")
out.emitCode("%T", this)
out.emitCode(")?")
}
else -> {
out.emitCode("%T?", this)
}
}
}
}
IMPLICIT -> out.emitCode("%T!", typeArguments[0])
ARRAY -> out.emitCode("[%T]", typeArguments[0])
DICTIONARY -> out.emitCode("[%T : %T]", typeArguments[0], typeArguments[1])
Expand Down
83 changes: 83 additions & 0 deletions src/test/java/io/outfoxx/swiftpoet/test/FunctionSpecTests.kt
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,89 @@ class FunctionSpecTests {
)
}

@Test
@DisplayName("Generates correct optional closure parameters")
fun testGenerateOptionalClosureParameters() {
val closureTypeName =
FunctionTypeName.get(listOf(ParameterSpec.unnamed(STRING), ParameterSpec.unnamed(INT)), STRING)
.makeOptional()
val testFunc = FunctionSpec.builder("test")
.addParameter(
ParameterSpec.builder("closure", closureTypeName)
.build()
)
.build()

val out = StringWriter()
testFunc.emit(CodeWriter(out), null, setOf())

assertThat(
out.toString(),
equalTo(
"""
func test(closure: ((Swift.String, Swift.Int) -> Swift.String)?) {
}
""".trimIndent()
)
)
}

@Test
@DisplayName("Generates correct closure optional return type")
fun testGenerateClosureOptionalReturnType() {
val closureTypeName =
FunctionTypeName.get(listOf(ParameterSpec.unnamed(STRING), ParameterSpec.unnamed(INT)), STRING.makeOptional())
val testFunc = FunctionSpec.builder("test")
.addParameter(
ParameterSpec.builder("closure", closureTypeName)
.build()
)
.build()

val out = StringWriter()
testFunc.emit(CodeWriter(out), null, setOf())

assertThat(
out.toString(),
equalTo(
"""
func test(closure: (Swift.String, Swift.Int) -> Swift.String?) {
}
""".trimIndent()
)
)
}

@Test
@DisplayName("Generates correct optional closure parameters and optional return type")
fun testGenerateOptionalClosureParametersAndOptionalReturnType() {
val closureTypeName =
FunctionTypeName.get(listOf(ParameterSpec.unnamed(STRING), ParameterSpec.unnamed(INT)), STRING.makeOptional())
.makeOptional()
val testFunc = FunctionSpec.builder("test")
.addParameter(
ParameterSpec.builder("closure", closureTypeName)
.build()
)
.build()

val out = StringWriter()
testFunc.emit(CodeWriter(out), null, setOf())

assertThat(
out.toString(),
equalTo(
"""
func test(closure: ((Swift.String, Swift.Int) -> Swift.String?)?) {
}
""".trimIndent()
)
)
}

@Test
@DisplayName("Generates escaping closure parameters")
fun testGenerateEscapingClosureParameters() {
Expand Down

0 comments on commit 75218cf

Please sign in to comment.