From 74ecc4bbbbbccdaeaa2bbdc5c9381603806e620a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Segovia=20C=C3=B3rdoba?= Date: Sun, 25 Aug 2024 18:02:57 +0200 Subject: [PATCH] Add `KopyFunctions` to set the functions to be generated --- CHANGELOG.md | 2 + README.md | 36 ++++++++++++--- .../kotlin/kopy/args/KopyFunctions.kt | 27 +++++++++++ .../kotlin/kopy/args/KopyFunctionsTest.kt | 18 ++++++++ .../kopy/compiler/KopyCommandLineProcessor.kt | 17 ++++++- .../javiersc/kotlin/kopy/compiler/KopyKey.kt | 2 + .../FirKopyDeclarationGenerationExtension.kt | 16 +++++-- .../all/all.fir.txt | 39 ++++++++++++++++ .../diagnostics-kopy-functions/all/all.kt | 9 ++++ .../copy/copy.fir.txt | 36 +++++++++++++++ .../diagnostics-kopy-functions/copy/copy.kt | 9 ++++ .../invoke/invoke.fir.txt | 36 +++++++++++++++ .../invoke/invoke.kt | 9 ++++ .../KopyAllDiagnosticTestGenerated.java | 28 +++++++++++ .../KopyCopyDiagnosticTestGenerated.java | 28 +++++++++++ .../KopyInvokeDiagnosticTestGenerated.java | 28 +++++++++++ .../compiler/GenerateKotlinCompilerTests.kt | 46 +++++++++++++++++++ .../compiler/KopyCommandLineProcessorTest.kt | 7 ++- .../kopy/gradle/plugin/KopyExtension.kt | 4 ++ .../kopy/gradle/plugin/KopyGradlePlugin.kt | 5 ++ 20 files changed, 388 insertions(+), 14 deletions(-) create mode 100644 kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctions.kt create mode 100644 kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctionsTest.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-functions/all/all.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-functions/all/all.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.kt create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyAllDiagnosticTestGenerated.java create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyCopyDiagnosticTestGenerated.java create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyInvokeDiagnosticTestGenerated.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c68597..fa3b37c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Added +- `KopyFunctions` to set the functions that will be generated + ### Changed ### Deprecated diff --git a/README.md b/README.md index 1da89d7..04db5eb 100644 --- a/README.md +++ b/README.md @@ -59,11 +59,11 @@ default value is `Auto`, which uses the same visibility the primary constructor Possible values: -- `KopyVisibility.Auto` -- `KopyVisibility.Public` -- `KopyVisibility.Internal` -- `KopyVisibility.Protected` -- `KopyVisibility.Private` +- `KopyVisibility.Auto` (Default): The visibility of the primary constructor is used. +- `KopyVisibility.Public`: The visibility of the generated functions will be `public`. +- `KopyVisibility.Internal`: The visibility of the generated functions will be `internal`. +- `KopyVisibility.Protected`: The visibility of the generated functions will be `protected`. +- `KopyVisibility.Private`: The visibility of the generated functions will be `private`. It is possible to have a more restrictive Kopy `copy` and `invoke` functions than the original one, for example by providing the `KopyVisiblity.Private` and the primary constructor being `public` or @@ -89,7 +89,31 @@ kopy { } ``` -### Example +#### Functions + +The `functions` option allows to decide which functions will be generated. + +Possible values: + +- `KopyFunctions.All` (default): Both, `copy` and `invoke` functions, will be generated. +- `KopyFunctions.Copy`: Only the `copy` function will be generated. +- `KopyFunctions.Invoke`: Only the `invoke` function will be generated. + +##### Example + +```kotlin +import com.javiersc.kotlin.kopy.args.KopyFunctions + +plugins { + id("com.javiersc.kotlin.kopy") version "$version" +} + +kopy { + functions = KopyFunctions.All +} +``` + +### Kopy Example ```kotlin import com.javiersc.kotlin.kopy.Kopy diff --git a/kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctions.kt b/kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctions.kt new file mode 100644 index 0000000..4d60f6c --- /dev/null +++ b/kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctions.kt @@ -0,0 +1,27 @@ +package com.javiersc.kotlin.kopy.args + +import java.io.Serializable + +public enum class KopyFunctions(public val value: String) : Serializable { + All(value = "all"), + Copy(value = "copy"), + Invoke(value = "invoke"), + ; + + public companion object { + + public const val NAME: String = "KopyFunctions" + public const val DESCRIPTION: String = "Kopy functions to be generated" + + public fun from(value: String): KopyFunctions = + when (value) { + All.name -> All + All.value -> All + Copy.name -> Copy + Copy.value -> Copy + Invoke.name -> Invoke + Invoke.value -> Invoke + else -> All + } + } +} diff --git a/kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctionsTest.kt b/kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctionsTest.kt new file mode 100644 index 0000000..0aa2ad4 --- /dev/null +++ b/kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyFunctionsTest.kt @@ -0,0 +1,18 @@ +package com.javiersc.kotlin.kopy.args + +import io.kotest.matchers.shouldBe +import kotlin.test.Test + +class KopyFunctionsTest { + + @Test + fun `kopy functions`() { + KopyFunctions.from("all") shouldBe KopyFunctions.All + KopyFunctions.from("All") shouldBe KopyFunctions.All + KopyFunctions.from("copy") shouldBe KopyFunctions.Copy + KopyFunctions.from("Copy") shouldBe KopyFunctions.Copy + KopyFunctions.from("invoke") shouldBe KopyFunctions.Invoke + KopyFunctions.from("Invoke") shouldBe KopyFunctions.Invoke + KopyFunctions.from("random") shouldBe KopyFunctions.All + } +} diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessor.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessor.kt index 78a05ee..59e7aa5 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessor.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessor.kt @@ -1,5 +1,6 @@ package com.javiersc.kotlin.kopy.compiler +import com.javiersc.kotlin.kopy.args.KopyFunctions import com.javiersc.kotlin.kopy.args.KopyVisibility import com.javiersc.kotlin.kopy.compiler.KopyCompilerProjectData.Group import com.javiersc.kotlin.kopy.compiler.KopyCompilerProjectData.Name @@ -7,6 +8,7 @@ import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption import org.jetbrains.kotlin.compiler.plugin.CliOption import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.CompilerConfigurationKey public class KopyCommandLineProcessor : CommandLineProcessor { @@ -14,6 +16,12 @@ public class KopyCommandLineProcessor : CommandLineProcessor { override val pluginOptions: Collection = listOf( + CliOption( + optionName = KopyFunctions.NAME, + valueDescription = KopyFunctions.DESCRIPTION, + description = KopyFunctions.DESCRIPTION, + required = true, + ), CliOption( optionName = KopyVisibility.NAME, valueDescription = KopyVisibility.DESCRIPTION, @@ -27,7 +35,12 @@ public class KopyCommandLineProcessor : CommandLineProcessor { value: String, configuration: CompilerConfiguration ) { - val kopyVisibility: KopyVisibility = KopyVisibility.from(value) - configuration.put(KopyKey.Visibility, kopyVisibility) + fun put(key: CompilerConfigurationKey, value: T) = + configuration.put(key, value) + + when (option.optionName) { + KopyFunctions.NAME -> put(KopyKey.Functions, KopyFunctions.from(value)) + KopyVisibility.NAME -> put(KopyKey.Visibility, KopyVisibility.from(value)) + } } } diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyKey.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyKey.kt index 371da1f..c0a5e8b 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyKey.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyKey.kt @@ -1,8 +1,10 @@ package com.javiersc.kotlin.kopy.compiler +import com.javiersc.kotlin.kopy.args.KopyFunctions import com.javiersc.kotlin.kopy.args.KopyVisibility import org.jetbrains.kotlin.config.CompilerConfigurationKey internal object KopyKey { val Visibility = CompilerConfigurationKey(KopyVisibility.NAME) + val Functions = CompilerConfigurationKey(KopyFunctions.NAME) } diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt index 648d09c..a5913b2 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt @@ -12,6 +12,7 @@ import com.javiersc.kotlin.kopy.KopyFunctionInvoke import com.javiersc.kotlin.kopy.KopyFunctionSet import com.javiersc.kotlin.kopy.KopyFunctionUpdate import com.javiersc.kotlin.kopy.KopyFunctionUpdateEach +import com.javiersc.kotlin.kopy.args.KopyFunctions import com.javiersc.kotlin.kopy.args.KopyVisibility import com.javiersc.kotlin.kopy.compiler.KopyKey import com.javiersc.kotlin.kopy.compiler.fir.Key @@ -67,6 +68,9 @@ internal class FirKopyDeclarationGenerationExtension( private val kopyVisibility: KopyVisibility get() = configuration.get(KopyKey.Visibility, KopyVisibility.Auto) + private val kopyFunctions: KopyFunctions + get() = configuration.get(KopyKey.Functions, KopyFunctions.All) + private val kopyOptInClassId: ClassId = "com.javiersc.kotlin.kopy.KopyOptIn".toClassId() private val kopyFunctionCopyClassId: ClassId = classId() private val kopyFunctionInvokeClassId: ClassId = classId() @@ -144,11 +148,15 @@ internal class FirKopyDeclarationGenerationExtension( if (!owner.hasAnnotation(classId(), session)) return@buildList if (!owner.isData) return@buildList - val copyFunction: FirNamedFunctionSymbol? = createCopyFun(callableId, owner) - if (copyFunction != null) add(copyFunction) + if (kopyFunctions == KopyFunctions.All || kopyFunctions == KopyFunctions.Copy) { + val copyFunction: FirNamedFunctionSymbol? = createCopyFun(callableId, owner) + if (copyFunction != null) add(copyFunction) + } - val invokeFunction: FirNamedFunctionSymbol? = createInvokeFun(callableId, owner) - if (invokeFunction != null) add(invokeFunction) + if (kopyFunctions == KopyFunctions.All || kopyFunctions == KopyFunctions.Invoke) { + val invokeFunction: FirNamedFunctionSymbol? = createInvokeFun(callableId, owner) + if (invokeFunction != null) add(invokeFunction) + } val setFunction: FirNamedFunctionSymbol? = createSetFun(callableId, owner) if (setFunction != null) add(setFunction) diff --git a/kopy-compiler/test-data/diagnostics-kopy-functions/all/all.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-functions/all/all.fir.txt new file mode 100644 index 0000000..3e23a10 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-functions/all/all.fir.txt @@ -0,0 +1,39 @@ +FILE: all.kt + package com.javiersc.kotlin.kopy.playground + + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo| { + super() + } + + public final val number: R|kotlin/Int| = R|/number| + public get(): R|kotlin/Int| + + public final val letter: R|kotlin/Char| = R|/letter| + public get(): R|kotlin/Char| + + public final operator fun component1(): R|kotlin/Int| + + public final operator fun component2(): R|kotlin/Char| + + public final fun copy(number: R|kotlin/Int| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.letter|): R|com/javiersc/kotlin/kopy/playground/Foo| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdate|() public final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + public final val _atomic: R|kotlinx/atomicfu/AtomicRef| + public get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() public final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() public final infix fun copy(copy: R|com/javiersc/kotlin/kopy/playground/Foo.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdateEach|() public final infix fun R|kotlin/collections/Iterable|.updateEach(transform: R|(UE) -> UE|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionInvoke|() public final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-functions/all/all.kt b/kopy-compiler/test-data/diagnostics-kopy-functions/all/all.kt new file mode 100644 index 0000000..74b77d9 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-functions/all/all.kt @@ -0,0 +1,9 @@ +// OPT_IN: com.javiersc.kotlin.kopy.KopyOptIn +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS + +package com.javiersc.kotlin.kopy.playground + +import com.javiersc.kotlin.kopy.Kopy + +@Kopy +data class Foo(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.fir.txt new file mode 100644 index 0000000..b2c56aa --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.fir.txt @@ -0,0 +1,36 @@ +FILE: copy.kt + package com.javiersc.kotlin.kopy.playground + + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo| { + super() + } + + public final val number: R|kotlin/Int| = R|/number| + public get(): R|kotlin/Int| + + public final val letter: R|kotlin/Char| = R|/letter| + public get(): R|kotlin/Char| + + public final operator fun component1(): R|kotlin/Int| + + public final operator fun component2(): R|kotlin/Char| + + public final fun copy(number: R|kotlin/Int| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.letter|): R|com/javiersc/kotlin/kopy/playground/Foo| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdate|() public final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + public final val _atomic: R|kotlinx/atomicfu/AtomicRef| + public get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() public final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() public final infix fun copy(copy: R|com/javiersc/kotlin/kopy/playground/Foo.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdateEach|() public final infix fun R|kotlin/collections/Iterable|.updateEach(transform: R|(UE) -> UE|): R|kotlin/Unit| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.kt b/kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.kt new file mode 100644 index 0000000..74b77d9 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-functions/copy/copy.kt @@ -0,0 +1,9 @@ +// OPT_IN: com.javiersc.kotlin.kopy.KopyOptIn +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS + +package com.javiersc.kotlin.kopy.playground + +import com.javiersc.kotlin.kopy.Kopy + +@Kopy +data class Foo(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.fir.txt new file mode 100644 index 0000000..b2439ae --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.fir.txt @@ -0,0 +1,36 @@ +FILE: invoke.kt + package com.javiersc.kotlin.kopy.playground + + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo| { + super() + } + + public final val number: R|kotlin/Int| = R|/number| + public get(): R|kotlin/Int| + + public final val letter: R|kotlin/Char| = R|/letter| + public get(): R|kotlin/Char| + + public final operator fun component1(): R|kotlin/Int| + + public final operator fun component2(): R|kotlin/Char| + + public final fun copy(number: R|kotlin/Int| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo|.R|com/javiersc/kotlin/kopy/playground/Foo.letter|): R|com/javiersc/kotlin/kopy/playground/Foo| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdate|() public final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + public final val _atomic: R|kotlinx/atomicfu/AtomicRef| + public get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() public final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdateEach|() public final infix fun R|kotlin/collections/Iterable|.updateEach(transform: R|(UE) -> UE|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionInvoke|() public final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.kt b/kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.kt new file mode 100644 index 0000000..74b77d9 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-functions/invoke/invoke.kt @@ -0,0 +1,9 @@ +// OPT_IN: com.javiersc.kotlin.kopy.KopyOptIn +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -MISSING_DEPENDENCY_CLASS -MISSING_DEPENDENCY_SUPERCLASS + +package com.javiersc.kotlin.kopy.playground + +import com.javiersc.kotlin.kopy.Kopy + +@Kopy +data class Foo(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyAllDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyAllDiagnosticTestGenerated.java new file mode 100644 index 0000000..29473d3 --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyAllDiagnosticTestGenerated.java @@ -0,0 +1,28 @@ + + +package com.javiersc.kotlin.kopy.compiler; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link com.javiersc.kotlin.kopy.compiler.GenerateKotlinCompilerTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("test-data/diagnostics-kopy-functions/all") +@TestDataPath("$PROJECT_ROOT") +public class KopyAllDiagnosticTestGenerated extends AbstractKopyAllDiagnosticTest { + @Test + @TestMetadata("all.kt") + public void testAll() { + runTest("test-data/diagnostics-kopy-functions/all/all.kt"); + } + + @Test + public void testAllFilesPresentInAll() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-functions/all"), Pattern.compile("^(.+)\\.kt$"), null, true); + } +} diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyCopyDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyCopyDiagnosticTestGenerated.java new file mode 100644 index 0000000..6244e7d --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyCopyDiagnosticTestGenerated.java @@ -0,0 +1,28 @@ + + +package com.javiersc.kotlin.kopy.compiler; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link com.javiersc.kotlin.kopy.compiler.GenerateKotlinCompilerTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("test-data/diagnostics-kopy-functions/copy") +@TestDataPath("$PROJECT_ROOT") +public class KopyCopyDiagnosticTestGenerated extends AbstractKopyCopyDiagnosticTest { + @Test + public void testAllFilesPresentInCopy() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-functions/copy"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("copy.kt") + public void testCopy() { + runTest("test-data/diagnostics-kopy-functions/copy/copy.kt"); + } +} diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyInvokeDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyInvokeDiagnosticTestGenerated.java new file mode 100644 index 0000000..4c2d760 --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/KopyInvokeDiagnosticTestGenerated.java @@ -0,0 +1,28 @@ + + +package com.javiersc.kotlin.kopy.compiler; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link com.javiersc.kotlin.kopy.compiler.GenerateKotlinCompilerTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("test-data/diagnostics-kopy-functions/invoke") +@TestDataPath("$PROJECT_ROOT") +public class KopyInvokeDiagnosticTestGenerated extends AbstractKopyInvokeDiagnosticTest { + @Test + public void testAllFilesPresentInInvoke() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-functions/invoke"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("invoke.kt") + public void testInvoke() { + runTest("test-data/diagnostics-kopy-functions/invoke/invoke.kt"); + } +} diff --git a/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt b/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt index cfdaaf4..8d49c22 100644 --- a/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt +++ b/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt @@ -3,6 +3,7 @@ package com.javiersc.kotlin.kopy.compiler import com.javiersc.kotlin.compiler.test.runners.BoxTest import com.javiersc.kotlin.compiler.test.runners.DiagnosticTest import com.javiersc.kotlin.compiler.test.services.MetaRuntimeClasspathProvider +import com.javiersc.kotlin.kopy.args.KopyFunctions import com.javiersc.kotlin.kopy.args.KopyVisibility import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration @@ -20,6 +21,9 @@ fun main() { testClass { model("diagnostics-kopy-visibility/2_internal") } testClass { model("diagnostics-kopy-visibility/3_protected") } testClass { model("diagnostics-kopy-visibility/4_private") } + testClass { model("diagnostics-kopy-functions/all") } + testClass { model("diagnostics-kopy-functions/copy") } + testClass { model("diagnostics-kopy-functions/invoke") } } } } @@ -119,3 +123,45 @@ open class AbstractKopy4PrivateDiagnosticTest : DiagnosticTest() { allExtensions(configuration) } } + +open class AbstractKopyAllDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Functions, KopyFunctions.All) + allExtensions(configuration) + } +} + +open class AbstractKopyCopyDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Functions, KopyFunctions.Copy) + allExtensions(configuration) + } +} + +open class AbstractKopyInvokeDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Functions, KopyFunctions.Invoke) + allExtensions(configuration) + } +} diff --git a/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessorTest.kt b/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessorTest.kt index 9f5861e..1f140fa 100644 --- a/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessorTest.kt +++ b/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCommandLineProcessorTest.kt @@ -1,6 +1,8 @@ package com.javiersc.kotlin.kopy.compiler +import com.javiersc.kotlin.kopy.args.KopyFunctions import com.javiersc.kotlin.kopy.args.KopyVisibility +import com.javiersc.kotlin.stdlib.second import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test @@ -16,7 +18,8 @@ class KopyCommandLineProcessorTest { @Test fun `check plugin options`() { val processor = KopyCommandLineProcessor() - processor.pluginOptions.shouldHaveSize(1) - processor.pluginOptions.first().optionName shouldBe KopyVisibility.NAME + processor.pluginOptions.shouldHaveSize(2) + processor.pluginOptions.first().optionName shouldBe KopyFunctions.NAME + processor.pluginOptions.second().optionName shouldBe KopyVisibility.NAME } } diff --git a/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyExtension.kt b/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyExtension.kt index 3b40079..071ab0e 100644 --- a/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyExtension.kt +++ b/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyExtension.kt @@ -1,5 +1,6 @@ package com.javiersc.kotlin.kopy.gradle.plugin +import com.javiersc.kotlin.kopy.args.KopyFunctions import com.javiersc.kotlin.kopy.args.KopyVisibility import javax.inject.Inject import org.gradle.api.model.ObjectFactory @@ -13,6 +14,9 @@ constructor( objects: ObjectFactory, ) { + public val functions: Property = + objects.property(KopyFunctions::class.java).convention(KopyFunctions.All) + public val visibility: Property = objects.property(KopyVisibility::class.java).convention(KopyVisibility.Auto) diff --git a/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePlugin.kt b/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePlugin.kt index 1bb34c6..21867e1 100644 --- a/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePlugin.kt +++ b/kopy-gradle-plugin/main/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePlugin.kt @@ -1,5 +1,6 @@ package com.javiersc.kotlin.kopy.gradle.plugin +import com.javiersc.kotlin.kopy.args.KopyFunctions import com.javiersc.kotlin.kopy.args.KopyVisibility import com.javiersc.kotlin.kopy.compiler.KopyCompilerProjectData import javax.inject.Inject @@ -36,6 +37,10 @@ constructor( val kopy: KopyExtension = kotlinCompilation.project.the() return providers.provider { listOf( + SubpluginOption( + key = KopyFunctions.NAME, + value = kopy.functions.get().value, + ), SubpluginOption( key = KopyVisibility.NAME, value = kopy.visibility.get().value,