From 4391d833b9191e33f5c1ba343c91c0efc4ed30c6 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 14 Jul 2016 15:10:08 +0200 Subject: [PATCH] do not reenter indices to avoid deadlock #KT-12718 Fixed --- .../kotlin/idea/core/KotlinIndicesHelper.kt | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt index ea1d96ebd50..f6f0be54658 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt @@ -23,7 +23,6 @@ import com.intellij.psi.PsiModifier import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.PsiShortNamesCache import com.intellij.psi.stubs.StringStubIndexExtension -import com.intellij.util.Processor import com.intellij.util.indexing.IdFilter import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.getJavaFieldDescriptor @@ -272,9 +271,10 @@ class KotlinIndicesHelper( val idFilter = IdFilter.getProjectIdFilter(resolutionFacade.project, false) val shortNamesCache = PsiShortNamesCache.getInstance(project) - val methodNamesProcessor = Processor { name -> + val allMethodNames = hashSetOf() + shortNamesCache.processAllMethodNames({ name -> if (nameFilter(name)) allMethodNames.add(name); true }, scope, idFilter) + for (name in allMethodNames) { ProgressManager.checkCanceled() - if (!nameFilter(name)) return@Processor true for (method in shortNamesCache.getMethodsByName(name, scope)) { if (!method.hasModifierProperty(PsiModifier.STATIC)) continue @@ -292,13 +292,12 @@ class KotlinIndicesHelper( ?.let { processor(it) } } } - true } - shortNamesCache.processAllMethodNames(methodNamesProcessor, scope, idFilter) - val fieldNamesProcessor = Processor { name -> + val allFieldNames = hashSetOf() + shortNamesCache.processAllFieldNames({ name -> if (nameFilter(name)) allFieldNames.add(name); true }, scope, idFilter) + for (name in allFieldNames) { ProgressManager.checkCanceled() - if (!nameFilter(name)) return@Processor true for (field in shortNamesCache.getFieldsByName(name, scope)) { if (!field.hasModifierProperty(PsiModifier.STATIC)) continue @@ -308,9 +307,7 @@ class KotlinIndicesHelper( processor(descriptor) } } - true } - shortNamesCache.processAllFieldNames(fieldNamesProcessor, scope, idFilter) } private fun isExcludedFromAutoImport(descriptor: DeclarationDescriptor): Boolean {