diff --git a/idea/build.gradle.kts b/idea/build.gradle.kts index f0939ed831d..027feed7c67 100644 --- a/idea/build.gradle.kts +++ b/idea/build.gradle.kts @@ -139,6 +139,9 @@ dependencies { testRuntime(project(":plugins:annotation-based-compiler-plugins-ide-support")) { isTransitive = false } testRuntime(project(":plugins:parcelize:parcelize-compiler")) testRuntime(project(":plugins:parcelize:parcelize-ide")) { isTransitive = false } + testRuntime(project(":plugins:base-compiler-plugins-ide-support")) { isTransitive = false } + testRuntime(project(":plugins:lombok:lombok-compiler-plugin")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) { isTransitive = false } testRuntime(project(":kotlin-scripting-idea")) { isTransitive = false } testRuntime(project(":kotlin-scripting-compiler-impl")) testRuntime(project(":sam-with-receiver-ide-plugin")) { isTransitive = false } diff --git a/idea/idea-android/build.gradle.kts b/idea/idea-android/build.gradle.kts index 695c128ab4c..5c5195bdf25 100644 --- a/idea/idea-android/build.gradle.kts +++ b/idea/idea-android/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { testRuntime(project(":kotlin-scripting-idea")) testRuntime(project(":kotlinx-serialization-ide-plugin")) testRuntime(project(":plugins:parcelize:parcelize-ide")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(intellijPluginDep("android")) diff --git a/idea/idea-fir-performance-tests/build.gradle.kts b/idea/idea-fir-performance-tests/build.gradle.kts index 6f26e7228e2..fa2b79188db 100644 --- a/idea/idea-fir-performance-tests/build.gradle.kts +++ b/idea/idea-fir-performance-tests/build.gradle.kts @@ -44,6 +44,7 @@ dependencies { testRuntimeOnly(project(":kotlin-scripting-idea")) testRuntimeOnly(project(":kotlinx-serialization-ide-plugin")) testRuntimeOnly(project(":plugins:parcelize:parcelize-ide")) + testRuntimeOnly(project(":plugins:lombok:lombok-ide-plugin")) testRuntimeOnly(project(":nj2k:nj2k-services")) testRuntimeOnly(project(":kotlin-reflect")) testRuntimeOnly(project(":idea:kotlin-gradle-tooling")) diff --git a/idea/idea-gradle-native/build.gradle.kts b/idea/idea-gradle-native/build.gradle.kts index 1638c486c23..f6a4cf06624 100644 --- a/idea/idea-gradle-native/build.gradle.kts +++ b/idea/idea-gradle-native/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { testRuntime(project(":kotlin-scripting-idea")) testRuntime(project(":plugins:parcelize:parcelize-ide")) testRuntime(project(":kotlinx-serialization-ide-plugin")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) // TODO: the order of the plugins matters here, consider avoiding order-dependency Platform[192].orHigher { testRuntime(intellijPluginDep("java")) @@ -98,4 +99,4 @@ if (Ide.AS41.orHigher()) { getOrCreateTask("test") { setExcludes(listOf("**")) } -} \ No newline at end of file +} diff --git a/idea/idea-gradle/build.gradle.kts b/idea/idea-gradle/build.gradle.kts index 9eb4e2817b9..4ae441a6f71 100644 --- a/idea/idea-gradle/build.gradle.kts +++ b/idea/idea-gradle/build.gradle.kts @@ -59,6 +59,7 @@ dependencies { testRuntime(project(":kotlin-scripting-idea")) testRuntime(project(":kotlinx-serialization-ide-plugin")) testRuntime(project(":plugins:parcelize:parcelize-ide")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(project(":kotlin-gradle-statistics")) // TODO: the order of the plugins matters here, consider avoiding order-dependency testRuntime(intellijPluginDep("junit")) diff --git a/idea/idea-maven/build.gradle.kts b/idea/idea-maven/build.gradle.kts index 29e0e161a14..3cdc69e3cd8 100644 --- a/idea/idea-maven/build.gradle.kts +++ b/idea/idea-maven/build.gradle.kts @@ -65,6 +65,7 @@ dependencies { testRuntime(project(":plugins:parcelize:parcelize-ide")) testRuntime(project(":kotlin-scripting-idea")) testRuntime(project(":kotlinx-serialization-ide-plugin")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(intellijDep()) // TODO: the order of the plugins matters here, consider avoiding order-dependency diff --git a/idea/idea-new-project-wizard/build.gradle.kts b/idea/idea-new-project-wizard/build.gradle.kts index c8b97951cd1..59feeee4303 100644 --- a/idea/idea-new-project-wizard/build.gradle.kts +++ b/idea/idea-new-project-wizard/build.gradle.kts @@ -37,6 +37,7 @@ dependencies { testRuntimeOnly(project(":kotlin-gradle-statistics")) testRuntimeOnly(project(":kotlin-scripting-idea")) testRuntimeOnly(project(":plugins:parcelize:parcelize-ide")) + testRuntimeOnly(project(":plugins:lombok:lombok-ide-plugin")) testRuntimeOnly(intellijRuntimeAnnotations()) diff --git a/idea/jvm-debugger/jvm-debugger-test/build.gradle.kts b/idea/jvm-debugger/jvm-debugger-test/build.gradle.kts index 98ef6deb2b5..1a39a68cc71 100644 --- a/idea/jvm-debugger/jvm-debugger-test/build.gradle.kts +++ b/idea/jvm-debugger/jvm-debugger-test/build.gradle.kts @@ -36,6 +36,7 @@ dependencies { testRuntime(project(":kotlin-scripting-idea")) testRuntime(project(":kotlinx-serialization-ide-plugin")) testRuntime(project(":plugins:parcelize:parcelize-ide")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(intellijDep()) testRuntime(intellijRuntimeAnnotations()) @@ -51,4 +52,4 @@ projectTest(parallel = true) { workingDir = rootDir } -testsJar() \ No newline at end of file +testsJar() diff --git a/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService b/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService index c41e4fe2b72..0b07d260d6d 100644 --- a/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService +++ b/idea/kotlin-gradle-tooling/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService @@ -6,4 +6,5 @@ org.jetbrains.kotlin.allopen.ide.AllOpenModelBuilderService org.jetbrains.kotlin.kapt.idea.KaptModelBuilderService org.jetbrains.kotlin.noarg.ide.NoArgModelBuilderService org.jetbrains.kotlin.samWithReceiver.ide.SamWithReceiverModelBuilderService -org.jetbrains.kotlin.parcelize.ide.ParcelizeModelBuilderService \ No newline at end of file +org.jetbrains.kotlin.parcelize.ide.ParcelizeModelBuilderService +org.jetbrains.kotlin.lombok.ide.LombokModelBuilderService diff --git a/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/lombok/ide/LombokModelBuilderService.kt b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/lombok/ide/LombokModelBuilderService.kt new file mode 100644 index 00000000000..e0495db1860 --- /dev/null +++ b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/lombok/ide/LombokModelBuilderService.kt @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2021 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.lombok.ide + +import org.gradle.api.Project +import org.jetbrains.plugins.gradle.tooling.AbstractModelBuilderService +import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder +import org.jetbrains.plugins.gradle.tooling.ModelBuilderContext +import java.io.File +import java.io.Serializable + +interface LombokModel : Serializable { + val configurationFile: File? +} + +class LombokModelImpl(override val configurationFile: File?) : LombokModel + +class LombokModelBuilderService : AbstractModelBuilderService() { + private val extensionName = "kotlinLombok" + + override fun canBuild(modelName: String?): Boolean = modelName == LombokModel::class.java.name + + override fun buildAll(modelName: String, project: Project, context: ModelBuilderContext): Any? { + if (project.plugins.findPlugin("kotlin-lombok") == null) return null + + val extension: Any = project.extensions.findByName(extensionName) ?: return null + + val configurationFile = extension.getFieldValue("configurationFile") as? File + return LombokModelImpl(configurationFile) + } + + override fun getErrorMessageBuilder(project: Project, e: Exception): ErrorMessageBuilder { + return ErrorMessageBuilder.create(project, e, "Gradle import errors") + .withDescription("Unable to build lombok plugin configuration") + } + + private fun Any.getFieldValue(fieldName: String, clazz: Class<*> = this.javaClass): Any? { + val field = clazz.declaredFields.firstOrNull { it.name == fieldName } + ?: return getFieldValue(fieldName, clazz.superclass ?: return null) + + val oldIsAccessible = field.isAccessible + try { + field.isAccessible = true + return field.get(this) + } finally { + field.isAccessible = oldIsAccessible + } + } +} diff --git a/idea/performanceTests/build.gradle.kts b/idea/performanceTests/build.gradle.kts index 5358c7a498b..d504c294b61 100644 --- a/idea/performanceTests/build.gradle.kts +++ b/idea/performanceTests/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { testRuntimeOnly(project(":kotlin-scripting-idea")) testRuntimeOnly(project(":kotlinx-serialization-ide-plugin")) testRuntimeOnly(project(":plugins:parcelize:parcelize-ide")) + testRuntimeOnly(project(":plugins:lombok:lombok-ide-plugin")) testRuntimeOnly(project(":nj2k:nj2k-services")) testRuntimeOnly(project(":kotlin-reflect")) testRuntimeOnly(project(":idea:kotlin-gradle-tooling")) @@ -172,4 +173,4 @@ projectTest(taskName = "fe10ProjectPerformanceTest") { } -testsJar() \ No newline at end of file +testsJar() diff --git a/idea/resources/META-INF/gradle-java.xml b/idea/resources/META-INF/gradle-java.xml index d9d6da351de..cde50622b92 100644 --- a/idea/resources/META-INF/gradle-java.xml +++ b/idea/resources/META-INF/gradle-java.xml @@ -17,6 +17,7 @@ + @@ -47,6 +48,7 @@ + diff --git a/idea/scripting-support/build.gradle.kts b/idea/scripting-support/build.gradle.kts index 219a941a658..5e30bf3f383 100644 --- a/idea/scripting-support/build.gradle.kts +++ b/idea/scripting-support/build.gradle.kts @@ -28,6 +28,7 @@ dependencies { testRuntime(project(":kotlinx-serialization-ide-plugin")) { isTransitive = false } testRuntime(project(":plugins:parcelize:parcelize-compiler")) testRuntime(project(":plugins:parcelize:parcelize-ide")) { isTransitive = false } + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(project(":idea:idea-android")) { isTransitive = false } @@ -50,4 +51,4 @@ projectTest(parallel = true) { workingDir = rootDir } -testsJar() \ No newline at end of file +testsJar() diff --git a/j2k/build.gradle.kts b/j2k/build.gradle.kts index 1e074a308c8..f2cd6e247f4 100644 --- a/j2k/build.gradle.kts +++ b/j2k/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { testRuntime(project(":kotlin-scripting-idea")) testRuntime(project(":kotlinx-serialization-ide-plugin")) testRuntime(project(":plugins:parcelize:parcelize-ide")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(intellijPluginDep("properties")) testRuntime(intellijPluginDep("gradle")) testRuntime(intellijPluginDep("Groovy")) diff --git a/libraries/tools/kotlin-gradle-plugin-model/src/main/kotlin/org/jetbrains/kotlin/gradle/model/Lombok.kt b/libraries/tools/kotlin-gradle-plugin-model/src/main/kotlin/org/jetbrains/kotlin/gradle/model/Lombok.kt new file mode 100644 index 00000000000..5e712bd18b3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-model/src/main/kotlin/org/jetbrains/kotlin/gradle/model/Lombok.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2021 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 java.io.File + +interface Lombok { + + /** + * @return Return a number representing the version of this API. + * Always increasing if changed. + */ + val modelVersion: Long + + /** + * @return the module (Gradle project) name + */ + val name: String + + /** + * Lombok configuration file + */ + val configurationFile: File? +} diff --git a/libraries/tools/kotlin-lombok/build.gradle.kts b/libraries/tools/kotlin-lombok/build.gradle.kts index d98df06a5e3..55880aac065 100644 --- a/libraries/tools/kotlin-lombok/build.gradle.kts +++ b/libraries/tools/kotlin-lombok/build.gradle.kts @@ -15,9 +15,7 @@ dependencies { api(project(":kotlin-gradle-plugin-model")) } -projectTest(parallel = true) { - workingDir = projectDir -} +projectTest(parallel = true) publish() diff --git a/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/LombokSubplugin.kt b/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/LombokSubplugin.kt index 8090da367f3..0be6c9cf233 100644 --- a/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/LombokSubplugin.kt +++ b/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/LombokSubplugin.kt @@ -7,15 +7,19 @@ package org.jetbrains.kotlin.lombok.gradle import org.gradle.api.Project import org.gradle.api.provider.Provider +import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.lombok.gradle.model.builder.LombokModelBuilder +import javax.inject.Inject -class LombokSubplugin : KotlinCompilerPluginSupportPlugin { +class LombokSubplugin @Inject internal constructor(private val registry: ToolingModelBuilderRegistry) : KotlinCompilerPluginSupportPlugin { override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean = (kotlinCompilation.platformType == KotlinPlatformType.jvm || kotlinCompilation.platformType == KotlinPlatformType.androidJvm) override fun apply(target: Project) { target.extensions.create("kotlinLombok", LombokExtension::class.java) + registry.register(LombokModelBuilder()) } override fun applyToCompilation(kotlinCompilation: KotlinCompilation<*>): Provider> { diff --git a/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/model/builder/LombokModelBuilder.kt b/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/model/builder/LombokModelBuilder.kt new file mode 100644 index 00000000000..3a58ca1d365 --- /dev/null +++ b/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/model/builder/LombokModelBuilder.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2021 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.lombok.gradle.model.builder + +import org.gradle.api.Project +import org.gradle.tooling.provider.model.ToolingModelBuilder +import org.jetbrains.kotlin.gradle.model.Lombok +import org.jetbrains.kotlin.lombok.gradle.LombokExtension +import org.jetbrains.kotlin.lombok.gradle.model.impl.LombokImpl + +class LombokModelBuilder : ToolingModelBuilder { + + override fun canBuild(modelName: String): Boolean = modelName == Lombok::class.java.name + + override fun buildAll(modelName: String, project: Project): Any? = + if (canBuild(modelName)) { + val extension = project.extensions.getByType(LombokExtension::class.java) + LombokImpl(project.name, extension.configurationFile) + } else { + null + } +} diff --git a/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/model/impl/LombokImpl.kt b/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/model/impl/LombokImpl.kt new file mode 100644 index 00000000000..2ccd8a0645d --- /dev/null +++ b/libraries/tools/kotlin-lombok/src/main/kotlin/org/jetbrains/kotlin/lombok/gradle/model/impl/LombokImpl.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2021 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.lombok.gradle.model.impl + +import org.jetbrains.kotlin.gradle.model.Lombok +import java.io.File +import java.io.Serializable + +data class LombokImpl(override val name: String, override val configurationFile: File?) : Lombok, Serializable { + + override val modelVersion: Long + get() = serialVersionUID + + companion object { + private const val serialVersionUID = 1L + } +} diff --git a/nj2k/build.gradle.kts b/nj2k/build.gradle.kts index f00dce65ee9..53b70d8cb26 100644 --- a/nj2k/build.gradle.kts +++ b/nj2k/build.gradle.kts @@ -37,6 +37,7 @@ dependencies { testRuntime(project(":kotlin-reflect")) testRuntime(project(":kotlinx-serialization-ide-plugin")) testRuntime(project(":plugins:parcelize:parcelize-ide")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) } sourceSets { diff --git a/plugins/allopen/allopen-ide/build.gradle.kts b/plugins/allopen/allopen-ide/build.gradle.kts index b9525cbb3f7..70c5ecde2ff 100644 --- a/plugins/allopen/allopen-ide/build.gradle.kts +++ b/plugins/allopen/allopen-ide/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { testCompileOnly(project(":kotlin-sam-with-receiver-compiler-plugin")) testCompileOnly(project(":noarg-ide-plugin")) testCompileOnly(project(":sam-with-receiver-ide-plugin")) + testCompileOnly(project(":plugins:lombok:lombok-ide-plugin")) testCompileOnly(project(":idea:idea-native")) testCompileOnly(project(":idea:idea-gradle-native")) testCompileOnly(projectTests(":idea:idea-test-framework")) diff --git a/plugins/android-extensions/android-extensions-idea/build.gradle.kts b/plugins/android-extensions/android-extensions-idea/build.gradle.kts index 24a776b5581..b1d8d4b6cc9 100644 --- a/plugins/android-extensions/android-extensions-idea/build.gradle.kts +++ b/plugins/android-extensions/android-extensions-idea/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { testRuntime(project(":kotlinx-serialization-ide-plugin")) testRuntime(project(":plugins:lint")) testRuntime(project(":plugins:parcelize:parcelize-ide")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(intellijPluginDep("junit")) testRuntime(intellijPluginDep("IntelliLang")) testRuntime(intellijPluginDep("properties")) diff --git a/plugins/annotation-based-compiler-plugins-ide-support/src/AbstractGradleImportHandler.kt b/plugins/annotation-based-compiler-plugins-ide-support/src/AbstractGradleImportHandler.kt index e1a45084334..75839a1cbd8 100644 --- a/plugins/annotation-based-compiler-plugins-ide-support/src/AbstractGradleImportHandler.kt +++ b/plugins/annotation-based-compiler-plugins-ide-support/src/AbstractGradleImportHandler.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2016 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. + * Copyright 2010-2021 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.annotation.plugin.ide @@ -70,4 +59,4 @@ abstract class AbstractGradleImportHandler : Gra private fun getPluginSetupBySourceSet(sourceSetNode: DataNode) = ExternalSystemApiUtil.findParent(sourceSetNode, ProjectKeys.MODULE)?.let { getPluginSetupByModule(it) } -} \ No newline at end of file +} diff --git a/plugins/base-compiler-plugins-ide-support/build.gradle.kts b/plugins/base-compiler-plugins-ide-support/build.gradle.kts new file mode 100644 index 00000000000..dc5baae53b4 --- /dev/null +++ b/plugins/base-compiler-plugins-ide-support/build.gradle.kts @@ -0,0 +1,26 @@ + +plugins { + kotlin("jvm") + id("jps-compatible") +} + +dependencies { + compile(project(":compiler:util")) + compile(project(":compiler:frontend")) + compile(project(":compiler:cli-common")) + compile(project(":idea")) + compile(project(":idea:idea-jvm")) + compile(project(":idea:idea-jps-common")) + compile(project(":idea:idea-gradle")) + compile(project(":idea:idea-maven")) + excludeInAndroidStudio(rootProject) { compileOnly(intellijPluginDep("maven")) } + compileOnly(intellijPluginDep("gradle")) + compileOnly(intellijDep()) + compileOnly(project(":idea:kotlin-gradle-tooling")) +} + +sourceSets { + "main" { projectDefault() } + "test" {} +} + diff --git a/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractGradleImportHandler.kt b/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractGradleImportHandler.kt new file mode 100644 index 00000000000..085cad23fb7 --- /dev/null +++ b/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractGradleImportHandler.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2021 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.plugin.ide + +import com.intellij.openapi.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.ProjectKeys +import com.intellij.openapi.externalSystem.model.project.ModuleData +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import com.intellij.openapi.util.Key +import org.jetbrains.kotlin.idea.configuration.GradleProjectImportHandler +import org.jetbrains.kotlin.idea.facet.KotlinFacet +import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData +import java.io.File + +abstract class AbstractGradleImportHandler : GradleProjectImportHandler { + + abstract val modelKey: Key + abstract val pluginJarFileFromIdea: File + abstract val compilerPluginId: String + abstract val pluginName: String + + abstract fun getOptions(model: T): List? + + override fun importBySourceSet(facet: KotlinFacet, sourceSetNode: DataNode) { + modifyCompilerArgumentsForPlugin( + facet, getPluginSetupBySourceSet(sourceSetNode), + compilerPluginId = compilerPluginId, + pluginName = pluginName + ) + } + + override fun importByModule(facet: KotlinFacet, moduleNode: DataNode) { + modifyCompilerArgumentsForPlugin( + facet, getPluginSetupByModule(moduleNode), + compilerPluginId = compilerPluginId, + pluginName = pluginName + ) + } + + private fun getPluginSetupByModule(moduleNode: DataNode): CompilerPluginSetup? { + val pluginModel = moduleNode.getCopyableUserData(modelKey) ?: return null + + val options = getOptions(pluginModel) ?: return null + // For now we can't use plugins from Gradle cause they're shaded and may have an incompatible version. + // So we use ones from the IDEA plugin. + val classpath = listOf(pluginJarFileFromIdea.absolutePath) + + return CompilerPluginSetup(options, classpath) + } + + private fun getPluginSetupBySourceSet(sourceSetNode: DataNode) = + ExternalSystemApiUtil.findParent(sourceSetNode, ProjectKeys.MODULE)?.let { getPluginSetupByModule(it) } +} diff --git a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/AbstractMavenImportHandler.kt b/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractMavenImportHandler.kt similarity index 94% rename from plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/AbstractMavenImportHandler.kt rename to plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractMavenImportHandler.kt index e54eff58221..85eadf7d0b3 100644 --- a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/AbstractMavenImportHandler.kt +++ b/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractMavenImportHandler.kt @@ -3,7 +3,7 @@ * 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.lombok.ide +package org.jetbrains.kotlin.plugin.ide import org.jdom.Element import org.jdom.Text @@ -13,12 +13,11 @@ import org.jetbrains.kotlin.idea.maven.MavenProjectImportHandler import org.jetbrains.kotlin.idea.maven.KotlinMavenImporter.Companion.KOTLIN_PLUGIN_GROUP_ID import org.jetbrains.kotlin.idea.maven.KotlinMavenImporter.Companion.KOTLIN_PLUGIN_ARTIFACT_ID import java.io.File -import org.jetbrains.kotlin.lombok.ide.CompilerPluginSetup.PluginOption +import org.jetbrains.kotlin.plugin.ide.CompilerPluginSetup.PluginOption abstract class AbstractMavenImportHandler : MavenProjectImportHandler { abstract val compilerPluginId: String abstract val pluginName: String -// abstract val mavenPluginArtifactName: String abstract val pluginJarFileFromIdea: File override fun invoke(facet: KotlinFacet, mavenProject: MavenProject) { diff --git a/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractMavenImportHandler.kt.as42 b/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/AbstractMavenImportHandler.kt.as42 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/idePluginUtils.kt b/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/idePluginUtils.kt similarity index 91% rename from plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/idePluginUtils.kt rename to plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/idePluginUtils.kt index 19e32472899..08041706942 100644 --- a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/idePluginUtils.kt +++ b/plugins/base-compiler-plugins-ide-support/src/org/jetbrains/kotlin/plugin/ide/idePluginUtils.kt @@ -3,12 +3,15 @@ * 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.lombok.ide +package org.jetbrains.kotlin.plugin.ide import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.idea.facet.KotlinFacet import java.io.File +//todo this is basically a copy-paste of the same file from annotation-based-compiler-plugins-ide-support +//and should be merged together later + class CompilerPluginSetup(val options: List, val classpath: List) { class PluginOption(val key: String, val value: String) } diff --git a/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts b/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts index 1677990b3f4..0ce906f36f3 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts +++ b/plugins/kotlin-serialization/kotlin-serialization-ide/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { testRuntime(project(":plugins:parcelize:parcelize-ide")) testRuntime(project(":sam-with-receiver-ide-plugin")) testRuntime(project(":noarg-ide-plugin")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testCompile(intellijDep()) testCompile(intellijPluginDep("java")) } diff --git a/plugins/lombok/lombok-ide-plugin/build.gradle.kts b/plugins/lombok/lombok-ide-plugin/build.gradle.kts index d2f934ab8c4..a75cf3b5422 100644 --- a/plugins/lombok/lombok-ide-plugin/build.gradle.kts +++ b/plugins/lombok/lombok-ide-plugin/build.gradle.kts @@ -7,6 +7,7 @@ plugins { dependencies { implementation(project(":plugins:lombok:lombok-compiler-plugin")) + implementation(project(":plugins:base-compiler-plugins-ide-support")) compileOnly(project(":idea")) compileOnly(project(":idea:idea-jvm")) diff --git a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokGradleProjectImportHandler.kt b/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokGradleProjectImportHandler.kt new file mode 100644 index 00000000000..cfe40a0c80d --- /dev/null +++ b/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokGradleProjectImportHandler.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2021 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.lombok.ide + +import com.intellij.openapi.util.Key +import org.jetbrains.kotlin.lombok.LombokCommandLineProcessor +import org.jetbrains.kotlin.lombok.LombokCommandLineProcessor.Companion.CONFIG_FILE_OPTION +import org.jetbrains.kotlin.plugin.ide.AbstractGradleImportHandler +import org.jetbrains.kotlin.plugin.ide.CompilerPluginSetup +import org.jetbrains.kotlin.utils.PathUtil +import java.io.File + +class LombokGradleProjectImportHandler : AbstractGradleImportHandler() { + + override val modelKey: Key = LombokGradleProjectResolverExtension.KEY + override val pluginJarFileFromIdea: File = PathUtil.kotlinPathsForIdeaPlugin.lombokPluginJarPath + override val compilerPluginId: String = LombokCommandLineProcessor.PLUGIN_ID + override val pluginName: String = "lombok" + + override fun getOptions(model: LombokModel): List = + listOfNotNull( + model.configurationFile?.let { + CompilerPluginSetup.PluginOption(CONFIG_FILE_OPTION.optionName, it.path) + } + ) +} diff --git a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokGradleProjectResolverExtension.kt b/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokGradleProjectResolverExtension.kt new file mode 100644 index 00000000000..4ca8b9249fc --- /dev/null +++ b/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokGradleProjectResolverExtension.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2021 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.lombok.ide + +import com.intellij.openapi.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.project.ModuleData +import com.intellij.openapi.util.Key +import org.gradle.tooling.model.idea.IdeaModule +import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension + +class LombokGradleProjectResolverExtension : AbstractProjectResolverExtension() { + + private val modelClass: Class = LombokModel::class.java + private val userDataKey: Key = KEY + + override fun getExtraProjectModelClasses() = setOf(modelClass) + + override fun getToolingExtensionsClasses() = setOf( + modelClass, + LombokGradleProjectResolverExtension::class.java, + Unit::class.java + ) + + override fun populateModuleExtraModels(gradleModule: IdeaModule, ideModule: DataNode) { + val model = resolverCtx.getExtraProject(gradleModule, modelClass) + + if (model != null) { + ideModule.putCopyableUserData(userDataKey, model) + } + + super.populateModuleExtraModels(gradleModule, ideModule) + } + + companion object { + val KEY = Key("LombokModel") + } + +} diff --git a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokMavenProjectImportHandler.kt b/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokMavenProjectImportHandler.kt index 1535a470777..922d3e89825 100644 --- a/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokMavenProjectImportHandler.kt +++ b/plugins/lombok/lombok-ide-plugin/src/org/jetbrains/kotlin/lombok/ide/LombokMavenProjectImportHandler.kt @@ -7,7 +7,8 @@ package org.jetbrains.kotlin.lombok.ide import org.jetbrains.kotlin.lombok.LombokCommandLineProcessor import org.jetbrains.kotlin.lombok.LombokCommandLineProcessor.Companion.CONFIG_FILE_OPTION -import org.jetbrains.kotlin.lombok.ide.CompilerPluginSetup.PluginOption +import org.jetbrains.kotlin.plugin.ide.AbstractMavenImportHandler +import org.jetbrains.kotlin.plugin.ide.CompilerPluginSetup.PluginOption import org.jetbrains.kotlin.utils.PathUtil import java.io.File diff --git a/plugins/uast-kotlin/build.gradle.kts b/plugins/uast-kotlin/build.gradle.kts index 53f7cc11a7e..49832224ac2 100644 --- a/plugins/uast-kotlin/build.gradle.kts +++ b/plugins/uast-kotlin/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { testRuntime(project(":plugins:kapt3-idea")) testRuntime(project(":kotlinx-serialization-ide-plugin")) testRuntime(project(":plugins:parcelize:parcelize-ide")) + testRuntime(project(":plugins:lombok:lombok-ide-plugin")) testRuntime(intellijDep()) testRuntime(intellijPluginDep("junit")) testRuntime(intellijPluginDep("gradle")) diff --git a/settings.gradle b/settings.gradle index f9d4aa9b142..1a1cd7ae951 100644 --- a/settings.gradle +++ b/settings.gradle @@ -212,6 +212,7 @@ include ":benchmarks", ":plugins:uast-kotlin", ":plugins:uast-kotlin-idea", ":plugins:annotation-based-compiler-plugins-ide-support", + ":plugins:base-compiler-plugins-ide-support", ":kotlin-script-runtime", ":plugins:fir:fir-plugin-prototype", ":plugins:fir:fir-plugin-prototype:plugin-annotations",