From ebbf8888bbb57fb6166dd3fcb8254aa4d799d170 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 3 Nov 2016 19:00:29 +0100 Subject: [PATCH] Change KotlinProjectConfigurator API to return module status as a single enum instead of two distinct boolean values --- .../configuration/KotlinMavenConfigurator.kt | 23 +++++++++++-------- .../ConfigureKotlinInProjectUtils.kt | 22 ++++++++---------- .../KotlinProjectConfigurator.kt | 18 ++++++++++++--- ...linSetupEnvironmentNotificationProvider.kt | 6 ++--- .../KotlinWithGradleConfigurator.java | 22 ++++++++++++++---- .../KotlinWithLibraryConfigurator.java | 16 +++++++++++-- 6 files changed, 70 insertions(+), 37 deletions(-) diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/configuration/KotlinMavenConfigurator.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/configuration/KotlinMavenConfigurator.kt index 9ece68c3dc6..422b1b06877 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/configuration/KotlinMavenConfigurator.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/configuration/KotlinMavenConfigurator.kt @@ -33,6 +33,7 @@ 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 @@ -48,14 +49,9 @@ abstract class KotlinMavenConfigurator override val name: String, override val presentableText: String) : KotlinProjectConfigurator { - override fun isApplicable(module: Module): Boolean { - return KotlinPluginUtil.isMavenModule(module) - } - - override fun isConfigured(module: Module): Boolean { - if (!isKotlinModule(module)) { - return false - } + override fun getStatus(module: Module): ConfigureKotlinStatus { + if (!KotlinPluginUtil.isMavenModule(module)) + return ConfigureKotlinStatus.NON_APPLICABLE val psi = findModulePomFile(module) if (psi == null @@ -63,11 +59,18 @@ abstract class KotlinMavenConfigurator || psi !is XmlFile || psi.virtualFile == null || MavenDomUtil.getMavenDomProjectModel(module.project, psi.virtualFile) == null) { - return false + return ConfigureKotlinStatus.BROKEN } - val mavenProject = MavenProjectsManager.getInstance(module.project).findProject(module) ?: return false + val mavenProject = MavenProjectsManager.getInstance(module.project).findProject(module) ?: return ConfigureKotlinStatus.BROKEN + if (isKotlinModule(module) && hasKotlinPlugin(mavenProject)) { + 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 return plugin.executions?.any { it.goals?.any { it != null && isRelevantGoal(it) } ?: false } ?: false diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index aee1b2429df..a7a36ce69ef 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -47,14 +47,10 @@ val EAP_REPOSITORY = RepositoryDescription( "http://dl.bintray.com/kotlin/kotlin-eap", isSnapshot = false) -fun isProjectConfigured(project: Project): Boolean { - val modules = getModulesWithKotlinFiles(project) - return modules.all { isModuleConfigured(it) } -} - fun isModuleConfigured(module: Module): Boolean { - val configurators = getApplicableConfigurators(module) - return configurators.any { it.isConfigured(module) } + return Extensions.getExtensions(KotlinProjectConfigurator.EP_NAME).any { + it.getStatus(module) == ConfigureKotlinStatus.CONFIGURED + } } fun getModulesWithKotlinFiles(project: Project): Collection { @@ -95,12 +91,12 @@ fun getAbleToRunConfigurators(project: Project): Collection - modules.any { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } + modules.any { module -> configurator.getStatus(module) == ConfigureKotlinStatus.CAN_BE_CONFIGURED } } } -fun getApplicableConfigurators(module: Module): Collection { - return Extensions.getExtensions(KotlinProjectConfigurator.EP_NAME).filter { it.isApplicable(module) } +fun getAbleToRunConfigurators(module: Module): Collection { + return Extensions.getExtensions(KotlinProjectConfigurator.EP_NAME).filter { it.getStatus(module) == ConfigureKotlinStatus.CAN_BE_CONFIGURED } } fun getConfiguratorByName(name: String): KotlinProjectConfigurator? { @@ -108,19 +104,19 @@ fun getConfiguratorByName(name: String): KotlinProjectConfigurator? { } fun getNonConfiguredModules(project: Project, configurator: KotlinProjectConfigurator): List { - return project.allModules().filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } + return project.allModules().filter { module -> configurator.getStatus(module) == ConfigureKotlinStatus.CAN_BE_CONFIGURED } } fun getNonConfiguredModulesWithKotlinFiles(project: Project, configurator: KotlinProjectConfigurator): List { val modules = getModulesWithKotlinFiles(project) - return modules.filter { module -> configurator.isApplicable(module) && !configurator.isConfigured(module) } + return modules.filter { module -> configurator.getStatus(module) == ConfigureKotlinStatus.CAN_BE_CONFIGURED } } fun getNonConfiguredModules(project: Project, excludeModules: Collection = emptyList()): Collection { val modulesWithKotlinFiles = getModulesWithKotlinFiles(project) - excludeModules val ableToRunConfigurators = getAbleToRunConfigurators(project) return modulesWithKotlinFiles.filter { module -> - ableToRunConfigurators.any { !it.isConfigured(module) } + ableToRunConfigurators.any { it.getStatus(module) == ConfigureKotlinStatus.CAN_BE_CONFIGURED } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinProjectConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinProjectConfigurator.kt index 8f9d47a1896..95d3a0b5421 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinProjectConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinProjectConfigurator.kt @@ -21,11 +21,23 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import org.jetbrains.kotlin.resolve.TargetPlatform +enum class ConfigureKotlinStatus { + /** Kotlin is correctly configured using this configurator. */ + CONFIGURED, + /** The configurator is not applicable to the current project type. */ + NON_APPLICABLE, + /** The configurator is applicable to the current project type and can configure Kotlin automatically. */ + CAN_BE_CONFIGURED, + /** + * The configurator is applicable to the current project type and Kotlin is not configured, + * but the state of the project doesn't allow to configure Kotlin automatically. + */ + BROKEN +} + interface KotlinProjectConfigurator { - fun isConfigured(module: Module): Boolean - - fun isApplicable(module: Module): Boolean + fun getStatus(module: Module): ConfigureKotlinStatus @JvmSuppressWildcards fun configure(project: Project, excludeModules: Collection) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt index 96dca13caf6..a8fd2eefaa5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt @@ -107,7 +107,7 @@ class KotlinSetupEnvironmentNotificationProvider( private fun createKotlinNotConfiguredPanel(module: Module): EditorNotificationPanel { return EditorNotificationPanel().apply { setText("Kotlin not configured") - val configurators = getApplicableConfigurators(module).toList() + val configurators = getAbleToRunConfigurators(module).toList() if (!configurators.isEmpty()) { createComponentActionLabel("Configure") { label -> val configuratorsPopup = createConfiguratorsPopup(module.project, configurators) @@ -125,9 +125,7 @@ class KotlinSetupEnvironmentNotificationProvider( override fun onChosen(selectedValue: KotlinProjectConfigurator?, finalChoice: Boolean): PopupStep<*>? { return doFinalStep { - selectedValue?.let { - it.configure(project, emptyList()) - } + selectedValue?.configure(project, emptyList()) } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java index 50636670243..4415b41ec45 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java @@ -71,20 +71,32 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi protected static final String SOURCE_SET = "main.java.srcDirs += 'src/main/kotlin'\n"; private static final String VERSION = String.format("ext.kotlin_version = '%s'", VERSION_TEMPLATE); + @NotNull @Override - public boolean isConfigured(@NotNull Module module) { + public ConfigureKotlinStatus getStatus(@NotNull Module module) { + if (!isApplicable(module)) { + return ConfigureKotlinStatus.NON_APPLICABLE; + } + if (ConfigureKotlinInProjectUtilsKt.hasKotlinJvmRuntimeInScope(module)) { - return true; + return ConfigureKotlinStatus.CONFIGURED; } GroovyFile moduleGradleFile = getBuildGradleFile(module.getProject(), getModuleFilePath(module)); - if (moduleGradleFile != null && isFileConfigured(moduleGradleFile)) { - return true; + if (moduleGradleFile != null && !isFileConfigured(moduleGradleFile)) { + return ConfigureKotlinStatus.CAN_BE_CONFIGURED; } + GroovyFile projectGradleFile = getBuildGradleFile(module.getProject(), getTopLevelProjectFilePath(module.getProject())); - return projectGradleFile != null && isFileConfigured(projectGradleFile); + if (projectGradleFile != null && !isFileConfigured(projectGradleFile)) { + return ConfigureKotlinStatus.CAN_BE_CONFIGURED; + } + + return ConfigureKotlinStatus.BROKEN; } + protected abstract boolean isApplicable(@NotNull Module module); + private boolean isFileConfigured(GroovyFile projectGradleFile) { String fileText = projectGradleFile.getText(); return containsDirective(fileText, getApplyPluginDirective()) && fileText.contains(LIBRARY); diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java index 976bbdadaf8..13167f60107 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java @@ -38,7 +38,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.KotlinPluginUtil; import org.jetbrains.kotlin.idea.framework.ui.CreateLibraryDialogWithModules; import org.jetbrains.kotlin.idea.framework.ui.FileUIUtils; -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil; import java.io.File; import java.util.Arrays; @@ -66,13 +65,26 @@ public abstract class KotlinWithLibraryConfigurator implements KotlinProjectConf @Nullable protected abstract String getOldSourceRootUrl(@NotNull Library library); + @NotNull @Override - public boolean isApplicable(@NotNull Module module) { + public ConfigureKotlinStatus getStatus(@NotNull Module module) { + if (!isApplicable(module)) { + return ConfigureKotlinStatus.NON_APPLICABLE; + } + if (isConfigured(module)) { + return ConfigureKotlinStatus.CONFIGURED; + } + return ConfigureKotlinStatus.CAN_BE_CONFIGURED; + } + + protected static boolean isApplicable(@NotNull Module module) { return !KotlinPluginUtil.isAndroidGradleModule(module) && !KotlinPluginUtil.isMavenModule(module) && !KotlinPluginUtil.isGradleModule(module); } + protected abstract boolean isConfigured(@NotNull Module module); + @Override public void configure(@NotNull Project project, Collection excludeModules) { String defaultPathToJar = getDefaultPathToJarFile(project);