diff --git a/idea/src/org/jetbrains/jet/plugin/configuration/ConfigureKotlinInProjectUtils.java b/idea/src/org/jetbrains/jet/plugin/configuration/ConfigureKotlinInProjectUtils.java index 771c440d26a..58939541286 100644 --- a/idea/src/org/jetbrains/jet/plugin/configuration/ConfigureKotlinInProjectUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/configuration/ConfigureKotlinInProjectUtils.java @@ -25,7 +25,6 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.search.FileTypeIndex; -import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,14 +59,18 @@ public class ConfigureKotlinInProjectUtils { return false; } - public static boolean hasKotlinFiles(@NotNull Module module) { - return !FileTypeIndex.getFiles(JetFileType.INSTANCE, GlobalSearchScope.moduleScope(module)).isEmpty(); + public static boolean hasKotlinFilesInSources(@NotNull Module module) { + return !FileTypeIndex.getFiles(JetFileType.INSTANCE, module.getModuleScope(false)).isEmpty(); + } + + public static boolean hasKotlinFilesOnlyInTests(@NotNull Module module) { + return !hasKotlinFilesInSources(module) && !FileTypeIndex.getFiles(JetFileType.INSTANCE, module.getModuleScope(true)).isEmpty(); } public static Collection getModulesWithKotlinFiles(@NotNull Project project) { List modulesWithKotlin = Lists.newArrayList(); for (Module module : ModuleManager.getInstance(project).getModules()) { - if (hasKotlinFiles(module)) { + if (hasKotlinFilesInSources(module) || hasKotlinFilesOnlyInTests(module)) { modulesWithKotlin.add(module); } } diff --git a/idea/src/org/jetbrains/jet/plugin/configuration/KotlinWithLibraryConfigurator.java b/idea/src/org/jetbrains/jet/plugin/configuration/KotlinWithLibraryConfigurator.java index 7f5ce0dae54..e67c3a6b19d 100644 --- a/idea/src/org/jetbrains/jet/plugin/configuration/KotlinWithLibraryConfigurator.java +++ b/idea/src/org/jetbrains/jet/plugin/configuration/KotlinWithLibraryConfigurator.java @@ -3,9 +3,8 @@ package org.jetbrains.jet.plugin.configuration; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModuleRootModificationUtil; -import com.intellij.openapi.roots.OrderEnumerator; -import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.impl.OrderEntryUtil; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; @@ -231,13 +230,43 @@ public abstract class KotlinWithLibraryConfigurator implements KotlinProjectConf } private void addLibraryToModuleIfNeeded(Module module) { - if (getKotlinLibrary(module) == null) { + DependencyScope expectedDependencyScope = getDependencyScope(module); + Library kotlinLibrary = getKotlinLibrary(module); + if (kotlinLibrary == null) { Library library = getKotlinLibrary(module.getProject()); assert library != null : "Kotlin project library should exists"; - ModuleRootModificationUtil.addDependency(module, library); + ModuleRootModificationUtil.addDependency(module, library, expectedDependencyScope, false); showInfoNotification(library.getName() + " library was added to module " + module.getName()); } + else { + final ModifiableRootModel model = ModuleRootManager.getInstance(module).getModifiableModel(); + LibraryOrderEntry libraryEntry = OrderEntryUtil.findLibraryOrderEntry(model, kotlinLibrary); + if (libraryEntry != null) { + DependencyScope libraryDependencyScope = libraryEntry.getScope(); + if (!expectedDependencyScope.equals(libraryDependencyScope)) { + libraryEntry.setScope(expectedDependencyScope); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + model.commit(); + } + }); + + showInfoNotification(kotlinLibrary.getName() + " library scope has changed from " + libraryDependencyScope + + " to " + expectedDependencyScope + " for module " + module.getName()); + } + } + } + + } + + @NotNull + private static DependencyScope getDependencyScope(@NotNull Module module) { + if (ConfigureKotlinInProjectUtils.hasKotlinFilesOnlyInTests(module)) { + return DependencyScope.TEST; + } + return DependencyScope.COMPILE; } private void addJarToExistedLibrary(@NotNull Project project, @NotNull File jarFile) { diff --git a/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java b/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java index ab27121644b..2a4e59317ae 100644 --- a/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java +++ b/idea/src/org/jetbrains/jet/plugin/framework/KotlinFrameworkDetector.java @@ -41,6 +41,7 @@ import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.plugin.configuration.ConfigureKotlinInProjectUtils; import org.jetbrains.jet.plugin.versions.KotlinRuntimeLibraryUtil; import org.jetbrains.k2js.config.EcmaVersion; @@ -59,7 +60,8 @@ public class KotlinFrameworkDetector { } public static boolean isJavaKotlinModule(@NotNull Module module) { - GlobalSearchScope scope = module.getModuleWithDependenciesAndLibrariesScope(false); + GlobalSearchScope scope = module.getModuleWithDependenciesAndLibrariesScope( + ConfigureKotlinInProjectUtils.hasKotlinFilesOnlyInTests(module)); return KotlinRuntimeLibraryUtil.getKotlinRuntimeMarkerClass(scope) != null; }