Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analysis_server.src.services.search.search_engine_internal; | 5 library analysis_server.src.services.search.search_engine_internal; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/services/correction/source_range.dart'; | 9 import 'package:analysis_server/src/services/correction/source_range.dart'; |
| 10 import 'package:analysis_server/src/services/index/index.dart'; | 10 import 'package:analysis_server/src/services/index/index.dart'; |
| 11 import 'package:analysis_server/src/services/search/search_engine.dart'; | 11 import 'package:analysis_server/src/services/search/search_engine.dart'; |
| 12 import 'package:analyzer/dart/ast/ast.dart'; | 12 import 'package:analyzer/dart/ast/ast.dart'; |
| 13 import 'package:analyzer/dart/ast/visitor.dart'; | 13 import 'package:analyzer/dart/ast/visitor.dart'; |
| 14 import 'package:analyzer/dart/element/element.dart'; | 14 import 'package:analyzer/dart/element/element.dart'; |
| 15 import 'package:analyzer/dart/element/visitor.dart'; | 15 import 'package:analyzer/dart/element/visitor.dart'; |
| 16 import 'package:analyzer/src/dart/element/ast_provider.dart'; | |
| 16 import 'package:analyzer/src/dart/element/element.dart'; | 17 import 'package:analyzer/src/dart/element/element.dart'; |
| 17 import 'package:analyzer/src/dart/element/member.dart'; | 18 import 'package:analyzer/src/dart/element/member.dart'; |
| 18 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; | 19 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; |
| 19 import 'package:analyzer/src/generated/resolver.dart' show NamespaceBuilder; | 20 import 'package:analyzer/src/generated/resolver.dart' show NamespaceBuilder; |
| 20 import 'package:analyzer/src/generated/source.dart' show Source, SourceRange; | 21 import 'package:analyzer/src/generated/source.dart' show Source, SourceRange; |
| 21 import 'package:analyzer/src/generated/utilities_general.dart'; | 22 import 'package:analyzer/src/generated/utilities_general.dart'; |
| 22 import 'package:analyzer/src/summary/idl.dart'; | 23 import 'package:analyzer/src/summary/idl.dart'; |
| 23 | 24 |
| 24 /** | 25 /** |
| 26 * The type of a function that returns the [AstProvider] managing the [file]. | |
| 27 */ | |
| 28 typedef AstProvider GetAstProvider(String file); | |
|
Brian Wilkerson
2017/02/03 14:43:47
Is this necessary? It seems like it's just as perf
scheglov
2017/02/03 18:31:36
AstProvider is bound to a single AnalysisDriver or
Brian Wilkerson
2017/02/03 18:38:25
That makes sense. It would be good to add that to
| |
| 29 | |
| 30 /** | |
| 25 * A [SearchEngine] implementation. | 31 * A [SearchEngine] implementation. |
| 26 */ | 32 */ |
| 27 class SearchEngineImpl implements SearchEngine { | 33 class SearchEngineImpl implements SearchEngine { |
| 28 final Index _index; | 34 final Index _index; |
| 35 final GetAstProvider _getAstProvider; | |
| 29 | 36 |
| 30 SearchEngineImpl(this._index); | 37 SearchEngineImpl(this._index, this._getAstProvider); |
| 31 | 38 |
| 32 @override | 39 @override |
| 33 Future<Set<ClassElement>> searchAllSubtypes(ClassElement type) async { | 40 Future<Set<ClassElement>> searchAllSubtypes(ClassElement type) async { |
| 34 List<SearchMatch> matches = <SearchMatch>[]; | 41 List<SearchMatch> matches = <SearchMatch>[]; |
| 35 await _addMatches( | 42 await _addMatches( |
| 36 matches, type, IndexRelationKind.IS_ANCESTOR_OF, MatchKind.DECLARATION); | 43 matches, type, IndexRelationKind.IS_ANCESTOR_OF, MatchKind.DECLARATION); |
| 37 return matches.map((match) => match.element as ClassElement).toSet(); | 44 return matches.map((match) => match.element as ClassElement).toSet(); |
| 38 } | 45 } |
| 39 | 46 |
| 40 @override | 47 @override |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 247 false)); | 254 false)); |
| 248 } | 255 } |
| 249 } | 256 } |
| 250 } | 257 } |
| 251 return matches; | 258 return matches; |
| 252 } | 259 } |
| 253 | 260 |
| 254 Future<List<SearchMatch>> _searchReferences_Local( | 261 Future<List<SearchMatch>> _searchReferences_Local( |
| 255 Element element, bool isRootNode(AstNode n)) async { | 262 Element element, bool isRootNode(AstNode n)) async { |
| 256 _LocalReferencesVisitor visitor = new _LocalReferencesVisitor(element); | 263 _LocalReferencesVisitor visitor = new _LocalReferencesVisitor(element); |
| 257 AstNode node = element.computeNode(); | 264 AstProvider astProvider = _getAstProvider(element.source.fullName); |
| 265 AstNode node = await astProvider.getResolvedNodeForElement(element); | |
| 258 AstNode enclosingNode = node?.getAncestor(isRootNode); | 266 AstNode enclosingNode = node?.getAncestor(isRootNode); |
| 259 enclosingNode?.accept(visitor); | 267 enclosingNode?.accept(visitor); |
| 260 return visitor.matches; | 268 return visitor.matches; |
| 261 } | 269 } |
| 262 | 270 |
| 263 Future<List<SearchMatch>> _searchReferences_Parameter( | 271 Future<List<SearchMatch>> _searchReferences_Parameter( |
| 264 ParameterElement parameter) async { | 272 ParameterElement parameter) async { |
| 265 List<SearchMatch> matches = <SearchMatch>[]; | 273 List<SearchMatch> matches = <SearchMatch>[]; |
| 266 matches.addAll(await _searchReferences(parameter)); | 274 matches.addAll(await _searchReferences(parameter)); |
| 267 matches.addAll(await _searchReferences_Local(parameter, (AstNode node) { | 275 matches.addAll(await _searchReferences_Local(parameter, (AstNode node) { |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 575 _addMatch(node, kind); | 583 _addMatch(node, kind); |
| 576 } | 584 } |
| 577 } | 585 } |
| 578 | 586 |
| 579 void _addMatch(AstNode node, MatchKind kind) { | 587 void _addMatch(AstNode node, MatchKind kind) { |
| 580 bool isQualified = node.parent is Label; | 588 bool isQualified = node.parent is Label; |
| 581 matches.add(new SearchMatchImpl(context, libraryUri, unitUri, kind, | 589 matches.add(new SearchMatchImpl(context, libraryUri, unitUri, kind, |
| 582 rangeNode(node), true, isQualified)); | 590 rangeNode(node), true, isQualified)); |
| 583 } | 591 } |
| 584 } | 592 } |
| OLD | NEW |