diff --git a/kotlinpoet/api/jvm/kotlinpoet.api b/kotlinpoet/api/jvm/kotlinpoet.api index 6c23798..f4d22b8 100644 --- a/kotlinpoet/api/jvm/kotlinpoet.api +++ b/kotlinpoet/api/jvm/kotlinpoet.api @@ -333,9 +333,11 @@ public final class dev/kord/codegen/kotlinpoet/TypeSpecFactoriesKt { } public final class dev/kord/codegen/kotlinpoet/UtilsKt { + public static final fun addParameter (Lcom/squareup/kotlinpoet/FunSpec$Builder;Lcom/squareup/kotlinpoet/ParameterSpec;)Lcom/squareup/kotlinpoet/FunSpec$Builder; public static final fun emptyCodeBlock ()Lcom/squareup/kotlinpoet/CodeBlock; public static final fun indentWithSpaces (Lcom/squareup/kotlinpoet/FileSpec$Builder;I)Lcom/squareup/kotlinpoet/FileSpec$Builder; public static synthetic fun indentWithSpaces$default (Lcom/squareup/kotlinpoet/FileSpec$Builder;IILjava/lang/Object;)Lcom/squareup/kotlinpoet/FileSpec$Builder; + public static final fun minOf-PWzV0Is (JJ)J public static final fun withNameAllocator (Lkotlin/jvm/functions/Function1;)V } diff --git a/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/FunSpecReified.kt b/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/FunSpecReified.kt index 12bbb20..044992c 100644 --- a/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/FunSpecReified.kt +++ b/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/FunSpecReified.kt @@ -2,11 +2,8 @@ package dev.kord.codegen.kotlinpoet import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.FunSpec -import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.asClassName import com.squareup.kotlinpoet.typeNameOf -import kotlin.String -import kotlin.collections.Iterable public inline fun FunSpec.Builder.`receiver`(kdoc: CodeBlock = emptyCodeBlock()): FunSpec.Builder = `receiver`(typeNameOf(), kdoc) @@ -14,13 +11,5 @@ public inline fun FunSpec.Builder.`receiver`(kdoc: CodeBlock = empty public inline fun FunSpec.Builder.returns(kdoc: CodeBlock = emptyCodeBlock()): FunSpec.Builder = returns(typeNameOf(), kdoc) -public inline fun FunSpec.Builder.addParameter(name: String, vararg - modifiers: KModifier): FunSpec.Builder = addParameter(name, typeNameOf(), - modifiers = modifiers) - -public inline fun FunSpec.Builder.addParameter(name: String, - modifiers: Iterable): FunSpec.Builder = addParameter(name, typeNameOf(), - modifiers) - public inline fun FunSpec.Builder.addAnnotation(): FunSpec.Builder = addAnnotation(A::class.asClassName()) diff --git a/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/TypeSpecReified.kt b/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/TypeSpecReified.kt index 6f693da..cd0e677 100644 --- a/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/TypeSpecReified.kt +++ b/kotlinpoet/build/generated/ksp/generationSource/generationSourceMain/kotlin/dev/kord/codegen/kotlinpoet/TypeSpecReified.kt @@ -1,12 +1,10 @@ package dev.kord.codegen.kotlinpoet import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.asClassName import com.squareup.kotlinpoet.typeNameOf import kotlin.String -import kotlin.collections.Iterable public inline fun TypeSpec.Builder.superclass(): TypeSpec.Builder = superclass(typeNameOf()) @@ -17,14 +15,6 @@ public inline fun TypeSpec.Builder.addSuperinterface(`delegate`: Cod public inline fun TypeSpec.Builder.addSuperinterface(constructorParameter: String): TypeSpec.Builder = addSuperinterface(typeNameOf(), constructorParameter) -public inline fun TypeSpec.Builder.addProperty(name: String, vararg - modifiers: KModifier): TypeSpec.Builder = addProperty(name, typeNameOf(), - modifiers = modifiers) - -public inline fun TypeSpec.Builder.addProperty(name: String, - modifiers: Iterable): TypeSpec.Builder = addProperty(name, typeNameOf(), - modifiers) - public inline fun TypeSpec.Builder.addAnnotation(): TypeSpec.Builder = addAnnotation(A::class.asClassName()) diff --git a/kotlinpoet/processor/src/main/kotlin/CodeProcessor.kt b/kotlinpoet/processor/src/main/kotlin/CodeProcessor.kt index ecdd0ef..22937fb 100644 --- a/kotlinpoet/processor/src/main/kotlin/CodeProcessor.kt +++ b/kotlinpoet/processor/src/main/kotlin/CodeProcessor.kt @@ -8,10 +8,17 @@ import com.google.devtools.ksp.processing.SymbolProcessorProvider import com.google.devtools.ksp.symbol.KSAnnotated import com.google.devtools.ksp.symbol.KSDeclaration import com.google.devtools.ksp.symbol.KSFile +import com.squareup.kotlinpoet.KModifier import dev.kord.codegen.generator.builder_functions.BuilderVisitor import dev.kord.codegen.generator.reification.ReifyingVisitor +import dev.kord.codegen.generator.reification.TypeVariableName import dev.kord.codegen.generator.utils.accept import dev.kord.codegen.generator.visitors.BeginEndVisitor +import dev.kord.codegen.kotlinpoet.FunSpec +import dev.kord.codegen.kotlinpoet.LambdaTypeName +import dev.kord.codegen.kotlinpoet.addCode +import dev.kord.codegen.kotlinpoet.addParameter +import java.util.* val SymbolProcessorEnvironment.packageName: String get() = options["package-name"]!! diff --git a/kotlinpoet/processor/src/main/kotlin/reification/IsReifyable.kt b/kotlinpoet/processor/src/main/kotlin/reification/IsReifyable.kt index ddc5110..81ca004 100644 --- a/kotlinpoet/processor/src/main/kotlin/reification/IsReifyable.kt +++ b/kotlinpoet/processor/src/main/kotlin/reification/IsReifyable.kt @@ -1,10 +1,12 @@ package dev.kord.codegen.generator.reification import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.KSClassifierReference import com.google.devtools.ksp.symbol.KSFunctionDeclaration import com.squareup.kotlinpoet.* import kotlin.reflect.KClass +val ignoreList = listOf("addParameter", "addProperty") /** * Checks whether a [KSFunctionDeclaration] is reifiable. @@ -18,6 +20,7 @@ fun KSFunctionDeclaration.isReifiable( includeClassName: Boolean = true, includeTypeName: Boolean = true ): Boolean { + if (simpleName.asString() in ignoreList && parentDeclaration is KSClassDeclaration) return false // We cannot add two receivers at this point if (parentDeclaration is KSClassDeclaration && extensionReceiver != null) return false return parameters.any { diff --git a/kotlinpoet/src/commonMain/kotlin/Utils.kt b/kotlinpoet/src/commonMain/kotlin/Utils.kt index 13c4496..e729ece 100644 --- a/kotlinpoet/src/commonMain/kotlin/Utils.kt +++ b/kotlinpoet/src/commonMain/kotlin/Utils.kt @@ -1,8 +1,9 @@ +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + package dev.kord.codegen.kotlinpoet -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.FileSpec -import com.squareup.kotlinpoet.NameAllocator +import com.squareup.kotlinpoet.* +import kotlin.internal.HidesMembers /** * Scope for [withNameAllocator]. @@ -35,3 +36,21 @@ public fun FileSpec.Builder.indentWithSpaces(width: Int = 4): FileSpec.Builder = * ``` */ public fun withNameAllocator(block: NamingScope): Unit = NameAllocator().block() + +public fun minOf(a: ULong, b: ULong): ULong { + return if (a <= b) a else b +} + +@HidesMembers +public fun FunSpec.Builder.addParameter(parameterSpec: ParameterSpec): FunSpec.Builder = apply { + +} + +//private fun generateListOf() = FunSpec("minOf") { +// addAnn(Suppress("unused")) +// val a by addParameter() +// val b by addParameter() +// +// returns() +// addCode("return·if·(%N·<=·%n)·a·else·b", a, b) +//} diff --git a/kotlinpoet/src/commonTest/kotlin/ExampleTest.kt b/kotlinpoet/src/commonTest/kotlin/ExampleTest.kt index 444afc5..87c8a23 100644 --- a/kotlinpoet/src/commonTest/kotlin/ExampleTest.kt +++ b/kotlinpoet/src/commonTest/kotlin/ExampleTest.kt @@ -45,4 +45,21 @@ private fun main() { class ExampleTest { @Test fun test() = main() + + @Test + fun test2() { + fun generateListOf() = FunSpec("minOf") { + addAnnotation(Suppress("unused")) + val a = addParameter("a") + val b = addParameter("b") + + returns() + addCode("return·") + + } + + println(generateListOf()) + } } + + diff --git a/ksp/build.gradle.kts b/ksp/build.gradle.kts index d579b27..b5d7c54 100644 --- a/ksp/build.gradle.kts +++ b/ksp/build.gradle.kts @@ -37,6 +37,14 @@ apiValidation { ignoredProjects.add("processor") } +tasks { + afterEvaluate { + named("kspTestKotlin") { + dependsOn(jar) + } + } +} + subprojects { afterEvaluate { mavenPublishing { diff --git a/ksp/processor/api/processor.api b/ksp/processor/api/processor.api new file mode 100644 index 0000000..08d99b8 --- /dev/null +++ b/ksp/processor/api/processor.api @@ -0,0 +1,54 @@ +public final class dev/kord/codegen/ksp/processor/NamesKt { + public static final field NULL_IF_DEFAULT Ljava/lang/String; + public static final field PROCESSOR_ANNOTATION Ljava/lang/String; + public static final fun getARGUMENTS ()Lcom/squareup/kotlinpoet/MemberName; + public static final fun getARGUMENTS_NOT_NULL ()Lcom/squareup/kotlinpoet/MemberName; + public static final fun getGET_ANNOTATIONS_BY_TYPE ()Lcom/squareup/kotlinpoet/MemberName; + public static final fun getGET_ANNOTATION_BY_TYPE ()Lcom/squareup/kotlinpoet/MemberName; +} + +public final class dev/kord/codegen/ksp/processor/ProcessorAnnotationProcessor : com/google/devtools/ksp/processing/SymbolProcessor { + public synthetic fun (Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun process (Lcom/google/devtools/ksp/processing/Resolver;)Ljava/util/List; +} + +public final class dev/kord/codegen/ksp/processor/ProcessorAnnotationProcessor$Provider : com/google/devtools/ksp/processing/SymbolProcessorProvider { + public fun ()V + public fun create (Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment;)Lcom/google/devtools/ksp/processing/SymbolProcessor; +} + +public final class dev/kord/codegen/ksp/processor/generator/AccessorFunctionsKt { + public static final fun accessorFunction (Ldev/kord/codegen/ksp/processor/generator/ProcessingContext;)V +} + +public final class dev/kord/codegen/ksp/processor/generator/DataClassRepresentationKt { + public static final fun dataClassRepresentation (Ldev/kord/codegen/ksp/processor/generator/ProcessingContext;)V + public static final fun dataClassType (Lcom/google/devtools/ksp/symbol/KSPropertyDeclaration;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Lcom/squareup/kotlinpoet/TypeName; + public static final fun isMappedAnnotation (Lcom/google/devtools/ksp/symbol/KSType;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)Z +} + +public final class dev/kord/codegen/ksp/processor/generator/FactoryFunctionKt { + public static final fun factoryFunction (Lcom/squareup/kotlinpoet/TypeSpec$Builder;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Ljava/lang/String;)V +} + +public final class dev/kord/codegen/ksp/processor/generator/GeneratorKt { + public static final fun processAnnotation (Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;)V +} + +public final class dev/kord/codegen/ksp/processor/generator/ProcessingContext { + public fun (Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment;Lcom/squareup/kotlinpoet/FileSpec$Builder;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Ljava/lang/String;)V + public final fun component1 ()Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment; + public final fun component2 ()Lcom/squareup/kotlinpoet/FileSpec$Builder; + public final fun component3 ()Lcom/google/devtools/ksp/symbol/KSClassDeclaration; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment;Lcom/squareup/kotlinpoet/FileSpec$Builder;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Ljava/lang/String;)Ldev/kord/codegen/ksp/processor/generator/ProcessingContext; + public static synthetic fun copy$default (Ldev/kord/codegen/ksp/processor/generator/ProcessingContext;Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment;Lcom/squareup/kotlinpoet/FileSpec$Builder;Lcom/google/devtools/ksp/symbol/KSClassDeclaration;Ljava/lang/String;ILjava/lang/Object;)Ldev/kord/codegen/ksp/processor/generator/ProcessingContext; + public fun equals (Ljava/lang/Object;)Z + public final fun getDeclaration ()Lcom/google/devtools/ksp/symbol/KSClassDeclaration; + public final fun getEnvironment ()Lcom/google/devtools/ksp/processing/SymbolProcessorEnvironment; + public final fun getFile ()Lcom/squareup/kotlinpoet/FileSpec$Builder; + public final fun getPackageName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + diff --git a/ksp/src/test/kotlin/MockAnnotation.kt b/ksp/src/test/kotlin/MockAnnotation.kt index f27cf10..fa8cceb 100644 --- a/ksp/src/test/kotlin/MockAnnotation.kt +++ b/ksp/src/test/kotlin/MockAnnotation.kt @@ -19,11 +19,11 @@ private val _arguments = listOf( mockDefaultValueArgument("withDefault") ) -private fun mockValueArgumentInternal(_name: String, _value: Any?, origin: Origin = Origin.KOTLIN) = +private fun mockValueArgumentInternal(name: String, value: Any?, origin: Origin = Origin.KOTLIN) = mockk { - every { name } returns MockKSName(_name) + every { this@mockk.name } returns MockKSName(name) every { this@mockk.origin } returns origin - every { value } returns _value + every { this@mockk.value } returns value } fun mockAnnotation() = mockk {