From 9a3951cb2b527e6b061954285974e6459f00e090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Segovia=20C=C3=B3rdoba?= Date: Mon, 19 Aug 2024 23:16:43 +0200 Subject: [PATCH] Add `KopyVisibility` to set the visibility of the generated functions --- CHANGELOG.md | 2 + README.md | 44 +++++++++- kopy-args/build.gradle.kts | 30 +++++++ .../kotlin/kopy/args/KopyVisibility.kt | 36 ++++++++ .../kotlin/kopy/args/KopyVisibilityTest.kt | 22 +++++ kopy-compiler/build.gradle.kts | 1 + .../kopy/compiler/KopyCommandLineProcessor.kt | 24 +++-- .../javiersc/kotlin/kopy/compiler/KopyKey.kt | 8 ++ .../kopy/compiler/fir/FirKopyExtension.kt | 3 +- .../FirKopyDeclarationGenerationExtension.kt | 46 +++++++++- .../0_auto/internal.fir.txt | 46 ++++++++++ .../0_auto/internal.kt | 17 ++++ .../0_auto/private.fir.txt | 46 ++++++++++ .../0_auto/private.kt | 17 ++++ .../0_auto/protected.fir.txt | 46 ++++++++++ .../0_auto/protected.kt | 17 ++++ .../0_auto/public.fir.txt | 87 +++++++++++++++++++ .../0_auto/public.kt | 24 +++++ .../1_public/internal.fir.txt | 46 ++++++++++ .../1_public/internal.kt | 17 ++++ .../1_public/private.fir.txt | 46 ++++++++++ .../1_public/private.kt | 17 ++++ .../1_public/protected.fir.txt | 46 ++++++++++ .../1_public/protected.kt | 17 ++++ .../1_public/public.fir.txt | 87 +++++++++++++++++++ .../1_public/public.kt | 24 +++++ .../2_internal/internal.fir.txt | 46 ++++++++++ .../2_internal/internal.kt | 17 ++++ .../2_internal/private.fir.txt | 46 ++++++++++ .../2_internal/private.kt | 17 ++++ .../2_internal/protected.fir.txt | 46 ++++++++++ .../2_internal/protected.kt | 17 ++++ .../2_internal/public.fir.txt | 87 +++++++++++++++++++ .../2_internal/public.kt | 24 +++++ .../3_protected/internal.fir.txt | 46 ++++++++++ .../3_protected/internal.kt | 17 ++++ .../3_protected/private.fir.txt | 46 ++++++++++ .../3_protected/private.kt | 17 ++++ .../3_protected/protected.fir.txt | 46 ++++++++++ .../3_protected/protected.kt | 17 ++++ .../3_protected/public.fir.txt | 87 +++++++++++++++++++ .../3_protected/public.kt | 24 +++++ .../4_private/internal.fir.txt | 46 ++++++++++ .../4_private/internal.kt | 17 ++++ .../4_private/private.fir.txt | 46 ++++++++++ .../4_private/private.kt | 17 ++++ .../4_private/protected.fir.txt | 46 ++++++++++ .../4_private/protected.kt | 17 ++++ .../4_private/public.fir.txt | 87 +++++++++++++++++++ .../4_private/public.kt | 24 +++++ .../diagnostics/visibility/internal.fir.txt | 46 ++++++++++ .../diagnostics/visibility/internal.kt | 17 ++++ .../diagnostics/visibility/private.fir.txt | 46 ++++++++++ .../diagnostics/visibility/private.kt | 17 ++++ .../diagnostics/visibility/protected.fir.txt | 46 ++++++++++ .../diagnostics/visibility/protected.kt | 17 ++++ .../diagnostics/visibility/public.fir.txt | 87 +++++++++++++++++++ .../diagnostics/visibility/public.kt | 24 +++++ .../compiler/DiagnosticTestGenerated.java | 34 ++++++++ .../Kopy0AutoDiagnosticTestGenerated.java | 46 ++++++++++ .../Kopy1PublicDiagnosticTestGenerated.java | 46 ++++++++++ .../Kopy2InternalDiagnosticTestGenerated.java | 46 ++++++++++ ...Kopy3ProtectedDiagnosticTestGenerated.java | 46 ++++++++++ .../Kopy4PrivateDiagnosticTestGenerated.java | 46 ++++++++++ .../compiler/GenerateKotlinCompilerTests.kt | 85 +++++++++++++++++- .../compiler/KopyCommandLineProcessorTest.kt | 6 +- kopy-gradle-plugin/build.gradle.kts | 1 + .../kopy/gradle/plugin/KopyExtension.kt | 5 ++ .../kopy/gradle/plugin/KopyGradlePlugin.kt | 18 +++- .../gradle/plugin/KopyGradlePluginTest.kt | 12 +++ .../private-visibility/build.gradle.kts | 15 ++++ .../private-visibility/settings.gradle.kts | 26 ++++++ .../src/main/kotlin/main.kt | 30 +++++++ 73 files changed, 2453 insertions(+), 25 deletions(-) create mode 100644 kopy-args/build.gradle.kts create mode 100644 kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibility.kt create mode 100644 kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibilityTest.kt create mode 100644 kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyKey.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/internal.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/internal.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/private.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/private.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/protected.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/protected.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/internal.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/internal.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/private.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/private.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/protected.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/protected.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/internal.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/internal.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/private.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/private.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/protected.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/protected.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/internal.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/internal.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/private.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/private.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/protected.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/protected.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/internal.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/internal.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/private.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/private.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/protected.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/protected.kt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.kt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/internal.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/internal.kt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/private.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/private.kt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/protected.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/protected.kt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/public.fir.txt create mode 100644 kopy-compiler/test-data/diagnostics/visibility/public.kt create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy0AutoDiagnosticTestGenerated.java create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy1PublicDiagnosticTestGenerated.java create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy2InternalDiagnosticTestGenerated.java create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy3ProtectedDiagnosticTestGenerated.java create mode 100644 kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy4PrivateDiagnosticTestGenerated.java create mode 100644 kopy-gradle-plugin/testFunctional/resources/private-visibility/build.gradle.kts create mode 100644 kopy-gradle-plugin/testFunctional/resources/private-visibility/settings.gradle.kts create mode 100644 kopy-gradle-plugin/testFunctional/resources/private-visibility/src/main/kotlin/main.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 168effd..bbd6fc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Added +- `KopyVisibility` to set the visibility of the generated functions + ### Changed ### Deprecated diff --git a/README.md b/README.md index 710ecbd..1da89d7 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,49 @@ Apply the plugin in the `build.gradle.kts` or `build.gradle`: ```kotlin plugins { - id("com.javiersc.kotlin.kopy") version $version + id("com.javiersc.kotlin.kopy") version "$version" +} +``` + +### Plugin configurations + +The extension `kopy` is available to configure the plugin: + +#### Visibility + +The `visibility` option allows changing the visibility of the `copy` and `invoke` functions. The +default value is `Auto`, which uses the same visibility the primary constructor has, as the original +`copy` function does after Kotlin 2.0.20. + +Possible values: + +- `KopyVisibility.Auto` +- `KopyVisibility.Public` +- `KopyVisibility.Internal` +- `KopyVisibility.Protected` +- `KopyVisibility.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 +`internal`. The original `copy` function would be `public` or `internal` respectively, and the Kopy +functions would be `private`. + +> **Note** +> +> If the primary constructor visibility is more restrictive than the specified visibility, the +> primary constructor one is used. + +##### Example + +```kotlin +import com.javiersc.kotlin.kopy.args.KopyVisibility + +plugins { + id("com.javiersc.kotlin.kopy") version "$version" +} + +kopy { + visibility = KopyVisibility.Private } ``` diff --git a/kopy-args/build.gradle.kts b/kopy-args/build.gradle.kts new file mode 100644 index 0000000..309b77d --- /dev/null +++ b/kopy-args/build.gradle.kts @@ -0,0 +1,30 @@ +hubdle { + config { + analysis() + coverage() + documentation { // + api() + } + explicitApi() + format.isEnabled = false + publishing { + maven { + repositories { // + mavenLocalTest() + } + } + } + } + kotlin { + multiplatform { + common { + main { + dependencies { // + implementation(hubdle.jetbrains.kotlinx.atomicfu) + } + } + } + jvm() + } + } +} diff --git a/kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibility.kt b/kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibility.kt new file mode 100644 index 0000000..7e5a18a --- /dev/null +++ b/kopy-args/common/main/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibility.kt @@ -0,0 +1,36 @@ +package com.javiersc.kotlin.kopy.args + +import java.io.Serializable + +public enum class KopyVisibility( + public val value: String, + public val restrictive: Int, +) : Serializable { + Auto(value = "auto", restrictive = 0), + Public(value = "public", restrictive = 1), + Internal(value = "internal", restrictive = 2), + Protected(value = "protected", restrictive = 3), + Private(value = "private", restrictive = 4), + ; + + public companion object { + + public const val NAME: String = "KopyVisibility" + public const val DESCRIPTION: String = "Visibility of the generated copy function" + + public fun from(value: String): KopyVisibility = + when (value) { + Auto.name -> Auto + Auto.value -> Auto + Public.name -> Public + Public.value -> Public + Internal.name -> Internal + Internal.value -> Internal + Protected.name -> Protected + Protected.value -> Protected + Private.name -> Private + Private.value -> Private + else -> Auto + } + } +} diff --git a/kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibilityTest.kt b/kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibilityTest.kt new file mode 100644 index 0000000..51572f8 --- /dev/null +++ b/kopy-args/common/test/kotlin/com/javiersc/kotlin/kopy/args/KopyVisibilityTest.kt @@ -0,0 +1,22 @@ +package com.javiersc.kotlin.kopy.args + +import io.kotest.matchers.shouldBe +import kotlin.test.Test + +class KopyVisibilityTest { + + @Test + fun `kopy visibility`() { + KopyVisibility.from("auto") shouldBe KopyVisibility.Auto + KopyVisibility.from("Auto") shouldBe KopyVisibility.Auto + KopyVisibility.from("public") shouldBe KopyVisibility.Public + KopyVisibility.from("Public") shouldBe KopyVisibility.Public + KopyVisibility.from("internal") shouldBe KopyVisibility.Internal + KopyVisibility.from("Internal") shouldBe KopyVisibility.Internal + KopyVisibility.from("protected") shouldBe KopyVisibility.Protected + KopyVisibility.from("Protected") shouldBe KopyVisibility.Protected + KopyVisibility.from("private") shouldBe KopyVisibility.Private + KopyVisibility.from("Private") shouldBe KopyVisibility.Private + KopyVisibility.from("random") shouldBe KopyVisibility.Auto + } +} diff --git a/kopy-compiler/build.gradle.kts b/kopy-compiler/build.gradle.kts index 5cc43a5..934bc4c 100644 --- a/kopy-compiler/build.gradle.kts +++ b/kopy-compiler/build.gradle.kts @@ -42,6 +42,7 @@ hubdle { main { // dependencies { // implementation(hubdle.javiersc.kotlin.compiler.extensions) + implementation(projects.kopyArgs) implementation(projects.kopyRuntime) } } 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 4c55027..78a05ee 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,8 +1,10 @@ package com.javiersc.kotlin.kopy.compiler +import com.javiersc.kotlin.kopy.args.KopyVisibility import com.javiersc.kotlin.kopy.compiler.KopyCompilerProjectData.Group import com.javiersc.kotlin.kopy.compiler.KopyCompilerProjectData.Name 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 @@ -12,12 +14,12 @@ public class KopyCommandLineProcessor : CommandLineProcessor { override val pluginOptions: Collection = listOf( - // CliOption( - // optionName = ..., - // valueDescription = ..., - // description = ..., - // required = true, - // ), + CliOption( + optionName = KopyVisibility.NAME, + valueDescription = KopyVisibility.DESCRIPTION, + description = KopyVisibility.DESCRIPTION, + required = true, + ), ) override fun processOption( @@ -25,13 +27,7 @@ public class KopyCommandLineProcessor : CommandLineProcessor { value: String, configuration: CompilerConfiguration ) { - // when (option.optionName) { - // ... -> { - // configuration.put(..., value) - // } - // else -> { - // error("Unexpected config option: ${option.optionName}") - // } - // } + val kopyVisibility: KopyVisibility = KopyVisibility.from(value) + configuration.put(KopyKey.Visibility, kopyVisibility) } } 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 new file mode 100644 index 0000000..371da1f --- /dev/null +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyKey.kt @@ -0,0 +1,8 @@ +package com.javiersc.kotlin.kopy.compiler + +import com.javiersc.kotlin.kopy.args.KopyVisibility +import org.jetbrains.kotlin.config.CompilerConfigurationKey + +internal object KopyKey { + val Visibility = CompilerConfigurationKey(KopyVisibility.NAME) +} diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/FirKopyExtension.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/FirKopyExtension.kt index 0c520ae..a0c1d4b 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/FirKopyExtension.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/FirKopyExtension.kt @@ -5,6 +5,7 @@ import com.javiersc.kotlin.kopy.compiler.fir.generation.FirKopyAssignExpressionA import com.javiersc.kotlin.kopy.compiler.fir.generation.FirKopyDeclarationGenerationExtension import org.jetbrains.kotlin.GeneratedDeclarationKey import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar internal class FirKopyExtension( @@ -22,7 +23,7 @@ internal class FirKopyExtension( private fun ExtensionRegistrarContext.registerGenerators() { +::FirKopyAssignExpressionAltererExtension - +::FirKopyDeclarationGenerationExtension + +{ session: FirSession -> FirKopyDeclarationGenerationExtension(session, configuration) } } } 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 d662a3e..648d09c 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,13 +12,20 @@ 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.KopyVisibility +import com.javiersc.kotlin.kopy.compiler.KopyKey import com.javiersc.kotlin.kopy.compiler.fir.Key +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.primaryConstructorSymbol import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.hasAnnotation import org.jetbrains.kotlin.fir.declarations.utils.isData +import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.builder.buildEmptyExpressionBlock import org.jetbrains.kotlin.fir.extensions.FirDeclarationGenerationExtension @@ -28,7 +35,6 @@ import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate import org.jetbrains.kotlin.fir.plugin.createMemberFunction import org.jetbrains.kotlin.fir.plugin.createMemberProperty import org.jetbrains.kotlin.fir.resolve.defaultType -import org.jetbrains.kotlin.fir.resolve.fqName import org.jetbrains.kotlin.fir.resolve.providers.getRegularClassSymbolByClassId import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor @@ -55,8 +61,12 @@ import org.jetbrains.kotlin.name.StandardClassIds internal class FirKopyDeclarationGenerationExtension( session: FirSession, + private val configuration: CompilerConfiguration, ) : FirDeclarationGenerationExtension(session) { + private val kopyVisibility: KopyVisibility + get() = configuration.get(KopyKey.Visibility, KopyVisibility.Auto) + private val kopyOptInClassId: ClassId = "com.javiersc.kotlin.kopy.KopyOptIn".toClassId() private val kopyFunctionCopyClassId: ClassId = classId() private val kopyFunctionInvokeClassId: ClassId = classId() @@ -120,6 +130,7 @@ internal class FirKopyDeclarationGenerationExtension( config = { status { isOverride = false } modality = Modality.FINAL + visibility = calculateVisibility(owner) }, ) return listOf(atomicProperty.symbol) @@ -197,6 +208,7 @@ internal class FirKopyDeclarationGenerationExtension( isInfix = true } modality = Modality.FINAL + visibility = calculateVisibility(owner) this.extensionReceiverType { typeParameters -> typeParameters.first().toConeType() } @@ -238,6 +250,7 @@ internal class FirKopyDeclarationGenerationExtension( isInfix = true } modality = Modality.FINAL + visibility = calculateVisibility(owner) this.extensionReceiverType { typeParameters -> typeParameters.first().toConeType() } @@ -297,6 +310,7 @@ internal class FirKopyDeclarationGenerationExtension( isInfix = true } modality = Modality.FINAL + visibility = calculateVisibility(owner) this.extensionReceiverType { typeParameters -> val typeParamsAsConeType: List = typeParameters.map { it.toConeType() } @@ -356,6 +370,7 @@ internal class FirKopyDeclarationGenerationExtension( isOperator = callableId.callableName == invokeName } modality = Modality.FINAL + visibility = calculateVisibility(owner) valueParameter(copyName, copyValueParameterType) }, ) @@ -386,6 +401,35 @@ internal class FirKopyDeclarationGenerationExtension( ?.fir ?.symbol ?.toFirTypeRef()?.let(::createFirAnnotation) + + private fun calculateVisibility(classSymbol: FirClassSymbol<*>): Visibility { + val visibility: Visibility = + classSymbol.primaryConstructorSymbol(session)?.visibility ?: return Visibilities.Public + val isMoreRestrictive: Boolean = kopyVisibility.isMoreRestrictedThan(visibility) + return if (isMoreRestrictive) kopyVisibility.toVisibility(visibility) + else visibility + } + + private fun KopyVisibility.toVisibility(defaultVisibility: Visibility): Visibility = + when (this) { + KopyVisibility.Auto -> defaultVisibility + KopyVisibility.Public -> Visibilities.Public + KopyVisibility.Internal -> Visibilities.Internal + KopyVisibility.Protected -> Visibilities.Protected + KopyVisibility.Private -> Visibilities.Private + } + + private fun KopyVisibility.isMoreRestrictedThan(visibility: Visibility): Boolean = + this.restrictive > visibility.restrictive + + private val Visibility.restrictive: Int + get() = when (this) { + Visibilities.Public -> 1 + Visibilities.Internal -> 2 + Visibilities.Protected -> 3 + Visibilities.Private -> 4 + else -> 5 + } } private fun FirSession.substitutor( diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/internal.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/internal.fir.txt new file mode 100644 index 0000000..033dbe8 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/internal.fir.txt @@ -0,0 +1,46 @@ +FILE: internal.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + internal 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|() internal final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + internal final val _atomic: R|kotlinx/atomicfu/AtomicRef| + internal get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() internal final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() internal 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|() internal 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|() internal 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-visibility/0_auto/internal.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/internal.kt new file mode 100644 index 0000000..6eb7993 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/internal.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo internal constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/private.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/private.fir.txt new file mode 100644 index 0000000..1660f19 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/private.fir.txt @@ -0,0 +1,46 @@ +FILE: private.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + private 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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-visibility/0_auto/private.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/private.kt new file mode 100644 index 0000000..689b2f3 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/private.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo private constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/protected.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/protected.fir.txt new file mode 100644 index 0000000..087dcfa --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/protected.fir.txt @@ -0,0 +1,46 @@ +FILE: protected.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + protected 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|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected 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|() protected 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|() protected 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-visibility/0_auto/protected.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/protected.kt new file mode 100644 index 0000000..72e3fde --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/protected.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo protected constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.fir.txt new file mode 100644 index 0000000..d97ef7c --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.fir.txt @@ -0,0 +1,87 @@ +FILE: public.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo2: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|com/javiersc/kotlin/kopy/playground/Foo2.Foo2|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + lval foo22: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|/foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo2|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|).R|com/javiersc/kotlin/kopy/playground/Foo2.set|(Int(42)) + } + ) + } + @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| { + } + + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo2 : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + 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/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.letter|): R|com/javiersc/kotlin/kopy/playground/Foo2| + + @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/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + @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/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.kt new file mode 100644 index 0000000..85223f7 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/0_auto/public.kt @@ -0,0 +1,24 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + val foo2 = Foo2(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } + val foo22 = foo2 copy { + number = 42 + } +} + +@Kopy +data class Foo(val number: Int, val letter: Char) + +@Kopy +data class Foo2 public constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/internal.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/internal.fir.txt new file mode 100644 index 0000000..033dbe8 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/internal.fir.txt @@ -0,0 +1,46 @@ +FILE: internal.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + internal 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|() internal final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + internal final val _atomic: R|kotlinx/atomicfu/AtomicRef| + internal get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() internal final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() internal 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|() internal 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|() internal 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-visibility/1_public/internal.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/internal.kt new file mode 100644 index 0000000..6eb7993 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/internal.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo internal constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/private.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/private.fir.txt new file mode 100644 index 0000000..1660f19 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/private.fir.txt @@ -0,0 +1,46 @@ +FILE: private.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + private 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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-visibility/1_public/private.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/private.kt new file mode 100644 index 0000000..689b2f3 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/private.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo private constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/protected.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/protected.fir.txt new file mode 100644 index 0000000..087dcfa --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/protected.fir.txt @@ -0,0 +1,46 @@ +FILE: protected.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + protected 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|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected 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|() protected 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|() protected 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-visibility/1_public/protected.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/protected.kt new file mode 100644 index 0000000..72e3fde --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/protected.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo protected constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.fir.txt new file mode 100644 index 0000000..d97ef7c --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.fir.txt @@ -0,0 +1,87 @@ +FILE: public.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo2: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|com/javiersc/kotlin/kopy/playground/Foo2.Foo2|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + lval foo22: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|/foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo2|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|).R|com/javiersc/kotlin/kopy/playground/Foo2.set|(Int(42)) + } + ) + } + @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| { + } + + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo2 : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + 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/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.letter|): R|com/javiersc/kotlin/kopy/playground/Foo2| + + @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/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + @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/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.kt new file mode 100644 index 0000000..85223f7 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/1_public/public.kt @@ -0,0 +1,24 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + val foo2 = Foo2(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } + val foo22 = foo2 copy { + number = 42 + } +} + +@Kopy +data class Foo(val number: Int, val letter: Char) + +@Kopy +data class Foo2 public constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/internal.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/internal.fir.txt new file mode 100644 index 0000000..033dbe8 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/internal.fir.txt @@ -0,0 +1,46 @@ +FILE: internal.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + internal 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|() internal final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + internal final val _atomic: R|kotlinx/atomicfu/AtomicRef| + internal get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() internal final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() internal 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|() internal 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|() internal 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-visibility/2_internal/internal.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/internal.kt new file mode 100644 index 0000000..6eb7993 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/internal.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo internal constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/private.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/private.fir.txt new file mode 100644 index 0000000..1660f19 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/private.fir.txt @@ -0,0 +1,46 @@ +FILE: private.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + private 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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-visibility/2_internal/private.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/private.kt new file mode 100644 index 0000000..689b2f3 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/private.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo private constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/protected.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/protected.fir.txt new file mode 100644 index 0000000..087dcfa --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/protected.fir.txt @@ -0,0 +1,46 @@ +FILE: protected.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + protected 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|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected 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|() protected 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|() protected 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-visibility/2_internal/protected.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/protected.kt new file mode 100644 index 0000000..72e3fde --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/protected.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo protected constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.fir.txt new file mode 100644 index 0000000..b96f88e --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.fir.txt @@ -0,0 +1,87 @@ +FILE: public.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo2: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|com/javiersc/kotlin/kopy/playground/Foo2.Foo2|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + lval foo22: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|/foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo2|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|).R|com/javiersc/kotlin/kopy/playground/Foo2.set|(Int(42)) + } + ) + } + @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|() internal final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + internal final val _atomic: R|kotlinx/atomicfu/AtomicRef| + internal get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() internal final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() internal 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|() internal 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|() internal final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo| { + } + + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo2 : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + 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/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.letter|): R|com/javiersc/kotlin/kopy/playground/Foo2| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdate|() internal final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + internal final val _atomic: R|kotlinx/atomicfu/AtomicRef| + internal get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() internal final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() internal final infix fun copy(copy: R|com/javiersc/kotlin/kopy/playground/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdateEach|() internal 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|() internal final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.kt new file mode 100644 index 0000000..85223f7 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/2_internal/public.kt @@ -0,0 +1,24 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + val foo2 = Foo2(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } + val foo22 = foo2 copy { + number = 42 + } +} + +@Kopy +data class Foo(val number: Int, val letter: Char) + +@Kopy +data class Foo2 public constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/internal.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/internal.fir.txt new file mode 100644 index 0000000..65615e1 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/internal.fir.txt @@ -0,0 +1,46 @@ +FILE: internal.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + internal 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|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected 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|() protected 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|() protected 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-visibility/3_protected/internal.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/internal.kt new file mode 100644 index 0000000..fdbbd89 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/internal.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo internal constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/private.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/private.fir.txt new file mode 100644 index 0000000..1660f19 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/private.fir.txt @@ -0,0 +1,46 @@ +FILE: private.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + private 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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-visibility/3_protected/private.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/private.kt new file mode 100644 index 0000000..689b2f3 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/private.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo private constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/protected.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/protected.fir.txt new file mode 100644 index 0000000..087dcfa --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/protected.fir.txt @@ -0,0 +1,46 @@ +FILE: protected.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + protected 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|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected 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|() protected 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|() protected 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-visibility/3_protected/protected.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/protected.kt new file mode 100644 index 0000000..72e3fde --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/protected.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo protected constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.fir.txt new file mode 100644 index 0000000..51646eb --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.fir.txt @@ -0,0 +1,87 @@ +FILE: public.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo2: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|com/javiersc/kotlin/kopy/playground/Foo2.Foo2|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + lval foo22: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|/foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo2|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|).R|com/javiersc/kotlin/kopy/playground/Foo2.set#|(Int(42)) + } + ) + } + @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|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected 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|() protected 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|() protected final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo| { + } + + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo2 : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + 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/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.letter|): R|com/javiersc/kotlin/kopy/playground/Foo2| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdate|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected final infix fun copy(copy: R|com/javiersc/kotlin/kopy/playground/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdateEach|() protected 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|() protected final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.kt new file mode 100644 index 0000000..f1b6f23 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/3_protected/public.kt @@ -0,0 +1,24 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + val foo2 = Foo2(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } + val foo22 = foo2 copy { + number = 42 + } +} + +@Kopy +data class Foo(val number: Int, val letter: Char) + +@Kopy +data class Foo2 public constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/internal.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/internal.fir.txt new file mode 100644 index 0000000..de47afb --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/internal.fir.txt @@ -0,0 +1,46 @@ +FILE: internal.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + internal 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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-visibility/4_private/internal.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/internal.kt new file mode 100644 index 0000000..fdbbd89 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/internal.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo internal constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/private.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/private.fir.txt new file mode 100644 index 0000000..1660f19 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/private.fir.txt @@ -0,0 +1,46 @@ +FILE: private.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + private 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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-visibility/4_private/private.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/private.kt new file mode 100644 index 0000000..689b2f3 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/private.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo private constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/protected.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/protected.fir.txt new file mode 100644 index 0000000..8e9e953 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/protected.fir.txt @@ -0,0 +1,46 @@ +FILE: protected.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + protected 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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-visibility/4_private/protected.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/protected.kt new file mode 100644 index 0000000..72e3fde --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/protected.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo protected constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.fir.txt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.fir.txt new file mode 100644 index 0000000..ed9083d --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.fir.txt @@ -0,0 +1,87 @@ +FILE: public.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo2: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|com/javiersc/kotlin/kopy/playground/Foo2.Foo2|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + lval foo22: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|/foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo2|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|).R|com/javiersc/kotlin/kopy/playground/Foo2.set#|(Int(42)) + } + ) + } + @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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo| { + } + + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo2 : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + 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/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.letter|): R|com/javiersc/kotlin/kopy/playground/Foo2| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdate|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private final infix fun copy(copy: R|com/javiersc/kotlin/kopy/playground/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionUpdateEach|() private 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|() private final operator infix fun invoke(copy: R|com/javiersc/kotlin/kopy/playground/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.kt b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.kt new file mode 100644 index 0000000..f1b6f23 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics-kopy-visibility/4_private/public.kt @@ -0,0 +1,24 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + val foo2 = Foo2(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } + val foo22 = foo2 copy { + number = 42 + } +} + +@Kopy +data class Foo(val number: Int, val letter: Char) + +@Kopy +data class Foo2 public constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics/visibility/internal.fir.txt b/kopy-compiler/test-data/diagnostics/visibility/internal.fir.txt new file mode 100644 index 0000000..033dbe8 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/internal.fir.txt @@ -0,0 +1,46 @@ +FILE: internal.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + internal 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|() internal final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + internal final val _atomic: R|kotlinx/atomicfu/AtomicRef| + internal get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() internal final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() internal 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|() internal 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|() internal 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/visibility/internal.kt b/kopy-compiler/test-data/diagnostics/visibility/internal.kt new file mode 100644 index 0000000..6eb7993 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/internal.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo internal constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics/visibility/private.fir.txt b/kopy-compiler/test-data/diagnostics/visibility/private.fir.txt new file mode 100644 index 0000000..1660f19 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/private.fir.txt @@ -0,0 +1,46 @@ +FILE: private.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + private 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|() private final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + private final val _atomic: R|kotlinx/atomicfu/AtomicRef| + private get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() private final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() private 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|() private 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|() private 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/visibility/private.kt b/kopy-compiler/test-data/diagnostics/visibility/private.kt new file mode 100644 index 0000000..689b2f3 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/private.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo private constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics/visibility/protected.fir.txt b/kopy-compiler/test-data/diagnostics/visibility/protected.fir.txt new file mode 100644 index 0000000..087dcfa --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/protected.fir.txt @@ -0,0 +1,46 @@ +FILE: protected.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo#|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy#|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set#|(Int(42)) + } + ) + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo : R|kotlin/Any| { + protected 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|() protected final infix fun R|U|.update(transform: R|(U) -> U|): R|kotlin/Unit| { + } + + protected final val _atomic: R|kotlinx/atomicfu/AtomicRef| + protected get(): R|kotlinx/atomicfu/AtomicRef| + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionSet|() protected final infix fun R|S|.set(other: R|S|): R|kotlin/Unit| { + } + + @R|com/javiersc/kotlin/kopy/KopyOptIn|() @R|com/javiersc/kotlin/kopy/KopyFunctionCopy|() protected 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|() protected 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|() protected 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/visibility/protected.kt b/kopy-compiler/test-data/diagnostics/visibility/protected.kt new file mode 100644 index 0000000..72e3fde --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/protected.kt @@ -0,0 +1,17 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } +} + +@Kopy +data class Foo protected constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-data/diagnostics/visibility/public.fir.txt b/kopy-compiler/test-data/diagnostics/visibility/public.fir.txt new file mode 100644 index 0000000..d97ef7c --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/public.fir.txt @@ -0,0 +1,87 @@ +FILE: public.kt + package com.javiersc.kotlin.kopy.playground + + public final fun diagnostics(): R|kotlin/Unit| { + lval foo1: R|com/javiersc/kotlin/kopy/playground/Foo| = R|com/javiersc/kotlin/kopy/playground/Foo.Foo|(Int(7), Char(W)) + lval foo2: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|com/javiersc/kotlin/kopy/playground/Foo2.Foo2|(Int(7), Char(W)) + lval foo21: R|com/javiersc/kotlin/kopy/playground/Foo| = R|/foo1|.R|com/javiersc/kotlin/kopy/playground/Foo.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo.number|).R|com/javiersc/kotlin/kopy/playground/Foo.set|(Int(42)) + } + ) + lval foo22: R|com/javiersc/kotlin/kopy/playground/Foo2| = R|/foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.copy|(copy@fun R|com/javiersc/kotlin/kopy/playground/Foo2|.(): R|kotlin/Unit| { + (this@R|special/anonymous|, this@R|special/anonymous|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|).R|com/javiersc/kotlin/kopy/playground/Foo2.set|(Int(42)) + } + ) + } + @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| { + } + + } + @R|com/javiersc/kotlin/kopy/Kopy|() public final data class Foo2 : R|kotlin/Any| { + public constructor(number: R|kotlin/Int|, letter: R|kotlin/Char|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + 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/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.number|, letter: R|kotlin/Char| = this@R|com/javiersc/kotlin/kopy/playground/Foo2|.R|com/javiersc/kotlin/kopy/playground/Foo2.letter|): R|com/javiersc/kotlin/kopy/playground/Foo2| + + @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/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + @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/Foo2.() -> kotlin/Unit|): R|com/javiersc/kotlin/kopy/playground/Foo2| { + } + + } diff --git a/kopy-compiler/test-data/diagnostics/visibility/public.kt b/kopy-compiler/test-data/diagnostics/visibility/public.kt new file mode 100644 index 0000000..85223f7 --- /dev/null +++ b/kopy-compiler/test-data/diagnostics/visibility/public.kt @@ -0,0 +1,24 @@ +// 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 + +fun diagnostics() { + val foo1 = Foo(number = 7, letter = 'W') + val foo2 = Foo2(number = 7, letter = 'W') + + val foo21 = foo1 copy { + number = 42 + } + val foo22 = foo2 copy { + number = 42 + } +} + +@Kopy +data class Foo(val number: Int, val letter: Char) + +@Kopy +data class Foo2 public constructor(val number: Int, val letter: Char) diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/DiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/DiagnosticTestGenerated.java index 4fd22bd..17b29e8 100644 --- a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/DiagnosticTestGenerated.java +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/DiagnosticTestGenerated.java @@ -256,4 +256,38 @@ public void testSimple_no_nest_copy_deep_set() { runTest("test-data/diagnostics/valid/simple-no-nest-copy-deep-set.kt"); } } + + @Nested + @TestMetadata("test-data/diagnostics/visibility") + @TestDataPath("$PROJECT_ROOT") + public class Visibility { + @Test + public void testAllFilesPresentInVisibility() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics/visibility"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("internal.kt") + public void testInternal() { + runTest("test-data/diagnostics/visibility/internal.kt"); + } + + @Test + @TestMetadata("private.kt") + public void testPrivate() { + runTest("test-data/diagnostics/visibility/private.kt"); + } + + @Test + @TestMetadata("protected.kt") + public void testProtected() { + runTest("test-data/diagnostics/visibility/protected.kt"); + } + + @Test + @TestMetadata("public.kt") + public void testPublic() { + runTest("test-data/diagnostics/visibility/public.kt"); + } + } } diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy0AutoDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy0AutoDiagnosticTestGenerated.java new file mode 100644 index 0000000..27348bb --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy0AutoDiagnosticTestGenerated.java @@ -0,0 +1,46 @@ + + +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-visibility/0_auto") +@TestDataPath("$PROJECT_ROOT") +public class Kopy0AutoDiagnosticTestGenerated extends AbstractKopy0AutoDiagnosticTest { + @Test + public void testAllFilesPresentIn0_auto() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-visibility/0_auto"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("internal.kt") + public void testInternal() { + runTest("test-data/diagnostics-kopy-visibility/0_auto/internal.kt"); + } + + @Test + @TestMetadata("private.kt") + public void testPrivate() { + runTest("test-data/diagnostics-kopy-visibility/0_auto/private.kt"); + } + + @Test + @TestMetadata("protected.kt") + public void testProtected() { + runTest("test-data/diagnostics-kopy-visibility/0_auto/protected.kt"); + } + + @Test + @TestMetadata("public.kt") + public void testPublic() { + runTest("test-data/diagnostics-kopy-visibility/0_auto/public.kt"); + } +} diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy1PublicDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy1PublicDiagnosticTestGenerated.java new file mode 100644 index 0000000..206426f --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy1PublicDiagnosticTestGenerated.java @@ -0,0 +1,46 @@ + + +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-visibility/1_public") +@TestDataPath("$PROJECT_ROOT") +public class Kopy1PublicDiagnosticTestGenerated extends AbstractKopy1PublicDiagnosticTest { + @Test + public void testAllFilesPresentIn1_public() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-visibility/1_public"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("internal.kt") + public void testInternal() { + runTest("test-data/diagnostics-kopy-visibility/1_public/internal.kt"); + } + + @Test + @TestMetadata("private.kt") + public void testPrivate() { + runTest("test-data/diagnostics-kopy-visibility/1_public/private.kt"); + } + + @Test + @TestMetadata("protected.kt") + public void testProtected() { + runTest("test-data/diagnostics-kopy-visibility/1_public/protected.kt"); + } + + @Test + @TestMetadata("public.kt") + public void testPublic() { + runTest("test-data/diagnostics-kopy-visibility/1_public/public.kt"); + } +} diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy2InternalDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy2InternalDiagnosticTestGenerated.java new file mode 100644 index 0000000..6a9fab0 --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy2InternalDiagnosticTestGenerated.java @@ -0,0 +1,46 @@ + + +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-visibility/2_internal") +@TestDataPath("$PROJECT_ROOT") +public class Kopy2InternalDiagnosticTestGenerated extends AbstractKopy2InternalDiagnosticTest { + @Test + public void testAllFilesPresentIn2_internal() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-visibility/2_internal"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("internal.kt") + public void testInternal() { + runTest("test-data/diagnostics-kopy-visibility/2_internal/internal.kt"); + } + + @Test + @TestMetadata("private.kt") + public void testPrivate() { + runTest("test-data/diagnostics-kopy-visibility/2_internal/private.kt"); + } + + @Test + @TestMetadata("protected.kt") + public void testProtected() { + runTest("test-data/diagnostics-kopy-visibility/2_internal/protected.kt"); + } + + @Test + @TestMetadata("public.kt") + public void testPublic() { + runTest("test-data/diagnostics-kopy-visibility/2_internal/public.kt"); + } +} diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy3ProtectedDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy3ProtectedDiagnosticTestGenerated.java new file mode 100644 index 0000000..c47f077 --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy3ProtectedDiagnosticTestGenerated.java @@ -0,0 +1,46 @@ + + +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-visibility/3_protected") +@TestDataPath("$PROJECT_ROOT") +public class Kopy3ProtectedDiagnosticTestGenerated extends AbstractKopy3ProtectedDiagnosticTest { + @Test + public void testAllFilesPresentIn3_protected() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-visibility/3_protected"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("internal.kt") + public void testInternal() { + runTest("test-data/diagnostics-kopy-visibility/3_protected/internal.kt"); + } + + @Test + @TestMetadata("private.kt") + public void testPrivate() { + runTest("test-data/diagnostics-kopy-visibility/3_protected/private.kt"); + } + + @Test + @TestMetadata("protected.kt") + public void testProtected() { + runTest("test-data/diagnostics-kopy-visibility/3_protected/protected.kt"); + } + + @Test + @TestMetadata("public.kt") + public void testPublic() { + runTest("test-data/diagnostics-kopy-visibility/3_protected/public.kt"); + } +} diff --git a/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy4PrivateDiagnosticTestGenerated.java b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy4PrivateDiagnosticTestGenerated.java new file mode 100644 index 0000000..4558f6d --- /dev/null +++ b/kopy-compiler/test-gen/java/com/javiersc/kotlin/kopy/compiler/Kopy4PrivateDiagnosticTestGenerated.java @@ -0,0 +1,46 @@ + + +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-visibility/4_private") +@TestDataPath("$PROJECT_ROOT") +public class Kopy4PrivateDiagnosticTestGenerated extends AbstractKopy4PrivateDiagnosticTest { + @Test + public void testAllFilesPresentIn4_private() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("test-data/diagnostics-kopy-visibility/4_private"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("internal.kt") + public void testInternal() { + runTest("test-data/diagnostics-kopy-visibility/4_private/internal.kt"); + } + + @Test + @TestMetadata("private.kt") + public void testPrivate() { + runTest("test-data/diagnostics-kopy-visibility/4_private/private.kt"); + } + + @Test + @TestMetadata("protected.kt") + public void testProtected() { + runTest("test-data/diagnostics-kopy-visibility/4_private/protected.kt"); + } + + @Test + @TestMetadata("public.kt") + public void testPublic() { + runTest("test-data/diagnostics-kopy-visibility/4_private/public.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 d389585..cfdaaf4 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 @@ -1,16 +1,27 @@ package com.javiersc.kotlin.kopy.compiler -import com.javiersc.kotlin.compiler.test.generateKotlinCompilerTests 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.KopyVisibility import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5 import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.model.TestModule fun main() { - generateKotlinCompilerTests() + generateTestGroupSuiteWithJUnit5 { + testGroup(testDataRoot = "test-data", testsRoot = "test-gen/java") { + testClass { model("diagnostics") } + testClass { model("box") } + testClass { model("diagnostics-kopy-visibility/0_auto") } + testClass { model("diagnostics-kopy-visibility/1_public") } + testClass { model("diagnostics-kopy-visibility/2_internal") } + testClass { model("diagnostics-kopy-visibility/3_protected") } + testClass { model("diagnostics-kopy-visibility/4_private") } + } + } } open class AbstractDiagnosticTest : DiagnosticTest() { @@ -38,3 +49,73 @@ open class AbstractBoxTest : BoxTest() { allExtensions(configuration) } } + +open class AbstractKopy0AutoDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Visibility, KopyVisibility.Auto) + allExtensions(configuration) + } +} + +open class AbstractKopy1PublicDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Visibility, KopyVisibility.Public) + allExtensions(configuration) + } +} + +open class AbstractKopy2InternalDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Visibility, KopyVisibility.Internal) + allExtensions(configuration) + } +} + +open class AbstractKopy3ProtectedDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Visibility, KopyVisibility.Protected) + allExtensions(configuration) + } +} + +open class AbstractKopy4PrivateDiagnosticTest : DiagnosticTest() { + + override val runtimeClasspathProvider: Constructor = + ::GeneratedMetaRuntimeClasspathProvider + + override fun ExtensionStorage.registerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + configuration.put(KopyKey.Visibility, KopyVisibility.Private) + 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 491adb3..9f5861e 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,7 @@ package com.javiersc.kotlin.kopy.compiler -import io.kotest.matchers.collections.shouldBeEmpty +import com.javiersc.kotlin.kopy.args.KopyVisibility +import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test @@ -15,6 +16,7 @@ class KopyCommandLineProcessorTest { @Test fun `check plugin options`() { val processor = KopyCommandLineProcessor() - processor.pluginOptions.shouldBeEmpty() + processor.pluginOptions.shouldHaveSize(1) + processor.pluginOptions.first().optionName shouldBe KopyVisibility.NAME } } diff --git a/kopy-gradle-plugin/build.gradle.kts b/kopy-gradle-plugin/build.gradle.kts index 0aed0bc..4e23e0f 100644 --- a/kopy-gradle-plugin/build.gradle.kts +++ b/kopy-gradle-plugin/build.gradle.kts @@ -60,6 +60,7 @@ hubdle { main { dependencies { implementation(gradleKotlinDsl()) + implementation(projects.kopyArgs) compileOnly(projects.kopyCompiler) compileOnly(hubdle.jetbrains.kotlin.gradle.plugin) } 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 bcab8f8..3b40079 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,7 +1,9 @@ package com.javiersc.kotlin.kopy.gradle.plugin +import com.javiersc.kotlin.kopy.args.KopyVisibility import javax.inject.Inject import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property import org.gradle.api.provider.ProviderFactory public open class KopyExtension @@ -11,6 +13,9 @@ constructor( objects: ObjectFactory, ) { + public val visibility: Property = + objects.property(KopyVisibility::class.java).convention(KopyVisibility.Auto) + public companion object { public const val NAME: String = "kopy" } 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 858207a..1bb34c6 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.KopyVisibility import com.javiersc.kotlin.kopy.compiler.KopyCompilerProjectData import javax.inject.Inject import org.gradle.api.Project @@ -8,6 +9,7 @@ import org.gradle.api.provider.ProviderFactory import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.create import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.the import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin @@ -30,7 +32,17 @@ constructor( override fun applyToCompilation( kotlinCompilation: KotlinCompilation<*> - ): Provider> = providers.provider { emptyList() } + ): Provider> { + val kopy: KopyExtension = kotlinCompilation.project.the() + return providers.provider { + listOf( + SubpluginOption( + key = KopyVisibility.NAME, + value = kopy.visibility.get().value, + ), + ) + } + } override fun getCompilerPluginId(): String = "${KopyCompilerProjectData.Group}.${KopyCompilerProjectData.Name}" @@ -45,9 +57,7 @@ constructor( override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean = true private fun Project.createExtension() { - extensions.create( - KopyExtension.NAME, - ) + extensions.create(KopyExtension.NAME) } private fun Project.withKotlinAndroid(action: Project.() -> Unit) { diff --git a/kopy-gradle-plugin/testFunctional/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePluginTest.kt b/kopy-gradle-plugin/testFunctional/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePluginTest.kt index 7654994..ed34b9f 100644 --- a/kopy-gradle-plugin/testFunctional/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePluginTest.kt +++ b/kopy-gradle-plugin/testFunctional/kotlin/com/javiersc/kotlin/kopy/gradle/plugin/KopyGradlePluginTest.kt @@ -12,4 +12,16 @@ internal class KopyGradlePluginTest : GradleTestKitTest() { .output .shouldContain("House(squareMeters=200, kitchen=Kitchen(cat=Cat(name=Felix, age=7, numbers=[2, 3, 4]), squareMeters=20))") } + + @Test + fun `private visibility`() = gradleTestKitTest("private-visibility") { + withArguments("run").buildAndFail() + .output + .shouldContain("Cannot access 'fun copy(copy: House.() -> Unit): House': it is private in 'com/javiersc/kotlin/kopy/functiona/test/House'.") + .shouldContain("Cannot access 'fun S.set(other: S): Unit': it is private in 'com/javiersc/kotlin/kopy/functiona/test/House'.") + .shouldContain("Cannot access 'fun S.set(other: S): Unit': it is private in 'com/javiersc/kotlin/kopy/functiona/test/House'.") + .shouldContain("Cannot access 'fun U.update(transform: (U) -> U): Unit': it is private in 'com/javiersc/kotlin/kopy/functiona/test/House'.") + .shouldContain("Cannot access 'fun Iterable.updateEach(transform: (UE) -> UE): Unit': it is private in 'com/javiersc/kotlin/kopy/functiona/test/House'.") + .shouldContain("Cannot access 'fun S.set(other: S): Unit': it is private in 'com/javiersc/kotlin/kopy/functiona/test/House'.") + } } diff --git a/kopy-gradle-plugin/testFunctional/resources/private-visibility/build.gradle.kts b/kopy-gradle-plugin/testFunctional/resources/private-visibility/build.gradle.kts new file mode 100644 index 0000000..bf54035 --- /dev/null +++ b/kopy-gradle-plugin/testFunctional/resources/private-visibility/build.gradle.kts @@ -0,0 +1,15 @@ +import com.javiersc.kotlin.kopy.args.KopyVisibility + +plugins { + application + id("com.javiersc.kotlin.kopy") + id("org.jetbrains.kotlin.jvm") +} + +application { + mainClass = "com.javiersc.kotlin.kopy.functiona.test.MainKt" +} + +kopy { + visibility.set(KopyVisibility.Private) +} diff --git a/kopy-gradle-plugin/testFunctional/resources/private-visibility/settings.gradle.kts b/kopy-gradle-plugin/testFunctional/resources/private-visibility/settings.gradle.kts new file mode 100644 index 0000000..f23f154 --- /dev/null +++ b/kopy-gradle-plugin/testFunctional/resources/private-visibility/settings.gradle.kts @@ -0,0 +1,26 @@ +import java.io.File + +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + google() + maven( + url = File(System.getProperty("user.home")).resolve("mavenLocalTest/repository").toURI() + ) { + name = "mavenLocalTest" + } + } +} + +dependencyResolutionManagement { + repositories { + mavenCentral() + google() + maven( + url = File(System.getProperty("user.home")).resolve("mavenLocalTest/repository").toURI() + ) { + name = "mavenLocalTest" + } + } +} diff --git a/kopy-gradle-plugin/testFunctional/resources/private-visibility/src/main/kotlin/main.kt b/kopy-gradle-plugin/testFunctional/resources/private-visibility/src/main/kotlin/main.kt new file mode 100644 index 0000000..616c760 --- /dev/null +++ b/kopy-gradle-plugin/testFunctional/resources/private-visibility/src/main/kotlin/main.kt @@ -0,0 +1,30 @@ +package com.javiersc.kotlin.kopy.functiona.test + +import com.javiersc.kotlin.kopy.Kopy + +fun main() { + val house = House( + squareMeters = 100, + kitchen = Kitchen( + cat = Cat( + name = "Garfield", + age = 5, + numbers = listOf(1, 2, 3), + ), + squareMeters = 10, + ), + ) + val house2: House = house.copy { + squareMeters = 200 + kitchen.cat.name = "Felix" + kitchen.cat.age.update { it + 2 } + kitchen.cat.numbers.updateEach { it + 1 } + kitchen.squareMeters.set(20) + } + + println(house2) +} + +@Kopy data class House(val squareMeters: Int, val kitchen: Kitchen) +@Kopy data class Kitchen(val cat: Cat, val squareMeters: Int) +@Kopy data class Cat(val name: String, val age: Int, val numbers: List)