| 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 | 6 |
| 7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/dart/element/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
| 9 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; | 9 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; |
| 10 import 'package:analyzer/src/generated/source.dart'; | 10 import 'package:analyzer/src/generated/source.dart'; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 } | 88 } |
| 89 | 89 |
| 90 /** | 90 /** |
| 91 * Remove all index information for the given [context]. | 91 * Remove all index information for the given [context]. |
| 92 */ | 92 */ |
| 93 void removeContext(AnalysisContext context) { | 93 void removeContext(AnalysisContext context) { |
| 94 _contextIndexMap.remove(context); | 94 _contextIndexMap.remove(context); |
| 95 } | 95 } |
| 96 | 96 |
| 97 /** | 97 /** |
| 98 * Remove index information about the unit in the given [context]. |
| 99 */ |
| 100 void removeUnit( |
| 101 AnalysisContext context, Source librarySource, Source unitSource) { |
| 102 _contextIndexMap[context]?.removeUnit(librarySource, unitSource); |
| 103 } |
| 104 |
| 105 /** |
| 98 * Return the [_ContextIndex] instance for the given [context]. | 106 * Return the [_ContextIndex] instance for the given [context]. |
| 99 */ | 107 */ |
| 100 _ContextIndex _getContextIndex(AnalysisContext context) { | 108 _ContextIndex _getContextIndex(AnalysisContext context) { |
| 101 return _contextIndexMap.putIfAbsent(context, () { | 109 return _contextIndexMap.putIfAbsent(context, () { |
| 102 return new _ContextIndex(context); | 110 return new _ContextIndex(context); |
| 103 }); | 111 }); |
| 104 } | 112 } |
| 105 | 113 |
| 106 /** | 114 /** |
| 107 * Complete with a list of all results returned by the [callback] for every | 115 * Complete with a list of all results returned by the [callback] for every |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 final Map<String, PackageIndex> indexMap = <String, PackageIndex>{}; | 208 final Map<String, PackageIndex> indexMap = <String, PackageIndex>{}; |
| 201 | 209 |
| 202 _ContextIndex(this.context); | 210 _ContextIndex(this.context); |
| 203 | 211 |
| 204 /** | 212 /** |
| 205 * Complete with a list of locations where elements of the given [kind] with | 213 * Complete with a list of locations where elements of the given [kind] with |
| 206 * names satisfying the given [regExp] are defined. | 214 * names satisfying the given [regExp] are defined. |
| 207 */ | 215 */ |
| 208 Future<List<Location>> getDefinedNames( | 216 Future<List<Location>> getDefinedNames( |
| 209 RegExp regExp, IndexNameKind kind) async { | 217 RegExp regExp, IndexNameKind kind) async { |
| 210 return _mergeLocations((PackageIndex index) { | 218 return _mergeLocations((_PackageIndexRequester requester) { |
| 211 _PackageIndexRequester requester = new _PackageIndexRequester(index); | |
| 212 return requester.getDefinedNames(context, regExp, kind); | 219 return requester.getDefinedNames(context, regExp, kind); |
| 213 }); | 220 }); |
| 214 } | 221 } |
| 215 | 222 |
| 216 /** | 223 /** |
| 217 * Complete with a list of locations where the given [element] has relation | 224 * Complete with a list of locations where the given [element] has relation |
| 218 * of the given [kind]. | 225 * of the given [kind]. |
| 219 */ | 226 */ |
| 220 Future<List<Location>> getRelations(Element element, IndexRelationKind kind) { | 227 Future<List<Location>> getRelations(Element element, IndexRelationKind kind) { |
| 221 return _mergeLocations((PackageIndex index) { | 228 return _mergeLocations((_PackageIndexRequester requester) { |
| 222 _PackageIndexRequester requester = new _PackageIndexRequester(index); | |
| 223 return requester.getRelations(context, element, kind); | 229 return requester.getRelations(context, element, kind); |
| 224 }); | 230 }); |
| 225 } | 231 } |
| 226 | 232 |
| 227 /** | 233 /** |
| 228 * Complete with a list of locations where a class members with the given | 234 * Complete with a list of locations where a class members with the given |
| 229 * [name] is referenced with a qualifier, but is not resolved. | 235 * [name] is referenced with a qualifier, but is not resolved. |
| 230 */ | 236 */ |
| 231 Future<List<Location>> getUnresolvedMemberReferences(String name) async { | 237 Future<List<Location>> getUnresolvedMemberReferences(String name) async { |
| 232 return _mergeLocations((PackageIndex index) { | 238 return _mergeLocations((_PackageIndexRequester requester) { |
| 233 _PackageIndexRequester requester = new _PackageIndexRequester(index); | |
| 234 return requester.getUnresolvedMemberReferences(context, name); | 239 return requester.getUnresolvedMemberReferences(context, name); |
| 235 }); | 240 }); |
| 236 } | 241 } |
| 237 | 242 |
| 238 /** | 243 /** |
| 239 * Index the given fully resolved [unit]. | 244 * Index the given fully resolved [unit]. |
| 240 */ | 245 */ |
| 241 void indexUnit(CompilationUnit unit) { | 246 void indexUnit(CompilationUnit unit) { |
| 242 // Index the unit. | 247 // Index the unit. |
| 243 PackageIndexAssembler assembler = new PackageIndexAssembler(); | 248 PackageIndexAssembler assembler = new PackageIndexAssembler(); |
| 244 assembler.index(unit); | 249 assembler.index(unit); |
| 245 PackageIndexBuilder indexBuilder = assembler.assemble(); | 250 PackageIndexBuilder indexBuilder = assembler.assemble(); |
| 246 // Put the index into the map. | 251 // Put the index into the map. |
| 247 List<int> indexBytes = indexBuilder.toBuffer(); | 252 List<int> indexBytes = indexBuilder.toBuffer(); |
| 248 PackageIndex index = new PackageIndex.fromBuffer(indexBytes); | 253 PackageIndex index = new PackageIndex.fromBuffer(indexBytes); |
| 249 String key = _getUnitKeyForElement(unit.element); | 254 String key = _getUnitKeyForElement(unit.element); |
| 250 indexMap[key] = index; | 255 indexMap[key] = index; |
| 251 } | 256 } |
| 252 | 257 |
| 258 /** |
| 259 * Remove index information about the unit. |
| 260 */ |
| 261 void removeUnit(Source librarySource, Source unitSource) { |
| 262 String key = _getUnitKeyForSource(librarySource, unitSource); |
| 263 indexMap.remove(key); |
| 264 } |
| 265 |
| 253 String _getUnitKeyForElement(CompilationUnitElement unitElement) { | 266 String _getUnitKeyForElement(CompilationUnitElement unitElement) { |
| 254 Source librarySource = unitElement.library.source; | 267 Source librarySource = unitElement.library.source; |
| 255 Source unitSource = unitElement.source; | 268 Source unitSource = unitElement.source; |
| 256 return _getUnitKeyForSource(librarySource, unitSource); | 269 return _getUnitKeyForSource(librarySource, unitSource); |
| 257 } | 270 } |
| 258 | 271 |
| 259 String _getUnitKeyForSource(Source librarySource, Source unitSource) { | 272 String _getUnitKeyForSource(Source librarySource, Source unitSource) { |
| 260 String unitLibraryUri = librarySource.uri.toString(); | 273 String unitLibraryUri = librarySource.uri.toString(); |
| 261 String unitUnitUri = unitSource.uri.toString(); | 274 String unitUnitUri = unitSource.uri.toString(); |
| 262 return '$unitLibraryUri;$unitUnitUri'; | 275 return '$unitLibraryUri;$unitUnitUri'; |
| 263 } | 276 } |
| 264 | 277 |
| 265 Future<List<Location>> _mergeLocations( | 278 Future<List<Location>> _mergeLocations( |
| 266 List<Location> callback(PackageIndex index)) async { | 279 List<Location> callback(_PackageIndexRequester requester)) async { |
| 267 List<Location> locations = <Location>[]; | 280 List<Location> locations = <Location>[]; |
| 268 for (PackageIndex index in indexMap.values) { | 281 for (PackageIndex index in indexMap.values) { |
| 269 List<Location> indexLocations = callback(index); | 282 _PackageIndexRequester requester = new _PackageIndexRequester(index); |
| 283 List<Location> indexLocations = callback(requester); |
| 270 locations.addAll(indexLocations); | 284 locations.addAll(indexLocations); |
| 271 } | 285 } |
| 272 return locations; | 286 return locations; |
| 273 } | 287 } |
| 274 } | 288 } |
| 275 | 289 |
| 276 /** | 290 /** |
| 277 * Helper for requesting information from a single [PackageIndex]. | 291 * Helper for requesting information from a single [PackageIndex]. |
| 278 */ | 292 */ |
| 279 class _PackageIndexRequester { | 293 class _PackageIndexRequester { |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 i < unitIndex.usedNames.length && unitIndex.usedNames[i] == nameId; | 531 i < unitIndex.usedNames.length && unitIndex.usedNames[i] == nameId; |
| 518 i++) { | 532 i++) { |
| 519 unitLibraryUri ??= packageRequester.getUnitLibraryUri(unitIndex.unit); | 533 unitLibraryUri ??= packageRequester.getUnitLibraryUri(unitIndex.unit); |
| 520 unitUnitUri ??= packageRequester.getUnitUnitUri(unitIndex.unit); | 534 unitUnitUri ??= packageRequester.getUnitUnitUri(unitIndex.unit); |
| 521 locations.add(new Location(context, unitLibraryUri, unitUnitUri, | 535 locations.add(new Location(context, unitLibraryUri, unitUnitUri, |
| 522 unitIndex.usedNameOffsets[i], name.length, true)); | 536 unitIndex.usedNameOffsets[i], name.length, true)); |
| 523 } | 537 } |
| 524 return locations; | 538 return locations; |
| 525 } | 539 } |
| 526 } | 540 } |
| OLD | NEW |