From 8d2ac7c4837b6a0d168cce4b72d937a0ef11a8b7 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 16 Dec 2013 14:46:47 +0400 Subject: [PATCH] Implement hierarchical search --- .../declarationSearchUtil.kt | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/declarationSearchUtil.kt b/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/declarationSearchUtil.kt index 8cb4bf56d90..b2e0cc9461e 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/declarationSearchUtil.kt +++ b/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/declarationSearchUtil.kt @@ -62,11 +62,14 @@ public class HierarchySearchRequest ( override val originalElement: T, override val searchScope: SearchScope, val searchDeeply: Boolean = true -) : SearchRequestWithElement +) : SearchRequestWithElement { + fun copy(newOriginalElement: U): HierarchySearchRequest = + HierarchySearchRequest(newOriginalElement, searchScope, searchDeeply) +} -abstract class HierarchyTraverser { - protected abstract fun nextElements(current: T): Iterable - protected abstract fun shouldDescend(element: T): Boolean +trait HierarchyTraverser { + protected fun nextElements(current: T): Iterable + protected fun shouldDescend(element: T): Boolean fun forEach(initialElement: T, body: (T) -> Unit) { val stack = Stack() @@ -99,3 +102,22 @@ fun Processor.consumeHierarchy(request: SearchRequestWithElem } } } + +abstract class HierarchySearch( + protected val traverser: HierarchyTraverser +): DeclarationsSearch>() { + protected open fun doSearchAll(request: HierarchySearchRequest, consumer: Processor) { + consumer.consumeHierarchy(request, traverser) + } + + protected abstract fun doSearchDirect(request: HierarchySearchRequest, consumer: Processor) + + protected override fun doSearch(request: HierarchySearchRequest, consumer: Processor) { + if (request.searchDeeply) { + doSearchAll(request, consumer) + } + else { + doSearchDirect(request, consumer) + } + } +} \ No newline at end of file