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