OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 import 'dart:collection'; | 6 import 'dart:collection'; |
7 import 'dart:core'; | 7 import 'dart:core'; |
8 import 'dart:io' as io; | 8 import 'dart:io' as io; |
9 import 'dart:math' show max; | 9 import 'dart:math' show max; |
10 | 10 |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 */ | 313 */ |
314 Set<String> prevAnalyzedFiles; | 314 Set<String> prevAnalyzedFiles; |
315 | 315 |
316 /** | 316 /** |
317 * The default options used to create new analysis contexts. This object is | 317 * The default options used to create new analysis contexts. This object is |
318 * also referenced by the ContextManager. | 318 * also referenced by the ContextManager. |
319 */ | 319 */ |
320 final AnalysisOptionsImpl defaultContextOptions = new AnalysisOptionsImpl(); | 320 final AnalysisOptionsImpl defaultContextOptions = new AnalysisOptionsImpl(); |
321 | 321 |
322 /** | 322 /** |
323 * The controller for sending [ContextsChangedEvent]s. | |
324 */ | |
325 StreamController<ContextsChangedEvent> _onContextsChangedController = | |
326 new StreamController<ContextsChangedEvent>.broadcast(); | |
327 | |
328 /** | |
329 * The file resolver provider used to override the way file URI's are | 323 * The file resolver provider used to override the way file URI's are |
330 * resolved in some contexts. | 324 * resolved in some contexts. |
331 */ | 325 */ |
332 ResolverProvider fileResolverProvider; | 326 ResolverProvider fileResolverProvider; |
333 | 327 |
334 /** | 328 /** |
335 * The package resolver provider used to override the way package URI's are | 329 * The package resolver provider used to override the way package URI's are |
336 * resolved in some contexts. | 330 * resolved in some contexts. |
337 */ | 331 */ |
338 ResolverProvider packageResolverProvider; | 332 ResolverProvider packageResolverProvider; |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 searchEngine = new SearchEngineImpl(driverMap.values); | 471 searchEngine = new SearchEngineImpl(driverMap.values); |
478 Notification notification = new ServerConnectedParams(VERSION, io.pid, | 472 Notification notification = new ServerConnectedParams(VERSION, io.pid, |
479 sessionId: instrumentationService.sessionId) | 473 sessionId: instrumentationService.sessionId) |
480 .toNotification(); | 474 .toNotification(); |
481 channel.sendNotification(notification); | 475 channel.sendNotification(notification); |
482 channel.listen(handleRequest, onDone: done, onError: error); | 476 channel.listen(handleRequest, onDone: done, onError: error); |
483 handlers = serverPlugin.createDomains(this); | 477 handlers = serverPlugin.createDomains(this); |
484 } | 478 } |
485 | 479 |
486 /** | 480 /** |
487 * Return the [AnalysisContext]s that are being used to analyze the analysis | |
488 * roots. | |
489 */ | |
490 Iterable<AnalysisContext> get analysisContexts => | |
491 contextManager.analysisContexts; | |
492 | |
493 /** | |
494 * Return a list of the globs used to determine which files should be analyzed
. | 481 * Return a list of the globs used to determine which files should be analyzed
. |
495 */ | 482 */ |
496 List<Glob> get analyzedFilesGlobs { | 483 List<Glob> get analyzedFilesGlobs { |
497 if (_analyzedFilesGlobs == null) { | 484 if (_analyzedFilesGlobs == null) { |
498 _analyzedFilesGlobs = <Glob>[]; | 485 _analyzedFilesGlobs = <Glob>[]; |
499 List<String> patterns = serverPlugin.analyzedFilePatterns; | 486 List<String> patterns = serverPlugin.analyzedFilePatterns; |
500 for (String pattern in patterns) { | 487 for (String pattern in patterns) { |
501 try { | 488 try { |
502 _analyzedFilesGlobs | 489 _analyzedFilesGlobs |
503 .add(new Glob(resourceProvider.pathContext.separator, pattern)); | 490 .add(new Glob(resourceProvider.pathContext.separator, pattern)); |
504 } catch (exception, stackTrace) { | 491 } catch (exception, stackTrace) { |
505 AnalysisEngine.instance.logger.logError( | 492 AnalysisEngine.instance.logger.logError( |
506 'Invalid glob pattern: "$pattern"', | 493 'Invalid glob pattern: "$pattern"', |
507 new CaughtException(exception, stackTrace)); | 494 new CaughtException(exception, stackTrace)); |
508 } | 495 } |
509 } | 496 } |
510 } | 497 } |
511 return _analyzedFilesGlobs; | 498 return _analyzedFilesGlobs; |
512 } | 499 } |
513 | 500 |
514 /** | 501 /** |
515 * A table mapping [Folder]s to the [AnalysisDriver]s associated with them. | 502 * A table mapping [Folder]s to the [AnalysisDriver]s associated with them. |
516 */ | 503 */ |
517 Map<Folder, nd.AnalysisDriver> get driverMap => contextManager.driverMap; | 504 Map<Folder, nd.AnalysisDriver> get driverMap => contextManager.driverMap; |
518 | 505 |
519 /** | 506 /** |
520 * Return a table mapping [Folder]s to the [AnalysisContext]s associated with | |
521 * them. | |
522 */ | |
523 Map<Folder, AnalysisContext> get folderMap => contextManager.folderMap; | |
524 | |
525 /** | |
526 * The [Future] that completes when analysis is complete. | 507 * The [Future] that completes when analysis is complete. |
527 */ | 508 */ |
528 Future get onAnalysisComplete { | 509 Future get onAnalysisComplete { |
529 if (isAnalysisComplete()) { | 510 if (isAnalysisComplete()) { |
530 return new Future.value(); | 511 return new Future.value(); |
531 } | 512 } |
532 if (_onAnalysisCompleteCompleter == null) { | 513 if (_onAnalysisCompleteCompleter == null) { |
533 _onAnalysisCompleteCompleter = new Completer(); | 514 _onAnalysisCompleteCompleter = new Completer(); |
534 } | 515 } |
535 return _onAnalysisCompleteCompleter.future; | 516 return _onAnalysisCompleteCompleter.future; |
536 } | 517 } |
537 | 518 |
538 /** | 519 /** |
539 * The stream that is notified with `true` when analysis is started. | 520 * The stream that is notified with `true` when analysis is started. |
540 */ | 521 */ |
541 Stream<bool> get onAnalysisStarted { | 522 Stream<bool> get onAnalysisStarted { |
542 return _onAnalysisStartedController.stream; | 523 return _onAnalysisStartedController.stream; |
543 } | 524 } |
544 | 525 |
545 /** | 526 /** |
546 * The stream that is notified when contexts are added or removed. | |
547 */ | |
548 Stream<ContextsChangedEvent> get onContextsChanged => | |
549 _onContextsChangedController.stream; | |
550 | |
551 /** | |
552 * The stream that is notified when a single file has been added. This exists | 527 * The stream that is notified when a single file has been added. This exists |
553 * as a temporary stopgap for plugins, until the official plugin API is | 528 * as a temporary stopgap for plugins, until the official plugin API is |
554 * complete. | 529 * complete. |
555 */ | 530 */ |
556 Stream get onFileAdded => _onFileAddedController.stream; | 531 Stream get onFileAdded => _onFileAddedController.stream; |
557 | 532 |
558 /** | 533 /** |
559 * The stream that is notified when a single file has been analyzed. | 534 * The stream that is notified when a single file has been analyzed. |
560 */ | 535 */ |
561 Stream get onFileAnalyzed => _onFileAnalyzedController.stream; | 536 Stream get onFileAnalyzed => _onFileAnalyzedController.stream; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 | 655 |
681 /** | 656 /** |
682 * Return the [AstProvider] for the given [path]. | 657 * Return the [AstProvider] for the given [path]. |
683 */ | 658 */ |
684 AstProvider getAstProvider(String path) { | 659 AstProvider getAstProvider(String path) { |
685 nd.AnalysisDriver analysisDriver = getAnalysisDriver(path); | 660 nd.AnalysisDriver analysisDriver = getAnalysisDriver(path); |
686 return new AstProviderForDriver(analysisDriver); | 661 return new AstProviderForDriver(analysisDriver); |
687 } | 662 } |
688 | 663 |
689 /** | 664 /** |
690 * Return the [AnalysisContext] for the "innermost" context whose associated | |
691 * folder is or contains the given path. ("innermost" refers to the nesting | |
692 * of contexts, so if there is a context for path /foo and a context for | |
693 * path /foo/bar, then the innermost context containing /foo/bar/baz.dart is | |
694 * the context for /foo/bar.) | |
695 * | |
696 * If no context contains the given path, `null` is returned. | |
697 */ | |
698 AnalysisContext getContainingContext(String path) { | |
699 return contextManager.getContextFor(path); | |
700 } | |
701 | |
702 /** | |
703 * Return the [nd.AnalysisDriver] for the "innermost" context whose associated | 665 * Return the [nd.AnalysisDriver] for the "innermost" context whose associated |
704 * folder is or contains the given path. ("innermost" refers to the nesting | 666 * folder is or contains the given path. ("innermost" refers to the nesting |
705 * of contexts, so if there is a context for path /foo and a context for | 667 * of contexts, so if there is a context for path /foo and a context for |
706 * path /foo/bar, then the innermost context containing /foo/bar/baz.dart is | 668 * path /foo/bar, then the innermost context containing /foo/bar/baz.dart is |
707 * the context for /foo/bar.) | 669 * the context for /foo/bar.) |
708 * | 670 * |
709 * If no context contains the given path, `null` is returned. | 671 * If no context contains the given path, `null` is returned. |
710 */ | 672 */ |
711 nd.AnalysisDriver getContainingDriver(String path) { | 673 nd.AnalysisDriver getContainingDriver(String path) { |
712 return contextManager.getDriverFor(path); | 674 return contextManager.getDriverFor(path); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 /** | 725 /** |
764 * Return a [Future] that completes with the resolved [CompilationUnit] for | 726 * Return a [Future] that completes with the resolved [CompilationUnit] for |
765 * the Dart file with the given [path], or with `null` if the file is not a | 727 * the Dart file with the given [path], or with `null` if the file is not a |
766 * Dart file or cannot be resolved. | 728 * Dart file or cannot be resolved. |
767 */ | 729 */ |
768 Future<CompilationUnit> getResolvedCompilationUnit(String path) async { | 730 Future<CompilationUnit> getResolvedCompilationUnit(String path) async { |
769 nd.AnalysisResult result = await getAnalysisResult(path); | 731 nd.AnalysisResult result = await getAnalysisResult(path); |
770 return result?.unit; | 732 return result?.unit; |
771 } | 733 } |
772 | 734 |
773 // TODO(brianwilkerson) Add the following method after 'prioritySources' has | |
774 // been added to InternalAnalysisContext. | |
775 // /** | |
776 // * Return a list containing the full names of all of the sources that are | |
777 // * priority sources. | |
778 // */ | |
779 // List<String> getPriorityFiles() { | |
780 // List<String> priorityFiles = new List<String>(); | |
781 // folderMap.values.forEach((ContextDirectory directory) { | |
782 // InternalAnalysisContext context = directory.context; | |
783 // context.prioritySources.forEach((Source source) { | |
784 // priorityFiles.add(source.fullName); | |
785 // }); | |
786 // }); | |
787 // return priorityFiles; | |
788 // } | |
789 | |
790 /** | 735 /** |
791 * Handle a [request] that was read from the communication channel. | 736 * Handle a [request] that was read from the communication channel. |
792 */ | 737 */ |
793 void handleRequest(Request request) { | 738 void handleRequest(Request request) { |
794 _performance.logRequest(request); | 739 _performance.logRequest(request); |
795 runZoned(() { | 740 runZoned(() { |
796 ServerPerformanceStatistics.serverRequests.makeCurrentWhile(() { | 741 ServerPerformanceStatistics.serverRequests.makeCurrentWhile(() { |
797 int count = handlers.length; | 742 int count = handlers.length; |
798 for (int i = 0; i < count; i++) { | 743 for (int i = 0; i < count; i++) { |
799 try { | 744 try { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
917 | 862 |
918 /** | 863 /** |
919 * Trigger reanalysis of all files in the given list of analysis [roots], or | 864 * Trigger reanalysis of all files in the given list of analysis [roots], or |
920 * everything if the analysis roots is `null`. | 865 * everything if the analysis roots is `null`. |
921 */ | 866 */ |
922 void reanalyze(List<Resource> roots) { | 867 void reanalyze(List<Resource> roots) { |
923 // Clear any operations that are pending. | 868 // Clear any operations that are pending. |
924 if (roots == null) { | 869 if (roots == null) { |
925 operationQueue.clear(); | 870 operationQueue.clear(); |
926 } else { | 871 } else { |
927 for (AnalysisContext context in _getContexts(roots)) { | 872 // TODO(brianwilkerson) All of the contexts returned by _getContexts will |
928 operationQueue.contextRemoved(context); | 873 // be null. If we are still using the operation queue, then this needs to |
929 } | 874 // be changed to use drivers. |
| 875 // for (AnalysisContext context in _getContexts(roots)) { |
| 876 // operationQueue.contextRemoved(context); |
| 877 // } |
930 } | 878 } |
931 // Instruct the contextDirectoryManager to rebuild all contexts from | 879 // Instruct the contextDirectoryManager to rebuild all contexts from |
932 // scratch. | 880 // scratch. |
933 contextManager.refresh(roots); | 881 contextManager.refresh(roots); |
934 } | 882 } |
935 | 883 |
936 /** | 884 /** |
937 * Schedule cache consistency validation in [context]. | 885 * Schedule cache consistency validation in [context]. |
938 * The most of the validation must be done asynchronously. | 886 * The most of the validation must be done asynchronously. |
939 */ | 887 */ |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1307 if (resourceProvider is PhysicalResourceProvider) { | 1255 if (resourceProvider is PhysicalResourceProvider) { |
1308 Folder stateLocation = | 1256 Folder stateLocation = |
1309 resourceProvider.getStateLocation('.analysis-driver'); | 1257 resourceProvider.getStateLocation('.analysis-driver'); |
1310 if (stateLocation != null) { | 1258 if (stateLocation != null) { |
1311 return stateLocation.path; | 1259 return stateLocation.path; |
1312 } | 1260 } |
1313 } | 1261 } |
1314 return null; | 1262 return null; |
1315 } | 1263 } |
1316 | 1264 |
1317 /** | |
1318 * Return a set of all contexts whose associated folder is contained within, | |
1319 * or equal to, one of the resources in the given list of [resources]. | |
1320 */ | |
1321 Set<AnalysisContext> _getContexts(List<Resource> resources) { | |
1322 Set<AnalysisContext> contexts = new HashSet<AnalysisContext>(); | |
1323 resources.forEach((Resource resource) { | |
1324 if (resource is Folder) { | |
1325 contexts.addAll(contextManager.contextsInAnalysisRoot(resource)); | |
1326 } | |
1327 }); | |
1328 return contexts; | |
1329 } | |
1330 | |
1331 bool _hasAnalysisServiceSubscription(AnalysisService service, String file) { | 1265 bool _hasAnalysisServiceSubscription(AnalysisService service, String file) { |
1332 return analysisServices[service]?.contains(file) ?? false; | 1266 return analysisServices[service]?.contains(file) ?? false; |
1333 } | 1267 } |
1334 | 1268 |
1335 _scheduleAnalysisImplementedNotification() async { | 1269 _scheduleAnalysisImplementedNotification() async { |
1336 Set<String> files = analysisServices[AnalysisService.IMPLEMENTED]; | 1270 Set<String> files = analysisServices[AnalysisService.IMPLEMENTED]; |
1337 if (files != null) { | 1271 if (files != null) { |
1338 scheduleImplementedNotification(this, files); | 1272 scheduleImplementedNotification(this, files); |
1339 } | 1273 } |
1340 } | 1274 } |
(...skipping 30 matching lines...) Expand all Loading... |
1371 * Listen for context events and invalidate index. | 1305 * Listen for context events and invalidate index. |
1372 * | 1306 * |
1373 * It is possible that this method will do more in the future, e.g. listening | 1307 * It is possible that this method will do more in the future, e.g. listening |
1374 * for summary information and linking pre-indexed packages into the index, | 1308 * for summary information and linking pre-indexed packages into the index, |
1375 * but for now we only invalidate project specific index information. | 1309 * but for now we only invalidate project specific index information. |
1376 */ | 1310 */ |
1377 void _setupIndexInvalidation() { | 1311 void _setupIndexInvalidation() { |
1378 if (index == null) { | 1312 if (index == null) { |
1379 return; | 1313 return; |
1380 } | 1314 } |
1381 onContextsChanged.listen((ContextsChangedEvent event) { | 1315 // TODO(brianwilkerson) onContextsChanged never has anything written to it. |
1382 // TODO(brianwilkerson) `onContextsChanged` should never have anything | 1316 // Figure out whether we need something like this under the new analysis |
1383 // written to it. Figure out whether we need something like this under the | 1317 // driver, and remove this method if not. |
1384 // new analysis driver, and remove this method if not. | 1318 // onContextsChanged.listen((ContextsChangedEvent event) { |
1385 // for (AnalysisContext context in event.added) { | 1319 // for (AnalysisContext context in event.added) { |
1386 // context | 1320 // context |
1387 // .onResultChanged(RESOLVED_UNIT3) | 1321 // .onResultChanged(RESOLVED_UNIT3) |
1388 // .listen((ResultChangedEvent event) { | 1322 // .listen((ResultChangedEvent event) { |
1389 // if (event.wasComputed) { | 1323 // if (event.wasComputed) { |
1390 // Object value = event.value; | 1324 // Object value = event.value; |
1391 // if (value is CompilationUnit) { | 1325 // if (value is CompilationUnit) { |
1392 // index.indexDeclarations(value); | 1326 // index.indexDeclarations(value); |
1393 // } | 1327 // } |
1394 // } | 1328 // } |
1395 // }); | 1329 // }); |
1396 // context | 1330 // context |
1397 // .onResultChanged(RESOLVED_UNIT) | 1331 // .onResultChanged(RESOLVED_UNIT) |
1398 // .listen((ResultChangedEvent event) { | 1332 // .listen((ResultChangedEvent event) { |
1399 // if (event.wasInvalidated) { | 1333 // if (event.wasInvalidated) { |
1400 // LibrarySpecificUnit target = event.target; | 1334 // LibrarySpecificUnit target = event.target; |
1401 // index.removeUnit(event.context, target.library, target.unit); | 1335 // index.removeUnit(event.context, target.library, target.unit); |
1402 // } | 1336 // } |
1403 // }); | 1337 // }); |
1404 // } | 1338 // } |
1405 // for (AnalysisContext context in event.removed) { | 1339 // for (AnalysisContext context in event.removed) { |
1406 // index.removeContext(context); | 1340 // index.removeContext(context); |
1407 // } | 1341 // } |
1408 }); | 1342 // }); |
1409 } | 1343 } |
1410 } | 1344 } |
1411 | 1345 |
1412 class AnalysisServerOptions { | 1346 class AnalysisServerOptions { |
1413 bool enableIncrementalResolutionApi = false; | 1347 bool enableIncrementalResolutionApi = false; |
1414 bool enableIncrementalResolutionValidation = false; | 1348 bool enableIncrementalResolutionValidation = false; |
1415 bool useAnalysisHighlight2 = false; | 1349 bool useAnalysisHighlight2 = false; |
1416 String fileReadMode = 'as-is'; | 1350 String fileReadMode = 'as-is'; |
1417 String newAnalysisDriverLog; | 1351 String newAnalysisDriverLog; |
1418 | 1352 |
1419 String clientId; | 1353 String clientId; |
1420 String clientVersion; | 1354 String clientVersion; |
1421 | 1355 |
1422 // IDE options | 1356 // IDE options |
1423 bool enableVerboseFlutterCompletions = false; | 1357 bool enableVerboseFlutterCompletions = false; |
1424 } | 1358 } |
1425 | 1359 |
1426 /** | 1360 /** |
1427 * Information about a file - an [AnalysisContext] that analyses the file, | |
1428 * and the [Source] representing the file in this context. | |
1429 */ | |
1430 class ContextSourcePair { | |
1431 /** | |
1432 * A context that analysis the file. | |
1433 * May be `null` if the file is not analyzed by any context. | |
1434 */ | |
1435 final AnalysisContext context; | |
1436 | |
1437 /** | |
1438 * The source that corresponds to the file. | |
1439 * May be `null` if the file is not a regular file. | |
1440 * If the file cannot be found in the [context], then it has a `file` uri. | |
1441 */ | |
1442 final Source source; | |
1443 | |
1444 ContextSourcePair(this.context, this.source); | |
1445 } | |
1446 | |
1447 /** | |
1448 * A [PriorityChangeEvent] indicates the set the priority files has changed. | 1361 * A [PriorityChangeEvent] indicates the set the priority files has changed. |
1449 */ | 1362 */ |
1450 class PriorityChangeEvent { | 1363 class PriorityChangeEvent { |
1451 final Source firstSource; | 1364 final Source firstSource; |
1452 | 1365 |
1453 PriorityChangeEvent(this.firstSource); | 1366 PriorityChangeEvent(this.firstSource); |
1454 } | 1367 } |
1455 | 1368 |
1456 class ServerContextManagerCallbacks extends ContextManagerCallbacks { | 1369 class ServerContextManagerCallbacks extends ContextManagerCallbacks { |
1457 final AnalysisServer analysisServer; | 1370 final AnalysisServer analysisServer; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1569 if (result.contextKey != null) { | 1482 if (result.contextKey != null) { |
1570 message += ' context: ${result.contextKey}'; | 1483 message += ' context: ${result.contextKey}'; |
1571 } | 1484 } |
1572 AnalysisEngine.instance.logger.logError(message, result.exception); | 1485 AnalysisEngine.instance.logger.logError(message, result.exception); |
1573 }); | 1486 }); |
1574 analysisServer.driverMap[folder] = analysisDriver; | 1487 analysisServer.driverMap[folder] = analysisDriver; |
1575 return analysisDriver; | 1488 return analysisDriver; |
1576 } | 1489 } |
1577 | 1490 |
1578 @override | 1491 @override |
1579 AnalysisContext addContext(Folder folder, AnalysisOptions options) { | |
1580 ContextBuilder builder = createContextBuilder(folder, options); | |
1581 AnalysisContext context = builder.buildContext(folder.path); | |
1582 | |
1583 analysisServer.folderMap[folder] = context; | |
1584 analysisServer._onContextsChangedController | |
1585 .add(new ContextsChangedEvent(added: [context])); | |
1586 analysisServer.schedulePerformAnalysisOperation(context); | |
1587 | |
1588 return context; | |
1589 } | |
1590 | |
1591 @override | |
1592 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { | 1492 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { |
1593 nd.AnalysisDriver analysisDriver = analysisServer.driverMap[contextFolder]; | 1493 nd.AnalysisDriver analysisDriver = analysisServer.driverMap[contextFolder]; |
1594 if (analysisDriver != null) { | 1494 if (analysisDriver != null) { |
1595 changeSet.addedSources.forEach((source) { | 1495 changeSet.addedSources.forEach((source) { |
1596 analysisDriver.addFile(source.fullName); | 1496 analysisDriver.addFile(source.fullName); |
1597 // temporary plugin support: | 1497 // temporary plugin support: |
1598 analysisServer._onFileAddedController.add(source.fullName); | 1498 analysisServer._onFileAddedController.add(source.fullName); |
1599 }); | 1499 }); |
1600 changeSet.changedSources.forEach((source) { | 1500 changeSet.changedSources.forEach((source) { |
1601 analysisDriver.changeFile(source.fullName); | 1501 analysisDriver.changeFile(source.fullName); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1663 // Context managers manage folders and contexts themselves. | 1563 // Context managers manage folders and contexts themselves. |
1664 } | 1564 } |
1665 | 1565 |
1666 @override | 1566 @override |
1667 void removeContext(Folder folder, List<String> flushedFiles) { | 1567 void removeContext(Folder folder, List<String> flushedFiles) { |
1668 sendAnalysisNotificationFlushResults(analysisServer, flushedFiles); | 1568 sendAnalysisNotificationFlushResults(analysisServer, flushedFiles); |
1669 nd.AnalysisDriver driver = analysisServer.driverMap.remove(folder); | 1569 nd.AnalysisDriver driver = analysisServer.driverMap.remove(folder); |
1670 driver.dispose(); | 1570 driver.dispose(); |
1671 } | 1571 } |
1672 | 1572 |
1673 @override | |
1674 void updateContextPackageUriResolver(AnalysisContext context) { | |
1675 analysisServer._onContextsChangedController | |
1676 .add(new ContextsChangedEvent(changed: [context])); | |
1677 analysisServer.schedulePerformAnalysisOperation(context); | |
1678 } | |
1679 | |
1680 List<HighlightRegion> _computeHighlightRegions(CompilationUnit unit) { | 1573 List<HighlightRegion> _computeHighlightRegions(CompilationUnit unit) { |
1681 if (analysisServer.options.useAnalysisHighlight2) { | 1574 if (analysisServer.options.useAnalysisHighlight2) { |
1682 return new DartUnitHighlightsComputer2(unit).compute(); | 1575 return new DartUnitHighlightsComputer2(unit).compute(); |
1683 } else { | 1576 } else { |
1684 return new DartUnitHighlightsComputer(unit).compute(); | 1577 return new DartUnitHighlightsComputer(unit).compute(); |
1685 } | 1578 } |
1686 } | 1579 } |
1687 | 1580 |
1688 String _computeLibraryName(CompilationUnit unit) { | 1581 String _computeLibraryName(CompilationUnit unit) { |
1689 for (Directive directive in unit.directives) { | 1582 for (Directive directive in unit.directives) { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1870 /** | 1763 /** |
1871 * The [PerformanceTag] for time spent in server request handlers. | 1764 * The [PerformanceTag] for time spent in server request handlers. |
1872 */ | 1765 */ |
1873 static PerformanceTag serverRequests = server.createChild('requests'); | 1766 static PerformanceTag serverRequests = server.createChild('requests'); |
1874 | 1767 |
1875 /** | 1768 /** |
1876 * The [PerformanceTag] for time spent in split store microtasks. | 1769 * The [PerformanceTag] for time spent in split store microtasks. |
1877 */ | 1770 */ |
1878 static PerformanceTag splitStore = new PerformanceTag('splitStore'); | 1771 static PerformanceTag splitStore = new PerformanceTag('splitStore'); |
1879 } | 1772 } |
OLD | NEW |