Use Gradle API to import annotations from compiler plugins instead of nasty data storage tasks
Tasks itself will be left for some time until all users migrate to the newer IDE plugin versions.
This commit is contained in:
+11
-17
@@ -19,25 +19,22 @@ package org.jetbrains.kotlin.annotation.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.model.task.TaskData
|
||||
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
||||
import com.intellij.openapi.util.Key
|
||||
import org.jetbrains.kotlin.annotation.plugin.ide.AnnotationBasedCompilerPluginSetup.PluginOption
|
||||
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 {
|
||||
private companion object {
|
||||
private val TASK_DESCRIPTION_REGEX = "Supported annotations: ([^; ]*); (?:Presets: (.*?); )?Compiler plugin classpath: (.*?)".toRegex()
|
||||
}
|
||||
|
||||
abstract class AbstractGradleImportHandler<T : AnnotationBasedPluginModel> : GradleProjectImportHandler {
|
||||
abstract val compilerPluginId: String
|
||||
abstract val pluginName: String
|
||||
abstract val annotationOptionName: String
|
||||
abstract val dataStorageTaskName: String
|
||||
abstract val pluginJarFileFromIdea: File
|
||||
|
||||
abstract val modelKey: Key<T>
|
||||
|
||||
override fun importBySourceSet(facet: KotlinFacet, sourceSetNode: DataNode<GradleSourceSetData>) {
|
||||
modifyCompilerArgumentsForPlugin(facet, getPluginSetupBySourceSet(sourceSetNode),
|
||||
compilerPluginId = compilerPluginId,
|
||||
@@ -52,20 +49,17 @@ abstract class AbstractGradleImportHandler : GradleProjectImportHandler {
|
||||
|
||||
protected open fun getAnnotationsForPreset(presetName: String): List<String> = emptyList()
|
||||
|
||||
protected open fun getAdditionalOptions(model: T): List<PluginOption> = emptyList()
|
||||
|
||||
private fun getPluginSetupByModule(
|
||||
moduleNode: DataNode<ModuleData>
|
||||
): AnnotationBasedCompilerPluginSetup? {
|
||||
val dataStorageTaskData = moduleNode.children.firstOrNull {
|
||||
val data = it.data as? TaskData ?: return@firstOrNull false
|
||||
data.name == dataStorageTaskName
|
||||
}?.data as? TaskData ?: return null
|
||||
val pluginModel = moduleNode.getUserData(modelKey)?.takeIf { it.isEnabled } ?: return null
|
||||
val annotations = pluginModel.annotations
|
||||
val presets = pluginModel.presets
|
||||
|
||||
val dataStorageTaskDescription = dataStorageTaskData.description ?: return null
|
||||
val matchResult = TASK_DESCRIPTION_REGEX.matchEntire(dataStorageTaskDescription)?.groupValues?.drop(1) ?: return null
|
||||
val (annotationFqNamesList, presets) = matchResult
|
||||
|
||||
val annotationFqNames = annotationFqNamesList.split(',') + presets.split(',').flatMap { getAnnotationsForPreset(it) }
|
||||
val options = annotationFqNames.map { PluginOption(annotationOptionName, it) }
|
||||
val allAnnotations = annotations + presets.flatMap { getAnnotationsForPreset(it) }
|
||||
val options = allAnnotations.map { PluginOption(annotationOptionName, it) } + getAdditionalOptions(pluginModel)
|
||||
|
||||
// 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.
|
||||
|
||||
Reference in New Issue
Block a user