correctly detect Gradle modules (previous code, besides being crazy overcomplicated, didn't always work because module.getModuleFile() returns null immediately after a project has been imported from Gradle and before it has been saved)

This commit is contained in:
Dmitry Jemerov
2016-02-18 19:01:46 +01:00
parent edcd469e44
commit 207c5e188b
4 changed files with 8 additions and 111 deletions
@@ -26,7 +26,5 @@ public abstract class KotlinModuleTypeManager {
}
public abstract boolean isAndroidGradleModule(@NotNull Module module);
public boolean isGradleModule(@NotNull Module module) {
return ModuleTypeCacheManager.getInstance(module.getProject()).isGradleModule(module);
}
public abstract boolean isGradleModule(@NotNull Module module);
}
@@ -1,105 +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.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.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
import com.intellij.openapi.util.SimpleModificationTracker
class ModuleTypeCacheManager private constructor(project: Project) {
companion object {
@JvmStatic
fun getInstance(project: Project) = ServiceManager.getService(project, ModuleTypeCacheManager::class.java)
}
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>(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): SimpleModificationTracker() {
init {
val connection = project.messageBus.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.moduleFile
if (moduleFile == null){
return false
}
val buildFile = moduleFile.parent?.findChild(DEFAULT_SCRIPT_NAME)
return buildFile != null && buildFile.exists()
}
-3
View File
@@ -233,9 +233,6 @@
<projectService serviceInterface="org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider"
serviceImplementation="org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.configuration.ModuleTypeCacheManager"
serviceImplementation="org.jetbrains.kotlin.idea.configuration.ModuleTypeCacheManager"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder"
serviceImplementation="org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder"/>
@@ -18,6 +18,8 @@ package org.jetbrains.kotlin.idea;
import com.intellij.facet.Facet;
import com.intellij.facet.FacetManager;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.module.Module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.idea.configuration.KotlinModuleTypeManager;
@@ -36,4 +38,9 @@ public class KotlinModuleTypeManagerImpl extends KotlinModuleTypeManager {
}
return false;
}
@Override
public boolean isGradleModule(@NotNull Module module) {
return ExternalSystemApiUtil.isExternalSystemAwareModule(new ProjectSystemId("GRADLE"), module);
}
}