From 0b8c497d2eb00afe082edeaa0ff2205532195e93 Mon Sep 17 00:00:00 2001 From: Yaroslav Chernyshev Date: Mon, 13 Apr 2020 19:20:30 +0300 Subject: [PATCH] [Import] Downgrade jvmTarget & move Models and ModelBuilderServices Fixed KT-35921 Fixed KT-36673 --- idea/idea-gradle-tooling-api/build.gradle.kts | 1 + idea/kotlin-gradle-tooling/build.gradle.kts | 3 +- ...plugins.gradle.tooling.ModelBuilderService | 4 + .../allopen/ide/AllOpenModelBuilderService.kt | 34 +++++ ...nnotationBasedPluginModelBuilderService.kt | 100 ++++++++++++++ .../kapt/idea/KaptModelBuilderService.kt | 127 ++++++++++++++++++ .../noarg/ide/NoArgModelBuilderService.kt | 36 +++++ .../ide/SamWithReceiverModelBuilderService.kt | 34 +++++ plugins/allopen/allopen-ide/build.gradle.kts | 1 + ...plugins.gradle.tooling.ModelBuilderService | 1 - ....kt => AllOpenProjectResolverExtension.kt} | 21 --- .../build.gradle.kts | 3 +- ...tionBasedPluginProjectResolverExtension.kt | 95 +------------ ...plugins.gradle.tooling.ModelBuilderService | 1 - .../kapt/idea/KaptProjectResolverExtension.kt | 119 ---------------- plugins/noarg/noarg-ide/build.gradle.kts | 1 + ...plugins.gradle.tooling.ModelBuilderService | 1 - .../noarg-ide/src/NoArgModelBuilderService.kt | 54 -------- .../src/NoArgProjectResolverExtension.kt | 29 ++++ .../sam-with-receiver-ide/build.gradle.kts | 1 + ...plugins.gradle.tooling.ModelBuilderService | 1 - ...amWithReceiverProjectResolverExtension.kt} | 21 --- 22 files changed, 373 insertions(+), 315 deletions(-) create mode 100644 idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/allopen/ide/AllOpenModelBuilderService.kt create mode 100644 idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/annotation/plugin/ide/AnnotationBasedPluginModelBuilderService.kt create mode 100644 idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/kapt/idea/KaptModelBuilderService.kt create mode 100644 idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/noarg/ide/NoArgModelBuilderService.kt create mode 100644 idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/samWithReceiver/ide/SamWithReceiverModelBuilderService.kt delete mode 100644 plugins/allopen/allopen-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService rename plugins/allopen/allopen-ide/src/{AllOpenModelBuilderService.kt => AllOpenProjectResolverExtension.kt} (54%) delete mode 100644 plugins/kapt3/kapt3-idea/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService delete mode 100644 plugins/noarg/noarg-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService delete mode 100644 plugins/noarg/noarg-ide/src/NoArgModelBuilderService.kt create mode 100644 plugins/noarg/noarg-ide/src/NoArgProjectResolverExtension.kt delete mode 100644 plugins/sam-with-receiver/sam-with-receiver-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService rename plugins/sam-with-receiver/sam-with-receiver-ide/src/{SamWithReceiverModelBuilderService.kt => SamWithReceiverProjectResolverExtension.kt} (53%) diff --git a/idea/idea-gradle-tooling-api/build.gradle.kts b/idea/idea-gradle-tooling-api/build.gradle.kts index ed9d74a21ff..f2d52bd5105 100644 --- a/idea/idea-gradle-tooling-api/build.gradle.kts +++ b/idea/idea-gradle-tooling-api/build.gradle.kts @@ -2,6 +2,7 @@ plugins { kotlin("jvm") id("jps-compatible") } +jvmTarget = "1.6" // BUNCH 193: this module is no longer needed since IDEA 2020.1 Platform[193].orLower { diff --git a/idea/kotlin-gradle-tooling/build.gradle.kts b/idea/kotlin-gradle-tooling/build.gradle.kts index c2f17b5106b..f716b85ac90 100644 --- a/idea/kotlin-gradle-tooling/build.gradle.kts +++ b/idea/kotlin-gradle-tooling/build.gradle.kts @@ -1,4 +1,3 @@ - description = "Kotlin Gradle Tooling support" plugins { @@ -6,6 +5,8 @@ plugins { id("jps-compatible") } +jvmTarget = "1.6" + dependencies { compile(kotlinStdlib()) 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 d35ac4b4278..492bb1188f8 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 @@ -1,3 +1,7 @@ org.jetbrains.kotlin.gradle.KotlinGradleModelBuilder org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder org.jetbrains.kotlin.gradle.KotlinCocoaPodsModelBuilder +org.jetbrains.kotlin.allopen.ide.AllOpenModelBuilderService +org.jetbrains.kotlin.kapt.idea.KaptModelBuilderService +org.jetbrains.kotlin.noarg.ide.NoArgModelBuilderService +org.jetbrains.kotlin.samWithReceiver.ide.SamWithReceiverModelBuilderService \ No newline at end of file diff --git a/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/allopen/ide/AllOpenModelBuilderService.kt b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/allopen/ide/AllOpenModelBuilderService.kt new file mode 100644 index 00000000000..a1f0af41638 --- /dev/null +++ b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/allopen/ide/AllOpenModelBuilderService.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2020 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.allopen.ide + +import org.jetbrains.kotlin.annotation.plugin.ide.AnnotationBasedPluginModel +import org.jetbrains.kotlin.annotation.plugin.ide.AnnotationBasedPluginModelBuilderService +import org.jetbrains.kotlin.annotation.plugin.ide.DumpedPluginModel +import org.jetbrains.kotlin.annotation.plugin.ide.DumpedPluginModelImpl + + +interface AllOpenModel : AnnotationBasedPluginModel { + override fun dump(): DumpedPluginModel { + return DumpedPluginModelImpl(AllOpenModelImpl::class.java, annotations.toList(), presets.toList()) + } +} + +class AllOpenModelImpl( + override val annotations: List, + override val presets: List +) : AllOpenModel + +class AllOpenModelBuilderService : AnnotationBasedPluginModelBuilderService() { + override val gradlePluginNames get() = listOf("org.jetbrains.kotlin.plugin.allopen", "kotlin-allopen") + override val extensionName get() = "allOpen" + override val modelClass get() = AllOpenModel::class.java + + override fun createModel(annotations: List, presets: List, extension: Any?): AllOpenModelImpl { + return AllOpenModelImpl(annotations, presets) + } +} + diff --git a/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/annotation/plugin/ide/AnnotationBasedPluginModelBuilderService.kt b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/annotation/plugin/ide/AnnotationBasedPluginModelBuilderService.kt new file mode 100644 index 00000000000..512195cabbc --- /dev/null +++ b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/annotation/plugin/ide/AnnotationBasedPluginModelBuilderService.kt @@ -0,0 +1,100 @@ +/* + * Copyright 2010-2020 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 + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder +import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder +import java.io.Serializable +import java.lang.Exception + +interface DumpedPluginModel { + val className: String + + // May contain primitives, Strings and collections of primitives/Strings + val args: Array<*> + + operator fun component1() = className + operator fun component2() = args +} + +class DumpedPluginModelImpl( + override val className: String, + override val args: Array<*> +) : DumpedPluginModel, Serializable { + constructor(clazz: Class<*>, vararg args: Any?) : this(clazz.canonicalName, args) +} + +interface AnnotationBasedPluginModel : Serializable { + val annotations: List + val presets: List + + /* + Objects returned from Gradle importer are implicitly wrapped in a proxy that can potentially leak internal Gradle structures. + So we need a way to safely serialize the arbitrary annotation plugin model. + */ + fun dump(): DumpedPluginModel + + val isEnabled get() = annotations.isNotEmpty() || presets.isNotEmpty() +} + +abstract class AnnotationBasedPluginModelBuilderService : AbstractKotlinGradleModelBuilder() { + abstract val gradlePluginNames: List + abstract val extensionName: String + + abstract val modelClass: Class + abstract fun createModel(annotations: List, presets: List, extension: Any?): T + + override fun getErrorMessageBuilder(project: Project, e: Exception): ErrorMessageBuilder { + return ErrorMessageBuilder.create(project, e, "Gradle import errors") + .withDescription("Unable to build $gradlePluginNames plugin configuration") + } + + override fun canBuild(modelName: String?): Boolean = modelName == modelClass.name + + override fun buildAll(modelName: String?, project: Project): Any { + val plugin: Plugin<*>? = project.findPlugin(gradlePluginNames) + val extension: Any? = project.extensions.findByName(extensionName) + + val annotations = mutableListOf() + val presets = mutableListOf() + + if (plugin != null && extension != null) { + annotations += extension.getList("myAnnotations") + presets += extension.getList("myPresets") + return createModel(annotations, presets, extension) + } + + return createModel(emptyList(), emptyList(), null) + } + + private fun Project.findPlugin(names: List): Plugin<*>? { + for (name in names) { + plugins.findPlugin(name)?.let { return it } + } + + return null + } + + private fun Any.getList(fieldName: String): List { + @Suppress("UNCHECKED_CAST") + return getFieldValue(fieldName) as? List ?: emptyList() + } + + protected 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 + } + } +} \ No newline at end of file diff --git a/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/kapt/idea/KaptModelBuilderService.kt b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/kapt/idea/KaptModelBuilderService.kt new file mode 100644 index 00000000000..91af2737213 --- /dev/null +++ b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/kapt/idea/KaptModelBuilderService.kt @@ -0,0 +1,127 @@ +/* + * Copyright 2010-2020 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.kapt.idea + +import org.gradle.api.Named +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.Task +import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder +import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder +import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder.Companion.getTargets +import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder +import java.io.File +import java.io.Serializable +import java.lang.Exception +import java.lang.reflect.Modifier + +interface KaptSourceSetModel : Serializable { + val sourceSetName: String + val isTest: Boolean + val generatedSourcesDir: String + val generatedClassesDir: String + val generatedKotlinSourcesDir: String + + val generatedSourcesDirFile get() = generatedSourcesDir.takeIf { it.isNotEmpty() }?.let(::File) + val generatedClassesDirFile get() = generatedClassesDir.takeIf { it.isNotEmpty() }?.let(::File) + val generatedKotlinSourcesDirFile get() = generatedKotlinSourcesDir.takeIf { it.isNotEmpty() }?.let(::File) +} + +class KaptSourceSetModelImpl( + override val sourceSetName: String, + override val isTest: Boolean, + override val generatedSourcesDir: String, + override val generatedClassesDir: String, + override val generatedKotlinSourcesDir: String +) : KaptSourceSetModel + +interface KaptGradleModel : Serializable { + val isEnabled: Boolean + val buildDirectory: File + val sourceSets: List +} + +class KaptGradleModelImpl( + override val isEnabled: Boolean, + override val buildDirectory: File, + override val sourceSets: List +) : KaptGradleModel + + +class KaptModelBuilderService : AbstractKotlinGradleModelBuilder() { + override fun getErrorMessageBuilder(project: Project, e: Exception): ErrorMessageBuilder { + return ErrorMessageBuilder.create(project, e, "Gradle import errors") + .withDescription("Unable to build kotlin-kapt plugin configuration") + } + + override fun canBuild(modelName: String?): Boolean = modelName == KaptGradleModel::class.java.name + + override fun buildAll(modelName: String?, project: Project): Any { + val kaptPlugin: Plugin<*>? = project.plugins.findPlugin("kotlin-kapt") + val kaptIsEnabled = kaptPlugin != null + + val sourceSets = mutableListOf() + + if (kaptIsEnabled) { + val targets = project.getTargets() + + fun handleCompileTask(moduleName: String, compileTask: Task) { + if (compileTask.javaClass.name !in kotlinCompileJvmTaskClasses) { + return + } + + val sourceSetName = compileTask.getSourceSetName() + val isTest = sourceSetName.toLowerCase().endsWith("test") + + val kaptGeneratedSourcesDir = getKaptDirectory("getKaptGeneratedSourcesDir", project, sourceSetName) + val kaptGeneratedClassesDir = getKaptDirectory("getKaptGeneratedClassesDir", project, sourceSetName) + val kaptGeneratedKotlinSourcesDir = getKaptDirectory("getKaptGeneratedKotlinSourcesDir", project, sourceSetName) + sourceSets += KaptSourceSetModelImpl( + moduleName, isTest, kaptGeneratedSourcesDir, kaptGeneratedClassesDir, kaptGeneratedKotlinSourcesDir + ) + } + + if (targets != null && targets.isNotEmpty()) { + for (target in targets) { + if (!isWithJavaEnabled(target)) { + continue + } + + val compilations = KotlinMPPGradleModelBuilder.getCompilations(target) ?: continue + for (compilation in compilations) { + val compileTask = KotlinMPPGradleModelBuilder.getCompileKotlinTaskName(project, compilation) ?: continue + val moduleName = target.name + compilation.name.capitalize() + handleCompileTask(moduleName, compileTask) + } + } + } else { + project.getAllTasks(false)[project]?.forEach { compileTask -> + val sourceSetName = compileTask.getSourceSetName() + handleCompileTask(sourceSetName, compileTask) + } + } + } + + return KaptGradleModelImpl(kaptIsEnabled, project.buildDir, sourceSets) + } + + private fun isWithJavaEnabled(target: Named): Boolean { + val getWithJavaEnabledMethod = target.javaClass.methods + .firstOrNull { it.name == "getWithJavaEnabled" && it.parameterCount == 0 } ?: return false + + return getWithJavaEnabledMethod.invoke(target) == true + } + + private fun getKaptDirectory(funName: String, project: Project, sourceSetName: String): String { + val kotlinKaptPlugin = project.plugins.findPlugin("kotlin-kapt") ?: return "" + + val targetMethod = kotlinKaptPlugin::class.java.methods.firstOrNull { + Modifier.isStatic(it.modifiers) && it.name == funName && it.parameterCount == 2 + } ?: return "" + + return (targetMethod(null, project, sourceSetName) as? File)?.absolutePath ?: "" + } +} \ No newline at end of file diff --git a/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/noarg/ide/NoArgModelBuilderService.kt b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/noarg/ide/NoArgModelBuilderService.kt new file mode 100644 index 00000000000..dec68de508a --- /dev/null +++ b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/noarg/ide/NoArgModelBuilderService.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2020 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.noarg.ide + +import org.jetbrains.kotlin.annotation.plugin.ide.AnnotationBasedPluginModel +import org.jetbrains.kotlin.annotation.plugin.ide.AnnotationBasedPluginModelBuilderService +import org.jetbrains.kotlin.annotation.plugin.ide.DumpedPluginModel +import org.jetbrains.kotlin.annotation.plugin.ide.DumpedPluginModelImpl + +interface NoArgModel : AnnotationBasedPluginModel { + val invokeInitializers: Boolean + + override fun dump(): DumpedPluginModel { + return DumpedPluginModelImpl(NoArgModelImpl::class.java, annotations.toList(), presets.toList(), invokeInitializers) + } +} + +class NoArgModelImpl( + override val annotations: List, + override val presets: List, + override val invokeInitializers: Boolean +) : NoArgModel + +class NoArgModelBuilderService : AnnotationBasedPluginModelBuilderService() { + override val gradlePluginNames get() = listOf("org.jetbrains.kotlin.plugin.noarg", "kotlin-noarg") + override val extensionName get() = "noArg" + override val modelClass get() = NoArgModel::class.java + + override fun createModel(annotations: List, presets: List, extension: Any?): NoArgModel { + val invokeInitializers = extension?.getFieldValue("invokeInitializers") as? Boolean ?: false + return NoArgModelImpl(annotations, presets, invokeInitializers) + } +} diff --git a/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/samWithReceiver/ide/SamWithReceiverModelBuilderService.kt b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/samWithReceiver/ide/SamWithReceiverModelBuilderService.kt new file mode 100644 index 00000000000..6f98fb4e28e --- /dev/null +++ b/idea/kotlin-gradle-tooling/src/org/jetbrains/kotlin/samWithReceiver/ide/SamWithReceiverModelBuilderService.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2020 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.samWithReceiver.ide + +import org.jetbrains.kotlin.annotation.plugin.ide.AnnotationBasedPluginModel +import org.jetbrains.kotlin.annotation.plugin.ide.AnnotationBasedPluginModelBuilderService +import org.jetbrains.kotlin.annotation.plugin.ide.DumpedPluginModel +import org.jetbrains.kotlin.annotation.plugin.ide.DumpedPluginModelImpl + +interface SamWithReceiverModel : AnnotationBasedPluginModel { + override fun dump(): DumpedPluginModel { + return DumpedPluginModelImpl(SamWithReceiverModelImpl::class.java, annotations.toList(), presets.toList()) + } +} + +class SamWithReceiverModelImpl( + override val annotations: List, + override val presets: List +) : SamWithReceiverModel + + +class SamWithReceiverModelBuilderService : AnnotationBasedPluginModelBuilderService() { + override val gradlePluginNames get() = listOf("org.jetbrains.kotlin.plugin.sam.with.receiver", "kotlin-sam-with-receiver") + override val extensionName get() = "samWithReceiver" + override val modelClass get() = SamWithReceiverModel::class.java + + override fun createModel(annotations: List, presets: List, extension: Any?): SamWithReceiverModelImpl { + return SamWithReceiverModelImpl(annotations, presets) + } +} + diff --git a/plugins/allopen/allopen-ide/build.gradle.kts b/plugins/allopen/allopen-ide/build.gradle.kts index 340eb114ce5..184652efdad 100644 --- a/plugins/allopen/allopen-ide/build.gradle.kts +++ b/plugins/allopen/allopen-ide/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { compileOnly(intellijDep()) excludeInAndroidStudio(rootProject) { compileOnly(intellijPluginDep("maven")) } compileOnly(intellijPluginDep("gradle")) + compileOnly(project(":idea:kotlin-gradle-tooling")) testRuntime(project(":kotlin-reflect")) diff --git a/plugins/allopen/allopen-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService b/plugins/allopen/allopen-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService deleted file mode 100644 index 1da9e7c5776..00000000000 --- a/plugins/allopen/allopen-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.kotlin.allopen.ide.AllOpenModelBuilderService \ No newline at end of file diff --git a/plugins/allopen/allopen-ide/src/AllOpenModelBuilderService.kt b/plugins/allopen/allopen-ide/src/AllOpenProjectResolverExtension.kt similarity index 54% rename from plugins/allopen/allopen-ide/src/AllOpenModelBuilderService.kt rename to plugins/allopen/allopen-ide/src/AllOpenProjectResolverExtension.kt index 76f3e33b8a5..9157e83ada8 100644 --- a/plugins/allopen/allopen-ide/src/AllOpenModelBuilderService.kt +++ b/plugins/allopen/allopen-ide/src/AllOpenProjectResolverExtension.kt @@ -19,27 +19,6 @@ package org.jetbrains.kotlin.allopen.ide import com.intellij.openapi.util.Key import org.jetbrains.kotlin.annotation.plugin.ide.* -interface AllOpenModel : AnnotationBasedPluginModel { - override fun dump(): DumpedPluginModel { - return DumpedPluginModelImpl(AllOpenModelImpl::class.java, annotations.toList(), presets.toList()) - } -} - -class AllOpenModelImpl( - override val annotations: List, - override val presets: List -) : AllOpenModel - -class AllOpenModelBuilderService : AnnotationBasedPluginModelBuilderService() { - override val gradlePluginNames get() = listOf("org.jetbrains.kotlin.plugin.allopen", "kotlin-allopen") - override val extensionName get() = "allOpen" - override val modelClass get() = AllOpenModel::class.java - - override fun createModel(annotations: List, presets: List, extension: Any?): AllOpenModelImpl { - return AllOpenModelImpl(annotations, presets) - } -} - class AllOpenProjectResolverExtension : AnnotationBasedPluginProjectResolverExtension() { companion object { val KEY = Key("AllOpenModel") diff --git a/plugins/annotation-based-compiler-plugins-ide-support/build.gradle.kts b/plugins/annotation-based-compiler-plugins-ide-support/build.gradle.kts index 51248eec1ef..dc5baae53b4 100644 --- a/plugins/annotation-based-compiler-plugins-ide-support/build.gradle.kts +++ b/plugins/annotation-based-compiler-plugins-ide-support/build.gradle.kts @@ -16,7 +16,8 @@ dependencies { excludeInAndroidStudio(rootProject) { compileOnly(intellijPluginDep("maven")) } compileOnly(intellijPluginDep("gradle")) compileOnly(intellijDep()) - } + compileOnly(project(":idea:kotlin-gradle-tooling")) +} sourceSets { "main" { projectDefault() } diff --git a/plugins/annotation-based-compiler-plugins-ide-support/src/AnnotationBasedPluginProjectResolverExtension.kt b/plugins/annotation-based-compiler-plugins-ide-support/src/AnnotationBasedPluginProjectResolverExtension.kt index af802c09fc0..9fa052e5881 100644 --- a/plugins/annotation-based-compiler-plugins-ide-support/src/AnnotationBasedPluginProjectResolverExtension.kt +++ b/plugins/annotation-based-compiler-plugins-ide-support/src/AnnotationBasedPluginProjectResolverExtension.kt @@ -18,46 +18,10 @@ package org.jetbrains.kotlin.annotation.plugin.ide import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.externalSystem.model.DataNode -import com.intellij.openapi.externalSystem.model.project.* +import com.intellij.openapi.externalSystem.model.project.ModuleData import com.intellij.openapi.util.Key -import org.gradle.api.Plugin -import org.gradle.api.Project import org.gradle.tooling.model.idea.IdeaModule -import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension -import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder -import java.io.Serializable -import java.lang.Exception - -interface DumpedPluginModel { - val className: String - - // May contain primitives, Strings and collections of primitives/Strings - val args: Array<*> - - operator fun component1() = className - operator fun component2() = args -} - -class DumpedPluginModelImpl( - override val className: String, - override val args: Array<*> -) : DumpedPluginModel, Serializable { - constructor(clazz: Class<*>, vararg args: Any?) : this(clazz.canonicalName, args) -} - -interface AnnotationBasedPluginModel : Serializable { - val annotations: List - val presets: List - - /* - Objects returned from Gradle importer are implicitly wrapped in a proxy that can potentially leak internal Gradle structures. - So we need a way to safely serialize the arbitrary annotation plugin model. - */ - fun dump(): DumpedPluginModel - - val isEnabled get() = annotations.isNotEmpty() || presets.isNotEmpty() -} @Suppress("unused") abstract class AnnotationBasedPluginProjectResolverExtension : AbstractProjectResolverExtension() { @@ -90,60 +54,3 @@ abstract class AnnotationBasedPluginProjectResolverExtension : AbstractKotlinGradleModelBuilder() { - abstract val gradlePluginNames: List - abstract val extensionName: String - - abstract val modelClass: Class - abstract fun createModel(annotations: List, presets: List, extension: Any?): T - - override fun getErrorMessageBuilder(project: Project, e: Exception): ErrorMessageBuilder { - return ErrorMessageBuilder.create(project, e, "Gradle import errors") - .withDescription("Unable to build $gradlePluginNames plugin configuration") - } - - override fun canBuild(modelName: String?): Boolean = modelName == modelClass.name - - override fun buildAll(modelName: String?, project: Project): Any { - val plugin: Plugin<*>? = project.findPlugin(gradlePluginNames) - val extension: Any? = project.extensions.findByName(extensionName) - - val annotations = mutableListOf() - val presets = mutableListOf() - - if (plugin != null && extension != null) { - annotations += extension.getList("myAnnotations") - presets += extension.getList("myPresets") - return createModel(annotations, presets, extension) - } - - return createModel(emptyList(), emptyList(), null) - } - - private fun Project.findPlugin(names: List): Plugin<*>? { - for (name in names) { - plugins.findPlugin(name)?.let { return it } - } - - return null - } - - private fun Any.getList(fieldName: String): List { - @Suppress("UNCHECKED_CAST") - return getFieldValue(fieldName) as? List ?: emptyList() - } - - protected 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 - } - } -} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-idea/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService b/plugins/kapt3/kapt3-idea/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService deleted file mode 100644 index 310ea0a40cf..00000000000 --- a/plugins/kapt3/kapt3-idea/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.kotlin.kapt.idea.KaptModelBuilderService \ No newline at end of file diff --git a/plugins/kapt3/kapt3-idea/src/org/jetbrains/kotlin/kapt/idea/KaptProjectResolverExtension.kt b/plugins/kapt3/kapt3-idea/src/org/jetbrains/kotlin/kapt/idea/KaptProjectResolverExtension.kt index 918378c9d1c..8577d4ab4fe 100644 --- a/plugins/kapt3/kapt3-idea/src/org/jetbrains/kotlin/kapt/idea/KaptProjectResolverExtension.kt +++ b/plugins/kapt3/kapt3-idea/src/org/jetbrains/kotlin/kapt/idea/KaptProjectResolverExtension.kt @@ -20,55 +20,10 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.externalSystem.model.DataNode import com.intellij.openapi.externalSystem.model.ProjectKeys import com.intellij.openapi.externalSystem.model.project.* -import org.gradle.api.Named -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.tooling.model.idea.IdeaModule -import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder -import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder.Companion.getCompilations -import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder.Companion.getCompileKotlinTaskName -import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder.Companion.getTargets import org.jetbrains.kotlin.idea.framework.GRADLE_SYSTEM_ID import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension -import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder -import java.io.File -import java.io.Serializable -import java.lang.Exception -import java.lang.reflect.Modifier - -interface KaptSourceSetModel : Serializable { - val sourceSetName: String - val isTest: Boolean - val generatedSourcesDir: String - val generatedClassesDir: String - val generatedKotlinSourcesDir: String - - val generatedSourcesDirFile get() = generatedSourcesDir.takeIf { it.isNotEmpty() }?.let(::File) - val generatedClassesDirFile get() = generatedClassesDir.takeIf { it.isNotEmpty() }?.let(::File) - val generatedKotlinSourcesDirFile get() = generatedKotlinSourcesDir.takeIf { it.isNotEmpty() }?.let(::File) -} - -class KaptSourceSetModelImpl( - override val sourceSetName: String, - override val isTest: Boolean, - override val generatedSourcesDir: String, - override val generatedClassesDir: String, - override val generatedKotlinSourcesDir: String -) : KaptSourceSetModel - -interface KaptGradleModel : Serializable { - val isEnabled: Boolean - val buildDirectory: File - val sourceSets: List -} - -class KaptGradleModelImpl( - override val isEnabled: Boolean, - override val buildDirectory: File, - override val sourceSets: List -) : KaptGradleModel @Suppress("unused") class KaptProjectResolverExtension : AbstractProjectResolverExtension() { @@ -130,77 +85,3 @@ class KaptProjectResolverExtension : AbstractProjectResolverExtension() { } } -class KaptModelBuilderService : AbstractKotlinGradleModelBuilder() { - override fun getErrorMessageBuilder(project: Project, e: Exception): ErrorMessageBuilder { - return ErrorMessageBuilder.create(project, e, "Gradle import errors") - .withDescription("Unable to build kotlin-kapt plugin configuration") - } - - override fun canBuild(modelName: String?): Boolean = modelName == KaptGradleModel::class.java.name - - override fun buildAll(modelName: String?, project: Project): Any { - val kaptPlugin: Plugin<*>? = project.plugins.findPlugin("kotlin-kapt") - val kaptIsEnabled = kaptPlugin != null - - val sourceSets = mutableListOf() - - if (kaptIsEnabled) { - val targets = project.getTargets() - - fun handleCompileTask(moduleName: String, compileTask: Task) { - if (compileTask.javaClass.name !in kotlinCompileJvmTaskClasses) { - return - } - - val sourceSetName = compileTask.getSourceSetName() - val isTest = sourceSetName.toLowerCase().endsWith("test") - - val kaptGeneratedSourcesDir = getKaptDirectory("getKaptGeneratedSourcesDir", project, sourceSetName) - val kaptGeneratedClassesDir = getKaptDirectory("getKaptGeneratedClassesDir", project, sourceSetName) - val kaptGeneratedKotlinSourcesDir = getKaptDirectory("getKaptGeneratedKotlinSourcesDir", project, sourceSetName) - sourceSets += KaptSourceSetModelImpl( - moduleName, isTest, kaptGeneratedSourcesDir, kaptGeneratedClassesDir, kaptGeneratedKotlinSourcesDir - ) - } - - if (targets != null && targets.isNotEmpty()) { - for (target in targets) { - if (!isWithJavaEnabled(target)) { - continue - } - - val compilations = getCompilations(target) ?: continue - for (compilation in compilations) { - val compileTask = getCompileKotlinTaskName(project, compilation) ?: continue - val moduleName = target.name + compilation.name.capitalize() - handleCompileTask(moduleName, compileTask) - } - } - } else { - project.getAllTasks(false)[project]?.forEach { compileTask -> - val sourceSetName = compileTask.getSourceSetName() - handleCompileTask(sourceSetName, compileTask) - } - } - } - - return KaptGradleModelImpl(kaptIsEnabled, project.buildDir, sourceSets) - } - - private fun isWithJavaEnabled(target: Named): Boolean { - val getWithJavaEnabledMethod = target.javaClass.methods - .firstOrNull { it.name == "getWithJavaEnabled" && it.parameterCount == 0 } ?: return false - - return getWithJavaEnabledMethod.invoke(target) == true - } - - private fun getKaptDirectory(funName: String, project: Project, sourceSetName: String): String { - val kotlinKaptPlugin = project.plugins.findPlugin("kotlin-kapt") ?: return "" - - val targetMethod = kotlinKaptPlugin::class.java.methods.firstOrNull { - Modifier.isStatic(it.modifiers) && it.name == funName && it.parameterCount == 2 - } ?: return "" - - return (targetMethod(null, project, sourceSetName) as? File)?.absolutePath ?: "" - } -} \ No newline at end of file diff --git a/plugins/noarg/noarg-ide/build.gradle.kts b/plugins/noarg/noarg-ide/build.gradle.kts index d9445012ce9..007cabd6d1d 100644 --- a/plugins/noarg/noarg-ide/build.gradle.kts +++ b/plugins/noarg/noarg-ide/build.gradle.kts @@ -20,6 +20,7 @@ dependencies { compileOnly(intellijDep()) excludeInAndroidStudio(rootProject) { compileOnly(intellijPluginDep("maven")) } compileOnly(intellijPluginDep("gradle")) + compileOnly(project(":idea:kotlin-gradle-tooling")) testRuntime(project(":kotlin-reflect")) diff --git a/plugins/noarg/noarg-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService b/plugins/noarg/noarg-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService deleted file mode 100644 index ae51c6db34e..00000000000 --- a/plugins/noarg/noarg-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.kotlin.noarg.ide.NoArgModelBuilderService \ No newline at end of file diff --git a/plugins/noarg/noarg-ide/src/NoArgModelBuilderService.kt b/plugins/noarg/noarg-ide/src/NoArgModelBuilderService.kt deleted file mode 100644 index f26c79d2094..00000000000 --- a/plugins/noarg/noarg-ide/src/NoArgModelBuilderService.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 org.jetbrains.kotlin.noarg.ide - -import com.intellij.openapi.util.Key -import org.jetbrains.kotlin.annotation.plugin.ide.* - -interface NoArgModel : AnnotationBasedPluginModel { - val invokeInitializers: Boolean - - override fun dump(): DumpedPluginModel { - return DumpedPluginModelImpl(NoArgModelImpl::class.java, annotations.toList(), presets.toList(), invokeInitializers) - } -} - -class NoArgModelImpl( - override val annotations: List, - override val presets: List, - override val invokeInitializers: Boolean -) : NoArgModel - -class NoArgModelBuilderService : AnnotationBasedPluginModelBuilderService() { - override val gradlePluginNames get() = listOf("org.jetbrains.kotlin.plugin.noarg", "kotlin-noarg") - override val extensionName get() = "noArg" - override val modelClass get() = NoArgModel::class.java - - override fun createModel(annotations: List, presets: List, extension: Any?): NoArgModel { - val invokeInitializers = extension?.getFieldValue("invokeInitializers") as? Boolean ?: false - return NoArgModelImpl(annotations, presets, invokeInitializers) - } -} - -class NoArgProjectResolverExtension : AnnotationBasedPluginProjectResolverExtension() { - companion object { - val KEY = Key("NoArgModel") - } - - override val modelClass get() = NoArgModel::class.java - override val userDataKey get() = KEY -} \ No newline at end of file diff --git a/plugins/noarg/noarg-ide/src/NoArgProjectResolverExtension.kt b/plugins/noarg/noarg-ide/src/NoArgProjectResolverExtension.kt new file mode 100644 index 00000000000..7fb4c93d389 --- /dev/null +++ b/plugins/noarg/noarg-ide/src/NoArgProjectResolverExtension.kt @@ -0,0 +1,29 @@ +/* + * 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 org.jetbrains.kotlin.noarg.ide + +import com.intellij.openapi.util.Key +import org.jetbrains.kotlin.annotation.plugin.ide.* + +class NoArgProjectResolverExtension : AnnotationBasedPluginProjectResolverExtension() { + companion object { + val KEY = Key("NoArgModel") + } + + override val modelClass get() = NoArgModel::class.java + override val userDataKey get() = KEY +} \ No newline at end of file diff --git a/plugins/sam-with-receiver/sam-with-receiver-ide/build.gradle.kts b/plugins/sam-with-receiver/sam-with-receiver-ide/build.gradle.kts index bbfdb40ecf2..240d0eaf462 100644 --- a/plugins/sam-with-receiver/sam-with-receiver-ide/build.gradle.kts +++ b/plugins/sam-with-receiver/sam-with-receiver-ide/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { } compileOnly(intellijDep()) { includeJars("platform-api", "extensions", "util") } compileOnly(intellijDep("gradle")) + compileOnly(project(":idea:kotlin-gradle-tooling")) } sourceSets { diff --git a/plugins/sam-with-receiver/sam-with-receiver-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService b/plugins/sam-with-receiver/sam-with-receiver-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService deleted file mode 100644 index 4317479395c..00000000000 --- a/plugins/sam-with-receiver/sam-with-receiver-ide/resources/META-INF/services/org.jetbrains.plugins.gradle.tooling.ModelBuilderService +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.kotlin.samWithReceiver.ide.SamWithReceiverModelBuilderService \ No newline at end of file diff --git a/plugins/sam-with-receiver/sam-with-receiver-ide/src/SamWithReceiverModelBuilderService.kt b/plugins/sam-with-receiver/sam-with-receiver-ide/src/SamWithReceiverProjectResolverExtension.kt similarity index 53% rename from plugins/sam-with-receiver/sam-with-receiver-ide/src/SamWithReceiverModelBuilderService.kt rename to plugins/sam-with-receiver/sam-with-receiver-ide/src/SamWithReceiverProjectResolverExtension.kt index 3eb33f581cf..5a9926e5f08 100644 --- a/plugins/sam-with-receiver/sam-with-receiver-ide/src/SamWithReceiverModelBuilderService.kt +++ b/plugins/sam-with-receiver/sam-with-receiver-ide/src/SamWithReceiverProjectResolverExtension.kt @@ -19,27 +19,6 @@ package org.jetbrains.kotlin.samWithReceiver.ide import com.intellij.openapi.util.Key import org.jetbrains.kotlin.annotation.plugin.ide.* -interface SamWithReceiverModel : AnnotationBasedPluginModel { - override fun dump(): DumpedPluginModel { - return DumpedPluginModelImpl(SamWithReceiverModelImpl::class.java, annotations.toList(), presets.toList()) - } -} - -class SamWithReceiverModelImpl( - override val annotations: List, - override val presets: List -) : SamWithReceiverModel - -class SamWithReceiverModelBuilderService : AnnotationBasedPluginModelBuilderService() { - override val gradlePluginNames get() = listOf("org.jetbrains.kotlin.plugin.sam.with.receiver", "kotlin-sam-with-receiver") - override val extensionName get() = "samWithReceiver" - override val modelClass get() = SamWithReceiverModel::class.java - - override fun createModel(annotations: List, presets: List, extension: Any?): SamWithReceiverModelImpl { - return SamWithReceiverModelImpl(annotations, presets) - } -} - class SamWithReceiverProjectResolverExtension : AnnotationBasedPluginProjectResolverExtension() { companion object { val KEY = Key("SamWithReceiverModel")