Skip to content

Commit

Permalink
Merge pull request #115 from outfoxx/feature/generic-qualify
Browse files Browse the repository at this point in the history
Support generic qualifiers for `TypeName`
  • Loading branch information
kdubb committed Jan 23, 2024
2 parents 0e455a2 + ebf329c commit 7e699b8
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 0 deletions.
20 changes: 20 additions & 0 deletions api/swiftpoet.api
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,25 @@ public final class io/outfoxx/swiftpoet/FunctionTypeName$Companion {
public static synthetic fun get$default (Lio/outfoxx/swiftpoet/FunctionTypeName$Companion;[Lio/outfoxx/swiftpoet/TypeName;Lio/outfoxx/swiftpoet/TypeName;ILjava/lang/Object;)Lio/outfoxx/swiftpoet/FunctionTypeName;
}

public final class io/outfoxx/swiftpoet/GenericQualifiedTypeName : io/outfoxx/swiftpoet/TypeName {
public static final field Companion Lio/outfoxx/swiftpoet/GenericQualifiedTypeName$Companion;
public final fun getQualifier ()Lio/outfoxx/swiftpoet/GenericQualifier;
public final fun getType ()Lio/outfoxx/swiftpoet/TypeName;
}

public final class io/outfoxx/swiftpoet/GenericQualifiedTypeName$Companion {
public final fun any (Lio/outfoxx/swiftpoet/TypeName;)Lio/outfoxx/swiftpoet/GenericQualifiedTypeName;
public final fun of (Lio/outfoxx/swiftpoet/TypeName;Lio/outfoxx/swiftpoet/GenericQualifier;)Lio/outfoxx/swiftpoet/GenericQualifiedTypeName;
public final fun some (Lio/outfoxx/swiftpoet/TypeName;)Lio/outfoxx/swiftpoet/GenericQualifiedTypeName;
}

public final class io/outfoxx/swiftpoet/GenericQualifier : java/lang/Enum {
public static final field ANY Lio/outfoxx/swiftpoet/GenericQualifier;
public static final field SOME Lio/outfoxx/swiftpoet/GenericQualifier;
public static fun valueOf (Ljava/lang/String;)Lio/outfoxx/swiftpoet/GenericQualifier;
public static fun values ()[Lio/outfoxx/swiftpoet/GenericQualifier;
}

public final class io/outfoxx/swiftpoet/ImportSpec : io/outfoxx/swiftpoet/AttributedSpec, java/lang/Comparable {
public static final field Companion Lio/outfoxx/swiftpoet/ImportSpec$Companion;
public static final fun builder (Ljava/lang/String;)Lio/outfoxx/swiftpoet/ImportSpec$Builder;
Expand Down Expand Up @@ -649,6 +668,7 @@ public abstract class io/outfoxx/swiftpoet/TypeName {
public fun makeNonImplicit ()Lio/outfoxx/swiftpoet/TypeName;
public fun makeNonOptional ()Lio/outfoxx/swiftpoet/TypeName;
public fun makeOptional ()Lio/outfoxx/swiftpoet/ParameterizedTypeName;
public fun qualify (Lio/outfoxx/swiftpoet/GenericQualifier;)Lio/outfoxx/swiftpoet/GenericQualifiedTypeName;
public fun toString ()Ljava/lang/String;
public fun unwrapOptional ()Lio/outfoxx/swiftpoet/TypeName;
public fun wrapOptional ()Lio/outfoxx/swiftpoet/ParameterizedTypeName;
Expand Down
56 changes: 56 additions & 0 deletions src/main/java/io/outfoxx/swiftpoet/GenericQualifiedTypeName.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* Copyright 2018 Outfox, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.outfoxx.swiftpoet

/**
* Qualify a [TypeName] with a [GenericQualifier] (any or some).
*
* `DataProtocol` qualified with `any` is
* ```
* any DataProtocol
* ```
*/
class GenericQualifiedTypeName internal constructor(
val type: TypeName,
val qualifier: GenericQualifier,
) : TypeName() {

override fun emit(out: CodeWriter): CodeWriter {
out.emitCode("${qualifier.name.lowercase()} ")
if (type is ComposedTypeName || type is GenericQualifiedTypeName) {
out.emitCode("(%T)", type)
} else {
out.emitCode("%T", type)
}
return out
}

companion object {

fun of(type: TypeName, qualifier: GenericQualifier): GenericQualifiedTypeName {
return GenericQualifiedTypeName(type, qualifier)
}

fun any(type: TypeName): GenericQualifiedTypeName {
return of(type, GenericQualifier.ANY)
}

fun some(type: TypeName): GenericQualifiedTypeName {
return of(type, GenericQualifier.SOME)
}
}
}
25 changes: 25 additions & 0 deletions src/main/java/io/outfoxx/swiftpoet/GenericQualifier.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright 2018 Outfox, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.outfoxx.swiftpoet

/**
* Generic qualifier for a [TypeName].
*/
enum class GenericQualifier {
ANY,
SOME
}
3 changes: 3 additions & 0 deletions src/main/java/io/outfoxx/swiftpoet/TypeName.kt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ abstract class TypeName internal constructor() {

open fun makeNonImplicit(): TypeName = this

open fun qualify(qualifier: GenericQualifier): GenericQualifiedTypeName =
GenericQualifiedTypeName.of(this, qualifier)

open val name: String
get() {
val out = StringWriter()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright 2018 Outfox, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.outfoxx.swiftpoet.test

import io.outfoxx.swiftpoet.ComposedTypeName
import io.outfoxx.swiftpoet.DeclaredTypeName
import io.outfoxx.swiftpoet.GenericQualifiedTypeName
import io.outfoxx.swiftpoet.GenericQualifier
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.equalTo
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test

class GenericQualifiedTypeNameTests {

@Test
@DisplayName("Generates generic qualified using explicit builders")
fun genericQualifiedTypeNameExplicit() {
val type = DeclaredTypeName.typeName(".GenericType")

assertThat(GenericQualifiedTypeName.any(type).name, equalTo("any GenericType"))
assertThat(GenericQualifiedTypeName.some(type).name, equalTo("some GenericType"))
}

@Test
@DisplayName("Generates generic qualified declared type names")
fun genericQualifiedDeclaredTypeName() {
val type = DeclaredTypeName.typeName(".GenericType")

assertThat(type.qualify(GenericQualifier.ANY).name, equalTo("any GenericType"))
assertThat(type.qualify(GenericQualifier.SOME).name, equalTo("some GenericType"))
}

@Test
@DisplayName("Generates generic qualified composite type names")
fun genericQualifiedCompositeTypeName() {
val typeA = DeclaredTypeName.typeName(".A")
val typeB = DeclaredTypeName.typeName(".B")
val typeC = DeclaredTypeName.typeName(".C")
val composed = ComposedTypeName.composed(typeA, typeB, typeC)

assertThat(composed.qualify(GenericQualifier.ANY).name, equalTo("any (A & B & C)"))
assertThat(composed.qualify(GenericQualifier.SOME).name, equalTo("some (A & B & C)"))
}
}

0 comments on commit 7e699b8

Please sign in to comment.