From fb412755b0510f25a45381bde2b9bc4a02059943 Mon Sep 17 00:00:00 2001 From: Dimitris Koutsogiorgas Date: Thu, 15 Feb 2024 14:15:00 -0800 Subject: [PATCH] Add support for closure based properties and lazy modifier --- .../java/io/outfoxx/swiftpoet/Modifier.kt | 2 + .../java/io/outfoxx/swiftpoet/PropertySpec.kt | 10 ++++ .../swiftpoet/test/PropertySpecTests.kt | 60 +++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/src/main/java/io/outfoxx/swiftpoet/Modifier.kt b/src/main/java/io/outfoxx/swiftpoet/Modifier.kt index d89863952..42ddf67a2 100644 --- a/src/main/java/io/outfoxx/swiftpoet/Modifier.kt +++ b/src/main/java/io/outfoxx/swiftpoet/Modifier.kt @@ -30,6 +30,8 @@ enum class Modifier( CLASS("class", Target.FUNCTION, Target.PROPERTY), STATIC("static", Target.FUNCTION, Target.PROPERTY), + LAZY("lazy", Target.PROPERTY), + MUTATING("mutating", Target.FUNCTION, Target.PROPERTY), NONMUTATING("nonmutating", Target.FUNCTION, Target.PROPERTY), diff --git a/src/main/java/io/outfoxx/swiftpoet/PropertySpec.kt b/src/main/java/io/outfoxx/swiftpoet/PropertySpec.kt index 097d94c17..3e34c3521 100644 --- a/src/main/java/io/outfoxx/swiftpoet/PropertySpec.kt +++ b/src/main/java/io/outfoxx/swiftpoet/PropertySpec.kt @@ -33,6 +33,7 @@ class PropertySpec private constructor( ) : AttributedSpec(builder.attributes.toImmutableList(), builder.tags) { val mutable = builder.mutable + val closure = builder.closure val mutableVisibility = builder.mutableVisibility val simpleSpec = builder.simpleSpec val subscriptSpec = builder.subscriptSpec @@ -118,6 +119,9 @@ class PropertySpec private constructor( } codeWriter.emit("}") + if (closure) { + codeWriter.emit("()") + } } } @@ -136,6 +140,7 @@ class PropertySpec private constructor( val builder = Builder() builder.simpleSpec = simpleSpec builder.mutable = mutable + builder.closure = closure builder.doc.add(doc) builder.modifiers += modifiers builder.initializer = initializer @@ -148,6 +153,7 @@ class PropertySpec private constructor( internal var simpleSpec: Pair? = null internal var subscriptSpec: FunctionSignatureSpec? = null internal var mutable = false + internal var closure = false internal var mutableVisibility: Modifier? = null internal val doc = CodeBlock.builder() internal val modifiers = mutableListOf() @@ -165,6 +171,10 @@ class PropertySpec private constructor( this.subscriptSpec = subscriptSpec } + fun closure(closure: Boolean) = apply { + this.closure = closure + } + fun mutable(mutable: Boolean) = apply { check(subscriptSpec == null) { "subscripts cannot be mutable" } this.mutable = mutable diff --git a/src/test/java/io/outfoxx/swiftpoet/test/PropertySpecTests.kt b/src/test/java/io/outfoxx/swiftpoet/test/PropertySpecTests.kt index 8c4d4e459..0b6a01ffe 100644 --- a/src/test/java/io/outfoxx/swiftpoet/test/PropertySpecTests.kt +++ b/src/test/java/io/outfoxx/swiftpoet/test/PropertySpecTests.kt @@ -22,6 +22,7 @@ import io.outfoxx.swiftpoet.DeclaredTypeName.Companion.typeName import io.outfoxx.swiftpoet.FunctionSignatureSpec import io.outfoxx.swiftpoet.FunctionSpec import io.outfoxx.swiftpoet.INT +import io.outfoxx.swiftpoet.Modifier.LAZY import io.outfoxx.swiftpoet.Modifier.PRIVATE import io.outfoxx.swiftpoet.Modifier.PUBLIC import io.outfoxx.swiftpoet.Modifier.UNOWNED @@ -87,6 +88,26 @@ class PropertySpecTests { ) } + @Test + @DisplayName("Adds lazy modifier") + fun lazyProperty() { + val testProperty = + PropertySpec.varBuilder("test", STRING, LAZY) + .build() + + val out = StringWriter() + testProperty.emit(CodeWriter(out), setOf()) + + assertThat( + out.toString(), + equalTo( + """ + lazy var test: Swift.String + """.trimIndent() + ) + ) + } + @Test @DisplayName("Adds unowned modifier") fun unownedReferences() { @@ -128,6 +149,45 @@ class PropertySpecTests { ) } + @Test + @DisplayName("Adds closure") + fun addsClosure() { + val testProperty = + PropertySpec.varBuilder("test", STRING, PUBLIC) + .closure(true) + .getter( + FunctionSpec + .getterBuilder() + .addStatement("%S", 1) + .build() + ) + .setter( + FunctionSpec + .setterBuilder() + .addCode("") + .build() + ) + .build() + + val out = StringWriter() + testProperty.emit(CodeWriter(out), setOf()) + + assertThat( + out.toString(), + equalTo( + """ + public var test: Swift.String { + get { + "1" + } + set { + } + }() + """.trimIndent() + ) + ) + } + @Test @DisplayName("Standalone mutable visibility modifier") fun standaloneMutableVisibility() {