use DOM instead of MavenProjectsManager to detect whether Kotlin is configured (KT-9275)

This commit is contained in:
Dmitry Jemerov
2016-11-10 19:13:59 +01:00
parent ebbf8888bb
commit 3d01e92dd6
2 changed files with 16 additions and 10 deletions
@@ -41,6 +41,9 @@ import org.jetbrains.kotlin.idea.maven.configuration.KotlinMavenConfigurator
import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType
import java.util.*
fun kotlinPluginId(version: String?) = MavenId(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID, version)
class PomFile(val xmlFile: XmlFile) {
val domModel = MavenDomUtil.getMavenDomProjectModel(xmlFile.project, xmlFile.virtualFile) ?: throw IllegalStateException("No DOM model found for pom ${xmlFile.name}")
private val nodesByName = HashMap<String, XmlTag>()
@@ -117,13 +120,13 @@ class PomFile(val xmlFile: XmlFile) {
return dependency
}
fun addKotlinPlugin(version: String?) = addPlugin(MavenId(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID, version))
fun addKotlinPlugin(version: String?) = addPlugin(kotlinPluginId(version))
fun addPlugin(artifact: MavenId): MavenDomPlugin {
ensureBuild()
val groupArtifact = artifact.withNoVersion()
val plugin = domModel.build.plugins.plugins.firstOrNull { it.matches(groupArtifact) } ?: domModel.build.plugins.addPlugin()
val plugin = findPlugin(groupArtifact) ?: domModel.build.plugins.addPlugin()
plugin.groupId.stringValue = artifact.groupId
plugin.artifactId.stringValue = artifact.artifactId
if (artifact.version != null) {
@@ -134,6 +137,8 @@ class PomFile(val xmlFile: XmlFile) {
return plugin
}
fun findPlugin(groupArtifact: MavenId) = domModel.build.plugins.plugins.firstOrNull { it.matches(groupArtifact) }
fun isPluginAfter(plugin: MavenDomPlugin, referencePlugin: MavenDomPlugin): Boolean {
require(plugin.parent === referencePlugin.parent) { "Plugins should be siblings" }
require(plugin !== referencePlugin)
@@ -33,7 +33,6 @@ import com.intellij.psi.xml.XmlFile
import org.jetbrains.idea.maven.dom.MavenDomUtil
import org.jetbrains.idea.maven.dom.model.MavenDomPlugin
import org.jetbrains.idea.maven.model.MavenId
import org.jetbrains.idea.maven.project.MavenProject
import org.jetbrains.idea.maven.project.MavenProjectsManager
import org.jetbrains.idea.maven.utils.MavenArtifactScope
import org.jetbrains.kotlin.idea.KotlinPluginUtil
@@ -41,6 +40,7 @@ import org.jetbrains.kotlin.idea.configuration.*
import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion
import org.jetbrains.kotlin.idea.maven.PomFile
import org.jetbrains.kotlin.idea.maven.excludeMavenChildrenModules
import org.jetbrains.kotlin.idea.maven.kotlinPluginId
abstract class KotlinMavenConfigurator
protected constructor(private val stdlibArtifactId: String,
@@ -57,23 +57,24 @@ abstract class KotlinMavenConfigurator
if (psi == null
|| !psi.isValid
|| psi !is XmlFile
|| psi.virtualFile == null
|| MavenDomUtil.getMavenDomProjectModel(module.project, psi.virtualFile) == null) {
|| psi.virtualFile == null) {
return ConfigureKotlinStatus.BROKEN
}
val mavenProject = MavenProjectsManager.getInstance(module.project).findProject(module) ?: return ConfigureKotlinStatus.BROKEN
val pom = PomFile(psi)
if (isKotlinModule(module) && hasKotlinPlugin(mavenProject)) {
if (isKotlinModule(module) && hasKotlinPlugin(pom)) {
return ConfigureKotlinStatus.CONFIGURED
}
return ConfigureKotlinStatus.CAN_BE_CONFIGURED
}
private fun hasKotlinPlugin(mavenProject: MavenProject): Boolean {
val plugin = mavenProject.findPlugin(GROUP_ID, MAVEN_PLUGIN_ID) ?: return false
private fun hasKotlinPlugin(pom: PomFile): Boolean {
val plugin = pom.findPlugin(kotlinPluginId(null)) ?: return false
return plugin.executions?.any { it.goals?.any { it != null && isRelevantGoal(it) } ?: false } ?: false
return plugin.executions.executions.any {
it.goals.goals.any { isRelevantGoal(it.stringValue ?: "") }
}
}
override fun configure(project: Project, excludeModules: Collection<Module>) {