/* * 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. */ 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.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 { abstract val compilerPluginId: String abstract val pluginName: String abstract val annotationOptionName: String abstract val pluginJarFileFromIdea: File abstract val modelKey: Key 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) } protected open fun getAnnotationsForPreset(presetName: String): List = emptyList() protected open fun getAdditionalOptions(model: T): List = emptyList() private fun getPluginSetupByModule( moduleNode: DataNode ): AnnotationBasedCompilerPluginSetup? { val pluginModel = moduleNode.getCopyableUserData(modelKey)?.takeIf { it.isEnabled } ?: return null val annotations = pluginModel.annotations val presets = pluginModel.presets 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. val classpath = listOf(pluginJarFileFromIdea.absolutePath) return AnnotationBasedCompilerPluginSetup(options, classpath) } private fun getPluginSetupBySourceSet(sourceSetNode: DataNode) = ExternalSystemApiUtil.findParent(sourceSetNode, ProjectKeys.MODULE)?.let { getPluginSetupByModule(it) } }