[api] Symbol Reference Search

GitOrigin-RevId: 726bd49dc14d557c5a97da27470e21da9bd203b5
This commit is contained in:
Daniil Ovchinnikov
2019-08-01 14:06:26 +03:00
committed by intellij-monorepo-bot
parent 9aa4b0cfa6
commit a0ee74c04e
5 changed files with 61 additions and 0 deletions

View File

@@ -1,8 +1,11 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.model.search;
import com.intellij.model.Symbol;
import com.intellij.model.SymbolReference;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.Query;
import org.jetbrains.annotations.NotNull;
@@ -31,6 +34,12 @@ public interface SearchService {
@NotNull
SearchWordQueryBuilder searchWord(@NotNull Project project, @NotNull String word);
/**
* Creates new query for searching references by symbol.
*/
@NotNull
Query<SymbolReference> searchSymbol(@NotNull Project project, @NotNull Symbol symbol, @NotNull SearchScope searchScope);
/**
* Merges a list of queries into a single query.
*/

View File

@@ -15,6 +15,8 @@ import java.util.Collection;
* Implementations should be registered at {@code com.intellij.searcher} extension point.
* <p/>
* It's highly advised to use {@link SearchService} methods to build additional queries.
*
* @see SymbolReferenceSearcher
*/
public interface Searcher<P extends SearchParameters<R>, R> {

View File

@@ -0,0 +1,19 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.model.search;
import com.intellij.model.Symbol;
import com.intellij.model.SymbolReference;
import com.intellij.psi.search.SearchScope;
import org.jetbrains.annotations.NotNull;
public interface SymbolReferenceSearchParameters extends SearchParameters<SymbolReference> {
/**
* @return target symbol to search for references
*/
@NotNull
Symbol getSymbol();
@NotNull
SearchScope getSearchScope();
}

View File

@@ -0,0 +1,11 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.model.search;
import com.intellij.model.Symbol;
import com.intellij.model.SymbolReference;
/**
* Convenience interface for requestors providing additional queries to find {@link SymbolReference}s by {@link Symbol}.
*/
public interface SymbolReferenceSearcher extends Searcher<SymbolReferenceSearchParameters, SymbolReference> {
}

View File

@@ -1,10 +1,15 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.model.search.impl
import com.intellij.model.Pointer
import com.intellij.model.Symbol
import com.intellij.model.SymbolReference
import com.intellij.model.search.SearchParameters
import com.intellij.model.search.SearchService
import com.intellij.model.search.SearchWordQueryBuilder
import com.intellij.model.search.SymbolReferenceSearchParameters
import com.intellij.openapi.project.Project
import com.intellij.psi.search.SearchScope
import com.intellij.util.EmptyQuery
import com.intellij.util.Query
@@ -14,6 +19,21 @@ class SearchServiceImpl : SearchService {
override fun searchWord(project: Project, word: String): SearchWordQueryBuilder = SearchWordQueryBuilderImpl(project, word)
override fun searchSymbol(project: Project, symbol: Symbol, searchScope: SearchScope): Query<SymbolReference> {
return searchParameters(DefaultSymbolReferenceSearchParameters(project, symbol.createPointer(), searchScope))
}
private class DefaultSymbolReferenceSearchParameters(
private val project: Project,
private val pointer: Pointer<out Symbol>,
private val searchScope: SearchScope
) : SymbolReferenceSearchParameters {
override fun areValid(): Boolean = pointer.dereference() != null
override fun getProject(): Project = project
override fun getSymbol(): Symbol = requireNotNull(pointer.dereference()) { "#getSymbol() must not be called on invalid parameters" }
override fun getSearchScope(): SearchScope = searchScope
}
override fun <T : Any?> merge(queries: List<Query<out T>>): Query<out T> {
return when (queries.size) {
0 -> EmptyQuery.getEmptyQuery()