cleanup: remove dead code from ProjectStructureUtil, move code used only during project configuration to ConfigureKotlinInProjectUtils; move function from KotlinRuntimeLibraryCoreUtil into KotlinRuntimeLibraryUtil

This commit is contained in:
Dmitry Jemerov
2016-03-01 17:38:22 +01:00
parent 828e53ce82
commit 3cc3b3fce2
9 changed files with 35 additions and 137 deletions
@@ -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<CachedValue<Boolean>> IS_KOTLIN_JS_MODULE = Key.create("IS_KOTLIN_JS_MODULE");
private static final Key<CachedValue<Boolean>> HAS_KOTLIN_JVM_MODULES = Key.create("HAS_KOTLIN_JVM_MODULES");
private static final Key<CachedValue<Boolean>> 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<Boolean> 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<Boolean> result = project.getUserData(HAS_KOTLIN_JVM_MODULES);
if (result == null) {
result = CachedValuesManager.getManager(project).createCachedValue(new CachedValueProvider<Boolean>() {
@Override
public Result<Boolean> 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<Boolean> result = module.getUserData(IS_DEPEND_ON_JVM_KOTLIN);
if (result == null) {
result = CachedValuesManager.getManager(module.getProject()).createCachedValue(new CachedValueProvider<Boolean>() {
@Override
public Result<Boolean> compute() {
boolean usedInKotlinModule = false;
Set<Module> dependentModules = new HashSet<Module>();
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<Library>() {
@@ -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));
}
}
@@ -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<PsiClass>() {
@Override
public PsiClass compute() {
final Ref<PsiClass> result = new Ref<PsiClass>();
DumbService.getInstance(project).withAlternativeResolveEnabled(new Runnable() {
@Override
public void run() {
result.set(JavaPsiFacade.getInstance(project).findClass("kotlin.Unit", scope));
}
});
return result.get();
}
});
}
}
@@ -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<Module>
return modulesWithKotlinFiles.filter { module ->
ableToRunConfigurators.any { !it.isConfigured(module) }
}
}
}
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))
}
@@ -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
@@ -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() {
@@ -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)
}
@@ -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;
}
@@ -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;
@@ -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)
}
}
}