From 17cd0d7dbcb92dc956efd0365ee22c1816344b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C5=BEe=20Sodja?= Date: Thu, 1 Sep 2022 15:58:08 +0200 Subject: [PATCH] [Assign plugin] Add Gradle plugin and IDE dependencies for Assignment compiler plugin --- build.gradle.kts | 4 +- buildSrc/src/main/kotlin/tasks.kt | 1 + gradle/jps.gradle.kts | 1 + .../tools/kotlin-assignment/build.gradle.kts | 32 ++++++++++++ .../plugin/gradle/AssignmentExtension.kt | 22 ++++++++ .../plugin/gradle/AssignmentSubplugin.kt | 50 +++++++++++++++++++ .../model/builder/AssignmentModelBuilder.kt | 29 +++++++++++ .../gradle/model/impl/AssignmentImpl.kt | 24 +++++++++ ...tlin-value-container-assignment.properties | 1 + ...kotlin.gradle.plugin.KotlinGradleSubplugin | 1 + .../builder/AssignmentModelBuilderTest.kt | 20 ++++++++ .../build.gradle.kts | 5 ++ .../jetbrains/kotlin/gradle/SubpluginsIT.kt | 8 +++ .../kotlin/gradle/model/AssignmentModelIT.kt | 43 ++++++++++++++++ .../gradle/testbase/projectSetupDefaults.kt | 2 + .../testProject/assignmentSimple/build.gradle | 17 +++++++ .../assignmentSimple/src/lib/Property.java | 14 ++++++ .../src/lib/ValueContainer.java | 9 ++++ .../testProject/assignmentSimple/src/test.kt | 31 ++++++++++++ .../kotlin/gradle/model/Assignment.kt | 35 +++++++++++++ .../build.gradle.kts | 10 ++++ settings.gradle | 3 ++ 22 files changed, 361 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-assignment/build.gradle.kts create mode 100644 libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentExtension.kt create mode 100644 libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentSubplugin.kt create mode 100644 libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilder.kt create mode 100644 libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/impl/AssignmentImpl.kt create mode 100644 libraries/tools/kotlin-assignment/src/common/resources/META-INF/gradle-plugins/kotlin-value-container-assignment.properties create mode 100644 libraries/tools/kotlin-assignment/src/common/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin create mode 100644 libraries/tools/kotlin-assignment/src/test/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilderTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/AssignmentModelIT.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/Property.java create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/ValueContainer.java create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/test.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-model/src/common/kotlin/org/jetbrains/kotlin/gradle/model/Assignment.kt create mode 100644 prepare/ide-plugin-dependencies/assignment-compiler-plugin-for-ide/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index a516e102f68..0c729e44971 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -302,6 +302,7 @@ extra["compilerArtifactsForIde"] = listOfNotNull( ":prepare:ide-plugin-dependencies:kotlinx-serialization-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:noarg-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:sam-with-receiver-compiler-plugin-for-ide", + ":prepare:ide-plugin-dependencies:assignment-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:parcelize-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:lombok-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:kotlin-backend-native-for-ide".takeIf { kotlinBuildProperties.isKotlinNativeEnabled }, @@ -387,7 +388,8 @@ val gradlePluginProjects = listOf( ":kotlin-noarg", ":kotlin-sam-with-receiver", ":kotlin-parcelize-compiler", - ":kotlin-lombok" + ":kotlin-lombok", + ":kotlin-assignment" ) val ignoreTestFailures by extra(project.kotlinBuildProperties.ignoreTestFailures) diff --git a/buildSrc/src/main/kotlin/tasks.kt b/buildSrc/src/main/kotlin/tasks.kt index 906feed6611..3c6dbceabaa 100644 --- a/buildSrc/src/main/kotlin/tasks.kt +++ b/buildSrc/src/main/kotlin/tasks.kt @@ -26,6 +26,7 @@ import java.nio.file.Files import java.nio.file.Path val kotlinGradlePluginAndItsRequired = arrayOf( + ":kotlin-assignment", ":kotlin-allopen", ":kotlin-noarg", ":kotlin-sam-with-receiver", diff --git a/gradle/jps.gradle.kts b/gradle/jps.gradle.kts index a7d281710a8..41eb917aca5 100644 --- a/gradle/jps.gradle.kts +++ b/gradle/jps.gradle.kts @@ -24,6 +24,7 @@ fun updateCompilerXml() { "libraries/tools/kotlin-allopen", "libraries/tools/kotlin-annotation-processing", "libraries/tools/kotlin-annotation-processing-maven", + "libraries/tools/kotlin-assignment", "libraries/tools/kotlin-bom", "libraries/tools/kotlin-gradle-build-metrics", "libraries/tools/kotlin-gradle-plugin", diff --git a/libraries/tools/kotlin-assignment/build.gradle.kts b/libraries/tools/kotlin-assignment/build.gradle.kts new file mode 100644 index 00000000000..3736a535658 --- /dev/null +++ b/libraries/tools/kotlin-assignment/build.gradle.kts @@ -0,0 +1,32 @@ +import org.jetbrains.kotlin.pill.PillExtension + +plugins { + id("gradle-plugin-common-configuration") + id("jps-compatible") +} + +pill { + variant = PillExtension.Variant.FULL +} + +dependencies { + commonApi(project(":kotlin-gradle-plugin-model")) + + commonCompileOnly(project(":compiler")) + commonCompileOnly(project(":kotlin-assignment-compiler-plugin")) + + embedded(project(":kotlin-assignment-compiler-plugin")) { isTransitive = false } + + testImplementation(commonDependency("junit")) +} + +gradlePlugin { + plugins { + create("assignment") { + id = "org.jetbrains.kotlin.plugin.assignment" + displayName = "Kotlin Assignment compiler plugin" + description = displayName + implementationClass = "org.jetbrains.kotlin.assignment.plugin.gradle.AssignmentSubplugin" + } + } +} diff --git a/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentExtension.kt b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentExtension.kt new file mode 100644 index 00000000000..24b345d38d4 --- /dev/null +++ b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentExtension.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.assignment.plugin.gradle + +open class AssignmentExtension { + internal val myAnnotations = mutableListOf() + + open fun annotation(fqName: String) { + myAnnotations.add(fqName) + } + + open fun annotations(fqNames: List) { + myAnnotations.addAll(fqNames) + } + + open fun annotations(vararg fqNames: String) { + myAnnotations.addAll(fqNames) + } +} diff --git a/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentSubplugin.kt b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentSubplugin.kt new file mode 100644 index 00000000000..366fef71e60 --- /dev/null +++ b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/AssignmentSubplugin.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.assignment.plugin.gradle + +import org.gradle.api.Project +import org.gradle.api.provider.Provider +import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry +import org.jetbrains.kotlin.assignment.plugin.gradle.model.builder.AssignmentModelBuilder +import org.jetbrains.kotlin.gradle.plugin.* +import javax.inject.Inject + +class AssignmentSubplugin +@Inject internal constructor( + private val registry: ToolingModelBuilderRegistry +) : KotlinCompilerPluginSupportPlugin { + + companion object { + const val COMPILER_PLUGIN_ARTIFACT_NAME = "kotlin-assignment" + const val COMPILER_PLUGIN_ID = "org.jetbrains.kotlin.assignment" + private const val ANNOTATION_ARG_NAME = "annotation" + } + + override fun apply(target: Project) { + target.extensions.create("assignment", AssignmentExtension::class.java) + registry.register(AssignmentModelBuilder()) + } + + override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean = true + + override fun applyToCompilation(kotlinCompilation: KotlinCompilation<*>): Provider> { + val project = kotlinCompilation.target.project + val extension = project.extensions.findByType(AssignmentExtension::class.java) + ?: return project.provider { emptyList() } + + return project.provider { + val options = mutableListOf() + for (anno in extension.myAnnotations) { + options += SubpluginOption(ANNOTATION_ARG_NAME, anno) + } + options + } + } + + override fun getCompilerPluginId(): String = COMPILER_PLUGIN_ID + + override fun getPluginArtifact(): SubpluginArtifact = JetBrainsSubpluginArtifact(artifactId = COMPILER_PLUGIN_ARTIFACT_NAME) +} diff --git a/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilder.kt b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilder.kt new file mode 100644 index 00000000000..85a5df0f1b9 --- /dev/null +++ b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilder.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.assignment.plugin.gradle.model.builder + +import org.gradle.api.Project +import org.gradle.tooling.provider.model.ToolingModelBuilder +import org.jetbrains.kotlin.assignment.plugin.gradle.AssignmentExtension +import org.jetbrains.kotlin.assignment.plugin.gradle.model.impl.AssignmentImpl +import org.jetbrains.kotlin.gradle.model.Assignment + +/** + * [ToolingModelBuilder] for [ValueContainerAssignment] models. + * This model builder is registered for Kotlin Value Container Assignment sub-plugin. + */ +class AssignmentModelBuilder : ToolingModelBuilder { + + override fun canBuild(modelName: String): Boolean { + return modelName.equals(Assignment::class.java.name) + } + + override fun buildAll(modelName: String, project: Project): Any { + require(canBuild(modelName)) { "buildAll(\"$modelName\") has been called while canBeBuild is false" } + val extension = project.extensions.getByType(AssignmentExtension::class.java) + return AssignmentImpl(project.name, extension.myAnnotations) + } +} diff --git a/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/impl/AssignmentImpl.kt b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/impl/AssignmentImpl.kt new file mode 100644 index 00000000000..e8940bb237f --- /dev/null +++ b/libraries/tools/kotlin-assignment/src/common/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/impl/AssignmentImpl.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.assignment.plugin.gradle.model.impl + +import org.jetbrains.kotlin.gradle.model.Assignment +import java.io.Serializable + +/** + * Implementation of the [ValueContainerAssignment] interface. + */ +data class AssignmentImpl( + override val name: String, + override val annotations: List +) : Assignment, Serializable { + + override val modelVersion = serialVersionUID + + companion object { + private const val serialVersionUID = 1L + } +} diff --git a/libraries/tools/kotlin-assignment/src/common/resources/META-INF/gradle-plugins/kotlin-value-container-assignment.properties b/libraries/tools/kotlin-assignment/src/common/resources/META-INF/gradle-plugins/kotlin-value-container-assignment.properties new file mode 100644 index 00000000000..1550b85f8a9 --- /dev/null +++ b/libraries/tools/kotlin-assignment/src/common/resources/META-INF/gradle-plugins/kotlin-value-container-assignment.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.assignment.plugin.gradle.AssignmentSubplugin diff --git a/libraries/tools/kotlin-assignment/src/common/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin b/libraries/tools/kotlin-assignment/src/common/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin new file mode 100644 index 00000000000..06098e77c85 --- /dev/null +++ b/libraries/tools/kotlin-assignment/src/common/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin @@ -0,0 +1 @@ +org.jetbrains.kotlin.assignment.plugin.gradle.AssignmentSubplugin diff --git a/libraries/tools/kotlin-assignment/src/test/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilderTest.kt b/libraries/tools/kotlin-assignment/src/test/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilderTest.kt new file mode 100644 index 00000000000..372efcea061 --- /dev/null +++ b/libraries/tools/kotlin-assignment/src/test/kotlin/org/jetbrains/kotlin/assignment/plugin/gradle/model/builder/AssignmentModelBuilderTest.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.assignment.plugin.gradle.model.builder + +import org.jetbrains.kotlin.gradle.model.Assignment +import org.junit.Assert +import org.junit.Test + +class AssignmentModelBuilderTest { + + @Test + fun testCanBuild() { + val modelBuilder = AssignmentModelBuilder() + Assert.assertTrue(modelBuilder.canBuild(Assignment::class.java.name)) + Assert.assertFalse(modelBuilder.canBuild("wrongModel")) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts index 0c467c5a342..aeacb8460f8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts @@ -40,6 +40,11 @@ dependencies { requireCapability("org.jetbrains.kotlin:kotlin-sam-with-receiver-common") } } + testImplementation(project(":kotlin-assignment")) { + capabilities { + requireCapability("org.jetbrains.kotlin:kotlin-assignment-common") + } + } testImplementation(project(":atomicfu")) { capabilities { requireCapability("org.jetbrains.kotlin:atomicfu-common") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt index 08186460f65..78eab062fd4 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/SubpluginsIT.kt @@ -123,6 +123,14 @@ class SubpuginsIT : KGPBaseTest() { } } + @DisplayName("assignment works") + @GradleTest + fun testAssignmentSimple(gradleVersion: GradleVersion) { + project("assignmentSimple", gradleVersion) { + build("assemble") + } + } + @DisplayName("Allopen plugin works when classpath dependency is not declared in current or root project ") @GradleTest fun testAllOpenFromNestedBuildscript(gradleVersion: GradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/AssignmentModelIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/AssignmentModelIT.kt new file mode 100644 index 00000000000..ee2c14939f9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/model/AssignmentModelIT.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.model + +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.DisplayName +import kotlin.test.assertEquals +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@DisplayName("Assignment plugin model") +@OtherGradlePluginTests +class AssignmentModelIT : KGPBaseTest() { + + @DisplayName("Valid model is available when plugin is applied") + @GradleTest + fun testAssignmentSimple(gradleVersion: GradleVersion) { + project("assignmentSimple", gradleVersion) { + getModels { + with(getModel(":")!!) { + assertEquals(1L, modelVersion) + assertEquals("assignmentSimple", name) + assertEquals(1, annotations.size) + assertTrue(annotations.contains("lib.ValueContainer")) + } + } + } + } + + @DisplayName("Model is not available when plugin is not applied") + @GradleTest + fun testNonAssignmentProjects(gradleVersion: GradleVersion) { + project("kotlinProject", gradleVersion) { + getModels { + assertNull(getModel(":")) + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/projectSetupDefaults.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/projectSetupDefaults.kt index 227ab8f56a1..e8e309b5807 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/projectSetupDefaults.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/projectSetupDefaults.kt @@ -32,6 +32,7 @@ internal val DEFAULT_GROOVY_SETTINGS_FILE = id "org.jetbrains.kotlin.plugin.lombok" version "${'$'}kotlin_version" id "org.jetbrains.kotlin.plugin.sam.with.receiver" version "${'$'}kotlin_version" id "org.jetbrains.kotlin.plugin.serialization" version "${'$'}kotlin_version" + id "org.jetbrains.kotlin.plugin.assignment" version "${'$'}kotlin_version" id "org.jetbrains.kotlin.test.fixes.android" version "${'$'}test_fixes_version" id "org.jetbrains.kotlin.gradle-subplugin-example" version "${'$'}kotlin_version" id "org.jetbrains.kotlin.plugin.atomicfu" version "${'$'}kotlin_version" @@ -85,6 +86,7 @@ internal val DEFAULT_KOTLIN_SETTINGS_FILE = id("org.jetbrains.kotlin.plugin.lombok") version kotlin_version id("org.jetbrains.kotlin.plugin.sam.with.receiver") version kotlin_version id("org.jetbrains.kotlin.plugin.serialization") version kotlin_version + id("org.jetbrains.kotlin.plugin.assignment") version kotlin_version id("org.jetbrains.kotlin.test.fixes.android") version test_fixes_version id("org.jetbrains.kotlin.gradle-subplugin-example") version kotlin_version id("org.jetbrains.kotlin.plugin.atomicfu") version kotlin_version diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/build.gradle new file mode 100644 index 00000000000..598e4020aff --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/build.gradle @@ -0,0 +1,17 @@ +plugins { + id "org.jetbrains.kotlin.jvm" + id "org.jetbrains.kotlin.plugin.assignment" +} + +repositories { + mavenLocal() + mavenCentral() +} + +sourceSets { + main.kotlin.srcDir 'src' +} + +assignment { + annotation("lib.ValueContainer") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/Property.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/Property.java new file mode 100644 index 00000000000..6d2e0f07ef0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/Property.java @@ -0,0 +1,14 @@ +package lib; + +@ValueContainer +public class Property { + private T value; + + public T get() { + return value; + } + + public void set(T value) { + this.value = value; + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/ValueContainer.java b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/ValueContainer.java new file mode 100644 index 00000000000..46c5becbf37 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/lib/ValueContainer.java @@ -0,0 +1,9 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package lib; + +public @interface ValueContainer { +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/test.kt new file mode 100644 index 00000000000..b129f4c5c3e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/assignmentSimple/src/test.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test + +import lib.* + +fun Property.assign(value: T) { + this.set(value) +} + +data class Task(val prop: Property) {} + +fun test() { + val task = Task(Property()) + task.prop = "alma" + println(task.prop.get()) +} diff --git a/libraries/tools/kotlin-gradle-plugin-model/src/common/kotlin/org/jetbrains/kotlin/gradle/model/Assignment.kt b/libraries/tools/kotlin-gradle-plugin-model/src/common/kotlin/org/jetbrains/kotlin/gradle/model/Assignment.kt new file mode 100644 index 00000000000..08a722255ec --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-model/src/common/kotlin/org/jetbrains/kotlin/gradle/model/Assignment.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.model + +/** + * Entry point for Kotlin Value Container Assignment models. + * Represents the description of annotations interpreted by 'kotlin-assignment' plugin. + */ +interface Assignment { + + /** + * Return a number representing the version of this API. + * Always increasing if changed. + * + * @return the version of this model. + */ + val modelVersion: Long + + /** + * Returns the module (Gradle project) name. + * + * @return the module name. + */ + val name: String + + /** + * Return the list of annotations. + * + * @return the list of annotations. + */ + val annotations: List +} diff --git a/prepare/ide-plugin-dependencies/assignment-compiler-plugin-for-ide/build.gradle.kts b/prepare/ide-plugin-dependencies/assignment-compiler-plugin-for-ide/build.gradle.kts new file mode 100644 index 00000000000..4fec8b0d04a --- /dev/null +++ b/prepare/ide-plugin-dependencies/assignment-compiler-plugin-for-ide/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + kotlin("jvm") +} + +publishJarsForIde( + listOf( + ":kotlin-assignment-compiler-plugin.common", + ":kotlin-assignment-compiler-plugin.k1" + ) +) diff --git a/settings.gradle b/settings.gradle index 93a3d739564..b4ae76e2387 100644 --- a/settings.gradle +++ b/settings.gradle @@ -270,6 +270,7 @@ include ":kotlin-imports-dumper-compiler-plugin", ":kotlin-allopen", ":kotlin-noarg", ":kotlin-sam-with-receiver", + ":kotlin-assignment", ":kotlin-gradle-subplugin-example", ":examples:annotation-processor-example", ":kotlin-script-util", @@ -401,6 +402,7 @@ if (!buildProperties.inJpsBuildIdeaSync) { ":prepare:ide-plugin-dependencies:kotlinx-serialization-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:noarg-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:sam-with-receiver-compiler-plugin-for-ide", + ":prepare:ide-plugin-dependencies:assignment-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:parcelize-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:lombok-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:kotlin-backend-native-for-ide", @@ -772,6 +774,7 @@ project(':kotlin-tooling-core').projectDir = "$rootDir/libraries/tools/kotlin-to project(':kotlin-allopen').projectDir = "$rootDir/libraries/tools/kotlin-allopen" as File project(':kotlin-noarg').projectDir = "$rootDir/libraries/tools/kotlin-noarg" as File project(':kotlin-sam-with-receiver').projectDir = "$rootDir/libraries/tools/kotlin-sam-with-receiver" as File +project(':kotlin-assignment').projectDir = "$rootDir/libraries/tools/kotlin-assignment" as File project(':kotlin-lombok').projectDir = "$rootDir/libraries/tools/kotlin-lombok" as File project(':kotlin-gradle-subplugin-example').projectDir = "$rootDir/libraries/examples/kotlin-gradle-subplugin-example" as File project(':examples:annotation-processor-example').projectDir = "$rootDir/libraries/examples/annotation-processor-example" as File