diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java index 3be8803ccd9..55acedd407a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProjectStructureUtil.java @@ -18,35 +18,24 @@ package org.jetbrains.kotlin.idea.project; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleUtilCore; -import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootModificationTracker; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Ref; -import com.intellij.psi.search.FileTypeIndex; -import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.idea.KotlinFileType; import org.jetbrains.kotlin.idea.framework.JsLibraryStdDetectionUtil; -import org.jetbrains.kotlin.idea.versions.KotlinRuntimeLibraryCoreUtil; import org.jetbrains.kotlin.psi.KtFile; -import java.util.HashSet; -import java.util.Set; - public class ProjectStructureUtil { private static final Key> IS_KOTLIN_JS_MODULE = Key.create("IS_KOTLIN_JS_MODULE"); - private static final Key> HAS_KOTLIN_JVM_MODULES = Key.create("HAS_KOTLIN_JVM_MODULES"); - private static final Key> IS_DEPEND_ON_JVM_KOTLIN = Key.create("KOTLIN_IS_DEPEND_ON_JVM_KOTLIN"); private ProjectStructureUtil() { } @@ -56,12 +45,6 @@ public class ProjectStructureUtil { return module != null && isJsKotlinModule(module); } - public static boolean hasKotlinRuntimeInScope(@NotNull Module module) { - GlobalSearchScope scope = module.getModuleWithDependenciesAndLibrariesScope( - hasKotlinFilesOnlyInTests(module)); - return KotlinRuntimeLibraryCoreUtil.getKotlinRuntimeMarkerClass(module.getProject(), scope) != null; - } - public static boolean isJsKotlinModule(@NotNull final Module module) { CachedValue result = module.getUserData(IS_KOTLIN_JS_MODULE); if (result == null) { @@ -80,59 +63,6 @@ public class ProjectStructureUtil { return result.getValue(); } - public static boolean hasJvmKotlinModules(@NotNull final Project project) { - CachedValue result = project.getUserData(HAS_KOTLIN_JVM_MODULES); - if (result == null) { - result = CachedValuesManager.getManager(project).createCachedValue(new CachedValueProvider() { - @Override - public Result compute() { - boolean hasJvmKotlinModules = false; - - for (Module module : ModuleManager.getInstance(project).getModules()) { - if (hasKotlinRuntimeInScope(module)) { - hasJvmKotlinModules = true; - break; - } - } - - return Result.create(hasJvmKotlinModules, ProjectRootModificationTracker.getInstance(project)); - } - }, false); - - project.putUserData(HAS_KOTLIN_JVM_MODULES, result); - } - - return result.getValue(); - } - - public static boolean isUsedInKotlinJavaModule(@NotNull final Module module) { - CachedValue result = module.getUserData(IS_DEPEND_ON_JVM_KOTLIN); - if (result == null) { - result = CachedValuesManager.getManager(module.getProject()).createCachedValue(new CachedValueProvider() { - @Override - public Result compute() { - boolean usedInKotlinModule = false; - - Set dependentModules = new HashSet(); - ModuleUtilCore.collectModulesDependsOn(module, dependentModules); - - for (Module module : dependentModules) { - if (hasKotlinRuntimeInScope(module)) { - usedInKotlinModule = true; - break; - } - } - - return Result.create(usedInKotlinModule, ProjectRootModificationTracker.getInstance(module.getProject())); - } - }, false); - - module.putUserData(IS_DEPEND_ON_JVM_KOTLIN, result); - } - - return result.getValue(); - } - @Nullable private static Library getJSStandardLibrary(final Module module) { return ApplicationManager.getApplication().runReadAction(new Computable() { @@ -156,12 +86,4 @@ public class ProjectStructureUtil { } }); } - - public static boolean hasKotlinFilesInSources(@NotNull Module module) { - return FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(false)); - } - - public static boolean hasKotlinFilesOnlyInTests(@NotNull Module module) { - return !hasKotlinFilesInSources(module) && FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(true)); - } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryCoreUtil.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryCoreUtil.java deleted file mode 100644 index 951a3df8147..00000000000 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryCoreUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2010-2015 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.idea.versions; - -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.DumbService; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Ref; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiClass; -import com.intellij.psi.search.GlobalSearchScope; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class KotlinRuntimeLibraryCoreUtil { - @Nullable - public static PsiClass getKotlinRuntimeMarkerClass(@NotNull final Project project, @NotNull final GlobalSearchScope scope) { - return ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public PsiClass compute() { - final Ref result = new Ref(); - DumbService.getInstance(project).withAlternativeResolveEnabled(new Runnable() { - @Override - public void run() { - result.set(JavaPsiFacade.getInstance(project).findClass("kotlin.Unit", scope)); - } - }); - - return result.get(); - } - }); - } -} diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt index f8b50885a95..2de96d88980 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinInProjectUtils.kt @@ -27,6 +27,7 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.configuration.ui.notifications.ConfigureKotlinNotification import org.jetbrains.kotlin.idea.util.projectStructure.allModules +import org.jetbrains.kotlin.idea.versions.getKotlinRuntimeMarkerClass import org.jetbrains.kotlin.utils.ifEmpty fun isProjectConfigured(project: Project): Boolean { @@ -104,4 +105,17 @@ fun getNonConfiguredModules(project: Project, excludeModules: Collection return modulesWithKotlinFiles.filter { module -> ableToRunConfigurators.any { !it.isConfigured(module) } } -} \ No newline at end of file +} + +fun hasKotlinRuntimeInScope(module: Module): Boolean { + val scope = module.getModuleWithDependenciesAndLibrariesScope(hasKotlinFilesOnlyInTests(module)) + return getKotlinRuntimeMarkerClass(module.project, scope) != null +} + +fun hasKotlinFilesOnlyInTests(module: Module): Boolean { + return !hasKotlinFilesInSources(module) && FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(true)) +} + +fun hasKotlinFilesInSources(module: Module): Boolean { + return FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, module.getModuleScope(false)) +} diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaMavenConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaMavenConfigurator.java index d16b189de78..9e1d03f651c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaMavenConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaMavenConfigurator.java @@ -35,7 +35,7 @@ public class KotlinJavaMavenConfigurator extends KotlinMavenConfigurator { @Override protected boolean isKotlinModule(@NotNull Module module) { - return ProjectStructureUtil.hasKotlinRuntimeInScope(module); + return ConfigureKotlinInProjectUtilsKt.hasKotlinRuntimeInScope(module); } @Override diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.java index 6fd972ec9f1..38a498f2a40 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinJavaModuleConfigurator.java @@ -26,8 +26,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.framework.JavaRuntimeLibraryDescription; import org.jetbrains.kotlin.idea.framework.KotlinLibraryUtilKt; -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil; -import org.jetbrains.kotlin.idea.versions.KotlinRuntimeLibraryCoreUtil; +import org.jetbrains.kotlin.idea.versions.KotlinRuntimeLibraryUtilKt; import org.jetbrains.kotlin.resolve.TargetPlatform; import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform; import org.jetbrains.kotlin.utils.KotlinPaths; @@ -38,7 +37,7 @@ public class KotlinJavaModuleConfigurator extends KotlinWithLibraryConfigurator @Override public boolean isConfigured(@NotNull Module module) { - return ProjectStructureUtil.hasKotlinRuntimeInScope(module); + return ConfigureKotlinInProjectUtilsKt.hasKotlinRuntimeInScope(module); } @NotNull @@ -108,7 +107,7 @@ public class KotlinJavaModuleConfigurator extends KotlinWithLibraryConfigurator } LibraryScope scope = new LibraryScope(project, library); - return KotlinRuntimeLibraryCoreUtil.getKotlinRuntimeMarkerClass(project, scope) != null; + return KotlinRuntimeLibraryUtilKt.getKotlinRuntimeMarkerClass(project, scope) != null; } KotlinJavaModuleConfigurator() { diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt index 5513ccb3e15..77dfda80b0a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinSetupEnvironmentNotificationProvider.kt @@ -39,7 +39,6 @@ import com.intellij.ui.EditorNotificationPanel import com.intellij.ui.EditorNotifications import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinLanguage -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.versions.UnsupportedAbiVersionNotificationPanelProvider import org.jetbrains.kotlin.idea.versions.createComponentActionLabel @@ -78,7 +77,7 @@ class KotlinSetupEnvironmentNotificationProvider( return createSetupSdkPanel(myProject, psiFile) } - if (!ProjectStructureUtil.hasKotlinRuntimeInScope(module) && + if (!hasKotlinRuntimeInScope(module) && UnsupportedAbiVersionNotificationPanelProvider.collectBadRoots(module).isEmpty()) { return createKotlinNotConfiguredPanel(module) } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java index dd9c2c742ea..62df722838c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.java @@ -37,7 +37,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.KotlinPluginUtil; import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion; -import org.jetbrains.kotlin.idea.project.ProjectStructureUtil; import org.jetbrains.plugins.gradle.util.GradleConstants; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory; @@ -63,7 +62,7 @@ public abstract class KotlinWithGradleConfigurator implements KotlinProjectConfi @Override public boolean isConfigured(@NotNull Module module) { - if (ProjectStructureUtil.hasKotlinRuntimeInScope(module)) { + if (ConfigureKotlinInProjectUtilsKt.hasKotlinRuntimeInScope(module)) { return true; } diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java index 3d1d9113249..5905c88ff68 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithLibraryConfigurator.java @@ -365,7 +365,7 @@ public abstract class KotlinWithLibraryConfigurator implements KotlinProjectConf @NotNull private static DependencyScope getDependencyScope(@NotNull Module module) { - if (ProjectStructureUtil.hasKotlinFilesOnlyInTests(module)) { + if (ConfigureKotlinInProjectUtilsKt.hasKotlinFilesOnlyInTests(module)) { return DependencyScope.TEST; } return DependencyScope.COMPILE; diff --git a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt index a3a1c09799e..711de3f500c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/versions/KotlinRuntimeLibraryUtil.kt @@ -31,6 +31,8 @@ import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.JarFileSystem import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiClass import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.PathUtil.getLocalFile import com.intellij.util.PathUtil.getLocalPath @@ -43,6 +45,8 @@ import org.jetbrains.kotlin.idea.configuration.KotlinJsModuleConfigurator import org.jetbrains.kotlin.idea.configuration.createConfigureKotlinNotificationCollector import org.jetbrains.kotlin.idea.configuration.getConfiguratorByName import org.jetbrains.kotlin.idea.framework.* +import org.jetbrains.kotlin.idea.util.application.runReadAction +import org.jetbrains.kotlin.idea.util.runWithAlternativeResolveEnabled import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils import org.jetbrains.kotlin.utils.PathUtil @@ -244,3 +248,12 @@ fun showRuntimeJarNotFoundDialog(project: Project, jarName: String) { jarName + " is not found. Make sure plugin is properly installed.", "No Runtime Found") } + +fun getKotlinRuntimeMarkerClass(project: Project, scope: GlobalSearchScope): PsiClass? { + return runReadAction { + project.runWithAlternativeResolveEnabled { + JavaPsiFacade.getInstance(project).findClass("kotlin.Unit", scope) + } + } +} +