| Index: pkg/analyzer/lib/src/dart/analysis/search.dart
|
| diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
|
| index e28a5b6dd5ba76d02ecf69aa933232c975b15938..1dfe7b3600bfc871370795e51bb8a8d6bc4a4cd4 100644
|
| --- a/pkg/analyzer/lib/src/dart/analysis/search.dart
|
| +++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
|
| @@ -21,47 +21,46 @@ class Search {
|
| Search(this._driver);
|
|
|
| /**
|
| - * Returns references to the element at the given [offset] in the file with
|
| - * the given [path].
|
| + * Returns references to the [element].
|
| */
|
| - Future<List<SearchResult>> references(String path, int offset) async {
|
| - // Search only in added files.
|
| - if (!_driver.addedFiles.contains(path)) {
|
| + Future<List<SearchResult>> references(Element element) async {
|
| + if (element == null) {
|
| return const <SearchResult>[];
|
| }
|
|
|
| + ElementKind kind = element.kind;
|
| + if (kind == ElementKind.LABEL || kind == ElementKind.LOCAL_VARIABLE) {
|
| + return _searchReferences_Local(element, (n) => n is Block);
|
| + }
|
| + // TODO(scheglov) support other kinds
|
| + return const <SearchResult>[];
|
| + }
|
| +
|
| + Future<List<SearchResult>> _searchReferences_Local(
|
| + Element element, bool isRootNode(AstNode n)) async {
|
| + String path = element.source.fullName;
|
| +
|
| + // Prepare the unit.
|
| AnalysisResult analysisResult = await _driver.getResult(path);
|
| CompilationUnit unit = analysisResult.unit;
|
| -
|
| - // Prepare the node.
|
| - AstNode node = new NodeLocator(offset).searchWithin(unit);
|
| - if (node == null) {
|
| + if (unit == null) {
|
| return const <SearchResult>[];
|
| }
|
|
|
| - // Prepare the element.
|
| - Element element = ElementLocator.locate(node);
|
| - if (element == null) {
|
| + // Prepare the node.
|
| + AstNode node = new NodeLocator(element.nameOffset).searchWithin(unit);
|
| + if (node == null) {
|
| return const <SearchResult>[];
|
| }
|
|
|
| - ElementKind kind = element.kind;
|
| - if (kind == ElementKind.LABEL || kind == ElementKind.LOCAL_VARIABLE) {
|
| - Block block = node.getAncestor((n) => n is Block);
|
| - return _searchReferences_Local(element, unit.element, block);
|
| - }
|
| - // TODO(scheglov) support other kinds
|
| - return [];
|
| - }
|
| + // Prepare the enclosing node.
|
| + AstNode enclosingNode = node.getAncestor(isRootNode);
|
|
|
| - Future<List<SearchResult>> _searchReferences_Local(
|
| - Element element,
|
| - CompilationUnitElement enclosingUnitElement,
|
| - AstNode enclosingNode) async {
|
| + // Find the matches.
|
| _LocalReferencesVisitor visitor =
|
| - new _LocalReferencesVisitor(element, enclosingUnitElement);
|
| - enclosingNode?.accept(visitor);
|
| - return visitor.matches;
|
| + new _LocalReferencesVisitor(element, unit.element);
|
| + enclosingNode.accept(visitor);
|
| + return visitor.results;
|
| }
|
| }
|
|
|
| @@ -159,7 +158,7 @@ class _ContainingElementFinder extends GeneralizingElementVisitor {
|
| * type parameters, import prefixes.
|
| */
|
| class _LocalReferencesVisitor extends RecursiveAstVisitor {
|
| - final List<SearchResult> matches = <SearchResult>[];
|
| + final List<SearchResult> results = <SearchResult>[];
|
|
|
| final Element element;
|
| final CompilationUnitElement enclosingUnitElement;
|
| @@ -193,15 +192,15 @@ class _LocalReferencesVisitor extends RecursiveAstVisitor {
|
| kind = SearchResultKind.WRITE;
|
| }
|
| }
|
| - _addMatch(node, kind);
|
| + _addResult(node, kind);
|
| }
|
| }
|
|
|
| - void _addMatch(AstNode node, SearchResultKind kind) {
|
| + void _addResult(AstNode node, SearchResultKind kind) {
|
| bool isQualified = node.parent is Label;
|
| var finder = new _ContainingElementFinder(node.offset);
|
| enclosingUnitElement.accept(finder);
|
| - matches.add(new SearchResult._(element, finder.containingElement, kind,
|
| + results.add(new SearchResult._(element, finder.containingElement, kind,
|
| node.offset, node.length, true, isQualified));
|
| }
|
| }
|
|
|