From 96f8403d1c06b41183f95d3fc80eec7c59336efc Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Mon, 30 Sep 2013 11:37:27 +0400 Subject: [PATCH] Cache module type --- idea/src/META-INF/plugin.xml | 3 + .../jetbrains/jet/plugin/JetPluginUtil.java | 7 +- .../plugin/configuration/ModuleTypeCache.kt | 88 +++++++++++++++++++ 3 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 idea/src/org/jetbrains/jet/plugin/configuration/ModuleTypeCache.kt diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 641a43cba37..ee04e6f494f 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -113,6 +113,9 @@ + + diff --git a/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java b/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java index 9d7efeba33b..274e19010ec 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/JetPluginUtil.java @@ -40,6 +40,7 @@ import org.jetbrains.jet.lang.types.DeferredType; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; +import org.jetbrains.jet.plugin.configuration.ModuleTypeCacheManager; import java.util.LinkedList; @@ -150,11 +151,7 @@ public class JetPluginUtil { } public static boolean isGradleModule(@NotNull Module module) { - VirtualFile moduleFile = module.getModuleFile(); - if (moduleFile == null) return false; - - VirtualFile buildFile = moduleFile.getParent().findChild("build.gradle"); - return buildFile != null && buildFile.exists(); + return ModuleTypeCacheManager.object$.geInstance(module.getProject()).isGradleModule(module); } public static boolean isMavenModule(@NotNull Module module) { diff --git a/idea/src/org/jetbrains/jet/plugin/configuration/ModuleTypeCache.kt b/idea/src/org/jetbrains/jet/plugin/configuration/ModuleTypeCache.kt new file mode 100644 index 00000000000..07d9a924c9f --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/configuration/ModuleTypeCache.kt @@ -0,0 +1,88 @@ +package org.jetbrains.jet.plugin.configuration + +import com.intellij.openapi.module.Module +import com.intellij.openapi.components.ServiceManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.VirtualFileManager +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager +import com.intellij.openapi.util.DefaultModificationTracker +import com.intellij.openapi.vfs.impl.BulkVirtualFileListenerAdapter +import com.intellij.openapi.vfs.VirtualFileAdapter +import com.intellij.openapi.vfs.VirtualFileEvent +import com.intellij.openapi.vfs.VirtualFileMoveEvent +import com.intellij.openapi.vfs.VirtualFileCopyEvent +import com.intellij.openapi.vfs.VirtualFilePropertyEvent + +class ModuleTypeCacheManager private (project: Project) { + class object { + fun geInstance(project: Project) = ServiceManager.getService(project, javaClass()) + } + + private val vfsModificationTracker = VfsModificationTracker(project) + + private val cachedValue = CachedValuesManager.getManager(project).createParameterizedCachedValue( + { + (module: Module?) -> + val moduleType = if (module != null) computeType(module) else null + CachedValueProvider.Result.create(moduleType, vfsModificationTracker) + }, false) + + fun isGradleModule(module: Module) = getModuleType(module) == ModuleType.GRADLE + + private fun getModuleType(module: Module): ModuleType? { + return cachedValue?.getValue(module) + } + + private class VfsModificationTracker(project: Project): DefaultModificationTracker() { + { + val connection = project.getMessageBus().connect(); + connection.subscribe(VirtualFileManager.VFS_CHANGES, BulkVirtualFileListenerAdapter( + object : VirtualFileAdapter() { + override fun propertyChanged(event: VirtualFilePropertyEvent?) { + incModificationCount() + } + + override fun fileCreated(event: VirtualFileEvent?) { + incModificationCount() + } + + override fun fileDeleted(event: VirtualFileEvent?) { + incModificationCount() + } + + override fun fileMoved(event: VirtualFileMoveEvent?) { + incModificationCount() + } + + override fun fileCopied(event: VirtualFileCopyEvent?) { + incModificationCount() + } + } + )) + } + } +} + +enum class ModuleType { + GRADLE + OTHER +} + +private fun computeType(module: Module) = + when { + isGradleModule(module) -> ModuleType.GRADLE + else -> ModuleType.OTHER + } + +private val DEFAULT_SCRIPT_NAME = "build.gradle" + +private fun isGradleModule(module: Module): Boolean { + val moduleFile = module.getModuleFile() + if (moduleFile == null){ + return false + } + + val buildFile = moduleFile.getParent()?.findChild(DEFAULT_SCRIPT_NAME) + return buildFile != null && buildFile.exists() +} \ No newline at end of file