From f08a7f14e043ce6fce7fb44119cd26ade2cf72a2 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 9 Aug 2016 20:32:22 +0200 Subject: [PATCH] workaround for IDEA's issue that throws an exception when using union() on a LocalSearchScope with no elements (EA-82063 - AIOOBE: GlobalSearchScope.union) --- .../search/ideaExtensions/KotlinReferencesSearcher.kt | 3 ++- .../src/org/jetbrains/kotlin/idea/search/searchUtil.kt | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt index 6d4b7aa1315..f8578a36150 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.search.KOTLIN_NAMED_ARGUMENT_SEARCH_CONTEXT import org.jetbrains.kotlin.idea.search.allScope import org.jetbrains.kotlin.idea.search.effectiveSearchScope +import org.jetbrains.kotlin.idea.search.unionSafe import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction import org.jetbrains.kotlin.idea.search.usagesSearch.getClassNameForCompanionObject import org.jetbrains.kotlin.idea.search.usagesSearch.getSpecialNamesToSearch @@ -80,7 +81,7 @@ class KotlinReferencesSearcher : QueryExecutorBase scope.union(queryParameters.effectiveSearchScope(e)) } + elements.fold(queryParameters.effectiveSearchScope) { scope, e -> scope.unionSafe(queryParameters.effectiveSearchScope(e)) } } val refFilter: (PsiReference) -> Boolean = when { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt index bec4b78a7b0..0142f17d822 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/searchUtil.kt @@ -32,6 +32,16 @@ infix fun SearchScope.or(otherScope: SearchScope): SearchScope = union(otherScop operator fun SearchScope.minus(otherScope: GlobalSearchScope): SearchScope = this and !otherScope operator fun GlobalSearchScope.not(): GlobalSearchScope = GlobalSearchScope.notScope(this) +fun SearchScope.unionSafe(other: SearchScope): SearchScope { + if (this is LocalSearchScope && this.scope.isEmpty()) { + return other + } + if (other is LocalSearchScope && other.scope.isEmpty()) { + return this + } + return this.union(other) +} + fun Project.allScope(): GlobalSearchScope = GlobalSearchScope.allScope(this) fun Project.projectScope(): GlobalSearchScope = GlobalSearchScope.projectScope(this)