From c5309d795521c0c54dca09c180a4d96d5d7ca2cc Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 22 Sep 2015 14:35:49 +0200 Subject: [PATCH] to avoid deadlock, don't refresh VFS during service initialization, instead refresh asynchronously during plugin initialization --- .../references/BuiltInsReferenceResolver.kt | 20 +++++++++++++------ .../kotlin/idea/PluginStartupComponent.java | 3 +++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt index 8578f58c585..f3491dfc68c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolver.kt @@ -94,12 +94,7 @@ public class BuiltInsReferenceResolver(val project: Project, val startupManager: val vf = VirtualFileManager.getInstance().findFileByUrl(fromUrl) assert(vf != null) { "Virtual file not found by URL: $url" } - // Refreshing VFS: in case the plugin jar was updated, the caches may hold the old value - vf!!.getChildren() - vf.refresh(false, true) - PathUtil.getLocalFile(vf).refresh(false, true) - - val psiDirectory = PsiManager.getInstance(project).findDirectory(vf) + val psiDirectory = PsiManager.getInstance(project).findDirectory(vf!!) assert(psiDirectory != null) { "No PsiDirectory for $vf" } return psiDirectory!!.getFiles().filterIsInstance().toHashSet() } @@ -188,5 +183,18 @@ public class BuiltInsReferenceResolver(val project: Project, val startupManager: } return setOf(defaultBuiltIns) } + + public fun refreshBuiltIns() { + getBuiltInsDirUrls().forEach { url -> + val fromUrl = VfsUtilCore.convertFromUrl(url) + val vf = VirtualFileManager.getInstance().findFileByUrl(fromUrl) + assert(vf != null) { "Virtual file not found by URL: $url" } + + // Refreshing VFS: in case the plugin jar was updated, the caches may hold the old value + vf!!.getChildren() + vf.refresh(true, true) + PathUtil.getLocalFile(vf).refresh(true, true) + } + } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/PluginStartupComponent.java b/idea/src/org/jetbrains/kotlin/idea/PluginStartupComponent.java index 9335ba9202f..c350077a91f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/PluginStartupComponent.java +++ b/idea/src/org/jetbrains/kotlin/idea/PluginStartupComponent.java @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.idea.caches.JarUserDataManager; import org.jetbrains.kotlin.idea.debugger.filter.DebuggerFiltersUtilKt; import org.jetbrains.kotlin.idea.decompiler.HasCompiledKotlinInJar; import org.jetbrains.kotlin.idea.framework.KotlinJavaScriptLibraryDetectionUtil; +import org.jetbrains.kotlin.idea.references.BuiltInsReferenceResolver; import org.jetbrains.kotlin.utils.PathUtil; import java.io.File; @@ -49,6 +50,8 @@ public class PluginStartupComponent implements ApplicationComponent { JarUserDataManager.INSTANCE$.register(KotlinJavaScriptLibraryDetectionUtil.HasKotlinJSMetadataInJar.INSTANCE$); JarUserDataManager.INSTANCE$.register(HasCompiledKotlinInJar.INSTANCE$); + BuiltInsReferenceResolver.Companion.refreshBuiltIns(); + DebuggerFiltersUtilKt.addKotlinStdlibDebugFilterIfNeeded(); }