diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index a97fc0f3991..598e0af5921 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -17,10 +17,12 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.module.Module import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project +import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.roots.DependencyScope import com.intellij.openapi.roots.LibraryOrderEntry import com.intellij.openapi.roots.ModuleRootManager @@ -28,6 +30,7 @@ import com.intellij.openapi.roots.impl.libraries.LibraryEx import com.intellij.openapi.roots.libraries.PersistentLibraryKind import com.intellij.openapi.util.Computable import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiJavaModule import com.intellij.psi.search.DelegatingGlobalSearchScope import com.intellij.psi.search.FileTypeIndex import com.intellij.psi.search.GlobalSearchScope @@ -35,12 +38,17 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.configuration.ui.notifications.ConfigureKotlinNotification import org.jetbrains.kotlin.idea.framework.JSLibraryKind +import org.jetbrains.kotlin.idea.quickfix.KotlinAddRequiredModuleFix import org.jetbrains.kotlin.idea.util.application.runReadAction +import org.jetbrains.kotlin.idea.util.findFirstPsiJavaModule import org.jetbrains.kotlin.idea.util.projectStructure.allModules +import org.jetbrains.kotlin.idea.util.projectStructure.sdk +import org.jetbrains.kotlin.idea.util.projectStructure.version import org.jetbrains.kotlin.idea.versions.SuppressNotificationState import org.jetbrains.kotlin.idea.versions.getKotlinJvmRuntimeMarkerClass import org.jetbrains.kotlin.idea.versions.hasKotlinJsKjsmFile import org.jetbrains.kotlin.idea.vfilefinder.IDEVirtualFileFinder +import org.jetbrains.kotlin.resolve.jvm.modules.KOTLIN_STDLIB_MODULE_NAME import org.jetbrains.kotlin.utils.ifEmpty data class RepositoryDescription(val id: String, val name: String, val url: String, val bintrayUrl: String?, val isSnapshot: Boolean) @@ -275,3 +283,18 @@ private class LibraryKindSearchScope(val module: Module, return true } } + +fun addStdlibToJavaModuleInfo(module: Module, collector: NotificationMessageCollector) { + if (module.sdk?.version?.isAtLeast(JavaSdkVersion.JDK_1_9) != true) return + + val project = module.project + val javaModule: PsiJavaModule = findFirstPsiJavaModule(module) ?: return + + val success = WriteCommandAction.runWriteCommandAction(project, Computable { + KotlinAddRequiredModuleFix.addModuleRequirement(javaModule, KOTLIN_STDLIB_MODULE_NAME) + }) + + if (success) { + collector.addMessage("Added ${KOTLIN_STDLIB_MODULE_NAME} requirement to module-info in ${module.name}") + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt index 5ba7adf34f5..fa35d2bf7d3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module -import com.intellij.openapi.projectRoots.JavaSdk import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.LibraryOrderEntry @@ -115,6 +114,18 @@ open class KotlinJavaModuleConfigurator internal constructor() : KotlinWithLibra } } + override fun configureModule( + module: Module, + classesPath: String, + sourcesPath: String, + collector: NotificationMessageCollector, + forceJarState: FileState?, + useBundled: Boolean + ) { + super.configureModule(module, classesPath, sourcesPath, collector, forceJarState, useBundled) + addStdlibToJavaModuleInfo(module, collector) + } + companion object { val NAME = "java" diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt index 87a2a14de16..e7dc76452d6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.kt @@ -17,21 +17,17 @@ package org.jetbrains.kotlin.idea.configuration import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project -import com.intellij.openapi.projectRoots.JavaSdkVersion import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.* import com.intellij.openapi.roots.libraries.* -import com.intellij.openapi.util.Computable import com.intellij.openapi.vfs.JarFileSystem import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.psi.PsiElement -import com.intellij.psi.PsiJavaModule import org.jetbrains.annotations.Contract import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider @@ -41,16 +37,12 @@ import org.jetbrains.kotlin.idea.KotlinPluginUtil import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion import org.jetbrains.kotlin.idea.framework.ui.CreateLibraryDialogWithModules import org.jetbrains.kotlin.idea.framework.ui.FileUIUtils -import org.jetbrains.kotlin.idea.quickfix.KotlinAddRequiredModuleFix import org.jetbrains.kotlin.idea.quickfix.askUpdateRuntime import org.jetbrains.kotlin.idea.util.application.runWriteAction -import org.jetbrains.kotlin.idea.util.findFirstPsiJavaModule import org.jetbrains.kotlin.idea.util.projectStructure.sdk -import org.jetbrains.kotlin.idea.util.projectStructure.version import org.jetbrains.kotlin.idea.versions.LibraryJarDescriptor import org.jetbrains.kotlin.idea.versions.findAllUsedLibraries import org.jetbrains.kotlin.idea.versions.findKotlinRuntimeLibrary -import org.jetbrains.kotlin.resolve.jvm.modules.KOTLIN_STDLIB_MODULE_NAME import java.io.File import java.util.* @@ -115,7 +107,7 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj val collector = createConfigureKotlinNotificationCollector(project) for (module in modulesToConfigure) { - configureModuleWithLibrary(module, defaultPathToJar, copyLibraryIntoPath, collector) + configureModule(module, defaultPathToJar, copyLibraryIntoPath, collector) } configureKotlinSettings(modulesToConfigure) @@ -128,11 +120,11 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj val defaultPathToJar = getDefaultPathToJarFile(project) val collector = createConfigureKotlinNotificationCollector(project) for (module in ModuleManager.getInstance(project).modules) { - configureModuleWithLibrary(module, defaultPathToJar, null, collector) + configureModule(module, defaultPathToJar, null, collector) } } - protected fun configureModuleWithLibrary( + protected fun configureModule( module: Module, defaultPath: String, pathFromDialog: String?, @@ -140,10 +132,21 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj ) { val classesPath = getPathToCopyFileTo(module.project, OrderRootType.CLASSES, defaultPath, pathFromDialog) val sourcesPath = getPathToCopyFileTo(module.project, OrderRootType.SOURCES, defaultPath, pathFromDialog) - configureModuleWithLibrary(module, classesPath, sourcesPath, collector, useBundled = pathFromDialog == null) + configureModule(module, classesPath, sourcesPath, collector, useBundled = pathFromDialog == null) } - fun configureModuleWithLibrary( + open fun configureModule( + module: Module, + classesPath: String, + sourcesPath: String, + collector: NotificationMessageCollector, + forceJarState: FileState? = null, + useBundled: Boolean = false + ) { + configureModuleWithLibrary(module, classesPath, sourcesPath, collector, forceJarState, useBundled) + } + + private fun configureModuleWithLibrary( module: Module, classesPath: String, sourcesPath: String, @@ -176,24 +179,8 @@ abstract class KotlinWithLibraryConfigurator internal constructor() : KotlinProj ApplicationManager.getApplication().runWriteAction { model.commit() } addLibraryToModuleIfNeeded(module, library, collector) - - updateModuleInfo(module, collector) } - private fun updateModuleInfo(module: Module, collector: NotificationMessageCollector) { - if (module.sdk?.version?.isAtLeast(JavaSdkVersion.JDK_1_9) != true) return - - val project = module.project - val javaModule: PsiJavaModule = findFirstPsiJavaModule(module) ?: return - - val success = WriteCommandAction.runWriteCommandAction(project, Computable { - KotlinAddRequiredModuleFix.addModuleRequirement(javaModule, KOTLIN_STDLIB_MODULE_NAME) - }) - - if (success) { - collector.addMessage("Added $KOTLIN_STDLIB_MODULE_NAME requirement to module-info in ${module.name}") - } - } fun configureLibraryJar( library: Library.ModifiableModel, diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.kt b/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.kt index dd9edc4b6b2..7c9e64de09b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/AbstractConfigureKotlinTest.kt @@ -181,7 +181,7 @@ abstract class AbstractConfigureKotlinTest : PlatformTestCase() { val pathToJar = getPathToJar(runtimeState, jarFromDist, jarFromTemp) for (module in modules) { - configurator.configureModuleWithLibrary(module, pathToJar, pathToJar, collector, runtimeState) + configurator.configureModule(module, pathToJar, pathToJar, collector, runtimeState) } collector.showNotification() }