| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import 'dart:async'; | |
| 6 | |
| 7 import 'package:analysis_server/src/services/search/search_engine.dart'; | |
| 8 import 'package:analyzer/dart/element/element.dart'; | |
| 9 import 'package:analyzer/src/dart/analysis/driver.dart'; | |
| 10 import 'package:analyzer/src/dart/analysis/search.dart'; | |
| 11 import 'package:analyzer/src/generated/source.dart' show Source, SourceRange; | |
| 12 | |
| 13 /** | |
| 14 * A [SearchEngine] implementation. | |
| 15 */ | |
| 16 class SearchEngineImpl2 implements SearchEngine { | |
| 17 final Iterable<AnalysisDriver> _drivers; | |
| 18 | |
| 19 SearchEngineImpl2(this._drivers); | |
| 20 | |
| 21 @override | |
| 22 Future<Set<ClassElement>> searchAllSubtypes(ClassElement type) async { | |
| 23 Set<ClassElement> allSubtypes = new Set<ClassElement>(); | |
| 24 | |
| 25 Future<Null> addSubtypes(ClassElement type) async { | |
| 26 List<SearchResult> directResults = await _searchDirectSubtypes(type); | |
| 27 for (SearchResult directResult in directResults) { | |
| 28 var directSubtype = directResult.enclosingElement as ClassElement; | |
| 29 if (allSubtypes.add(directSubtype)) { | |
| 30 await addSubtypes(directSubtype); | |
| 31 } | |
| 32 } | |
| 33 } | |
| 34 | |
| 35 await addSubtypes(type); | |
| 36 return allSubtypes; | |
| 37 } | |
| 38 | |
| 39 @override | |
| 40 Future<List<SearchMatch>> searchMemberDeclarations(String name) async { | |
| 41 List<SearchMatch> allDeclarations = []; | |
| 42 List<AnalysisDriver> drivers = _drivers.toList(); | |
| 43 for (AnalysisDriver driver in drivers) { | |
| 44 List<Element> elements = await driver.search.classMembers(name); | |
| 45 allDeclarations.addAll(elements.map(_SearchMatch.forElement)); | |
| 46 } | |
| 47 return allDeclarations; | |
| 48 } | |
| 49 | |
| 50 @override | |
| 51 Future<List<SearchMatch>> searchMemberReferences(String name) async { | |
| 52 List<SearchResult> allResults = []; | |
| 53 List<AnalysisDriver> drivers = _drivers.toList(); | |
| 54 for (AnalysisDriver driver in drivers) { | |
| 55 List<SearchResult> results = | |
| 56 await driver.search.unresolvedMemberReferences(name); | |
| 57 allResults.addAll(results); | |
| 58 } | |
| 59 return allResults.map(_SearchMatch.forSearchResult).toList(); | |
| 60 } | |
| 61 | |
| 62 @override | |
| 63 Future<List<SearchMatch>> searchReferences(Element element) async { | |
| 64 List<SearchResult> allResults = []; | |
| 65 List<AnalysisDriver> drivers = _drivers.toList(); | |
| 66 for (AnalysisDriver driver in drivers) { | |
| 67 List<SearchResult> results = await driver.search.references(element); | |
| 68 allResults.addAll(results); | |
| 69 } | |
| 70 return allResults.map(_SearchMatch.forSearchResult).toList(); | |
| 71 } | |
| 72 | |
| 73 @override | |
| 74 Future<List<SearchMatch>> searchSubtypes(ClassElement type) async { | |
| 75 List<SearchResult> results = await _searchDirectSubtypes(type); | |
| 76 return results.map(_SearchMatch.forSearchResult).toList(); | |
| 77 } | |
| 78 | |
| 79 @override | |
| 80 Future<List<SearchMatch>> searchTopLevelDeclarations(String pattern) async { | |
| 81 List<SearchMatch> allDeclarations = []; | |
| 82 RegExp regExp = new RegExp(pattern); | |
| 83 List<AnalysisDriver> drivers = _drivers.toList(); | |
| 84 for (AnalysisDriver driver in drivers) { | |
| 85 List<Element> elements = await driver.search.topLevelElements(regExp); | |
| 86 allDeclarations.addAll(elements.map(_SearchMatch.forElement)); | |
| 87 } | |
| 88 return allDeclarations; | |
| 89 } | |
| 90 | |
| 91 Future<List<SearchResult>> _searchDirectSubtypes(ClassElement type) async { | |
| 92 List<SearchResult> allResults = []; | |
| 93 List<AnalysisDriver> drivers = _drivers.toList(); | |
| 94 for (AnalysisDriver driver in drivers) { | |
| 95 List<SearchResult> results = await driver.search.subTypes(type); | |
| 96 allResults.addAll(results); | |
| 97 } | |
| 98 return allResults; | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 class _SearchMatch implements SearchMatch { | |
| 103 @override | |
| 104 final String file; | |
| 105 | |
| 106 @override | |
| 107 final Source librarySource; | |
| 108 | |
| 109 @override | |
| 110 final Source unitSource; | |
| 111 | |
| 112 @override | |
| 113 final LibraryElement libraryElement; | |
| 114 | |
| 115 @override | |
| 116 final Element element; | |
| 117 | |
| 118 @override | |
| 119 final bool isResolved; | |
| 120 | |
| 121 @override | |
| 122 final bool isQualified; | |
| 123 | |
| 124 @override | |
| 125 final MatchKind kind; | |
| 126 | |
| 127 @override | |
| 128 final SourceRange sourceRange; | |
| 129 | |
| 130 _SearchMatch( | |
| 131 this.file, | |
| 132 this.librarySource, | |
| 133 this.unitSource, | |
| 134 this.libraryElement, | |
| 135 this.element, | |
| 136 this.isResolved, | |
| 137 this.isQualified, | |
| 138 this.kind, | |
| 139 this.sourceRange); | |
| 140 | |
| 141 @override | |
| 142 String toString() { | |
| 143 StringBuffer buffer = new StringBuffer(); | |
| 144 buffer.write("SearchMatch(kind="); | |
| 145 buffer.write(kind); | |
| 146 buffer.write(", libraryUri="); | |
| 147 buffer.write(librarySource.uri); | |
| 148 buffer.write(", unitUri="); | |
| 149 buffer.write(unitSource.uri); | |
| 150 buffer.write(", range="); | |
| 151 buffer.write(sourceRange); | |
| 152 buffer.write(", isResolved="); | |
| 153 buffer.write(isResolved); | |
| 154 buffer.write(", isQualified="); | |
| 155 buffer.write(isQualified); | |
| 156 buffer.write(")"); | |
| 157 return buffer.toString(); | |
| 158 } | |
| 159 | |
| 160 static _SearchMatch forElement(Element element) { | |
| 161 return new _SearchMatch( | |
| 162 element.source.fullName, | |
| 163 element.librarySource, | |
| 164 element.source, | |
| 165 element.library, | |
| 166 element, | |
| 167 true, | |
| 168 true, | |
| 169 MatchKind.DECLARATION, | |
| 170 new SourceRange(element.nameOffset, element.nameLength)); | |
| 171 } | |
| 172 | |
| 173 static _SearchMatch forSearchResult(SearchResult result) { | |
| 174 Element enclosingElement = result.enclosingElement; | |
| 175 return new _SearchMatch( | |
| 176 enclosingElement.source.fullName, | |
| 177 enclosingElement.librarySource, | |
| 178 enclosingElement.source, | |
| 179 enclosingElement.library, | |
| 180 enclosingElement, | |
| 181 result.isResolved, | |
| 182 result.isQualified, | |
| 183 toMatchKind(result.kind), | |
| 184 new SourceRange(result.offset, result.length)); | |
| 185 } | |
| 186 | |
| 187 static MatchKind toMatchKind(SearchResultKind kind) { | |
| 188 if (kind == SearchResultKind.READ) { | |
| 189 return MatchKind.READ; | |
| 190 } | |
| 191 if (kind == SearchResultKind.READ_WRITE) { | |
| 192 return MatchKind.READ_WRITE; | |
| 193 } | |
| 194 if (kind == SearchResultKind.WRITE) { | |
| 195 return MatchKind.WRITE; | |
| 196 } | |
| 197 if (kind == SearchResultKind.INVOCATION) { | |
| 198 return MatchKind.INVOCATION; | |
| 199 } | |
| 200 return MatchKind.REFERENCE; | |
| 201 } | |
| 202 } | |
| OLD | NEW |