| 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 library analysis.server; | 5 library analysis.server; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analysis_server/src/analysis_logger.dart'; | 10 import 'package:analysis_server/src/analysis_logger.dart'; |
| 11 import 'package:analysis_server/src/channel.dart'; | 11 import 'package:analysis_server/src/channel.dart'; |
| 12 import 'package:analysis_server/src/constants.dart'; | 12 import 'package:analysis_server/src/constants.dart'; |
| 13 import 'package:analysis_server/src/context_directory_manager.dart'; | 13 import 'package:analysis_server/src/context_directory_manager.dart'; |
| 14 import 'package:analysis_server/src/domain_analysis.dart'; | 14 import 'package:analysis_server/src/domain_analysis.dart'; |
| 15 import 'package:analysis_server/src/operation/operation_analysis.dart'; | 15 import 'package:analysis_server/src/operation/operation_analysis.dart'; |
| 16 import 'package:analysis_server/src/operation/operation.dart'; | 16 import 'package:analysis_server/src/operation/operation.dart'; |
| 17 import 'package:analysis_server/src/operation/operation_queue.dart'; | 17 import 'package:analysis_server/src/operation/operation_queue.dart'; |
| 18 import 'package:analysis_server/src/package_map_provider.dart'; |
| 19 import 'package:analysis_server/src/package_uri_resolver.dart'; |
| 18 import 'package:analysis_server/src/protocol.dart'; | 20 import 'package:analysis_server/src/protocol.dart'; |
| 19 import 'package:analysis_server/src/resource.dart'; | 21 import 'package:analysis_server/src/resource.dart'; |
| 20 import 'package:analyzer/src/generated/ast.dart'; | 22 import 'package:analyzer/src/generated/ast.dart'; |
| 21 import 'package:analyzer/src/generated/engine.dart'; | 23 import 'package:analyzer/src/generated/engine.dart'; |
| 22 import 'package:analyzer/src/generated/error.dart'; | 24 import 'package:analyzer/src/generated/error.dart'; |
| 23 import 'package:analyzer/src/generated/source.dart'; | 25 import 'package:analyzer/src/generated/source.dart'; |
| 24 import 'package:analyzer/src/generated/sdk.dart'; | 26 import 'package:analyzer/src/generated/sdk.dart'; |
| 25 import 'package:analyzer/src/generated/sdk_io.dart'; | 27 import 'package:analyzer/src/generated/sdk_io.dart'; |
| 26 import 'package:analyzer/src/generated/source_io.dart'; | 28 import 'package:analyzer/src/generated/source_io.dart'; |
| 27 import 'package:analyzer/src/generated/java_engine.dart'; | 29 import 'package:analyzer/src/generated/java_engine.dart'; |
| 28 import 'package:analysis_server/src/package_uri_resolver.dart'; | |
| 29 | 30 |
| 30 | 31 |
| 31 /** | 32 /** |
| 32 * An instance of [DirectoryBasedDartSdk] that is shared between | 33 * An instance of [DirectoryBasedDartSdk] that is shared between |
| 33 * [AnalysisServer] instances to improve performance. | 34 * [AnalysisServer] instances to improve performance. |
| 34 */ | 35 */ |
| 35 final DirectoryBasedDartSdk SHARED_SDK = DirectoryBasedDartSdk.defaultSdk; | 36 final DirectoryBasedDartSdk SHARED_SDK = DirectoryBasedDartSdk.defaultSdk; |
| 36 | 37 |
| 37 class AnalysisServerContextDirectoryManager extends ContextDirectoryManager { | 38 class AnalysisServerContextDirectoryManager extends ContextDirectoryManager { |
| 38 final AnalysisServer analysisServer; | 39 final AnalysisServer analysisServer; |
| 39 | 40 |
| 40 /** | 41 /** |
| 41 * The default options used to create new analysis contexts. | 42 * The default options used to create new analysis contexts. |
| 42 */ | 43 */ |
| 43 AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl(); | 44 AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl(); |
| 44 | 45 |
| 45 AnalysisServerContextDirectoryManager(this.analysisServer, ResourceProvider re
sourceProvider) | 46 AnalysisServerContextDirectoryManager(this.analysisServer, ResourceProvider re
sourceProvider) |
| 46 : super(resourceProvider); | 47 : super(resourceProvider); |
| 47 | 48 |
| 48 @override | 49 @override |
| 49 void addContext(Folder folder, File pubspecFile) { | 50 void addContext(Folder folder, File pubspecFile) { |
| 51 Map<String, Folder> packageMap = |
| 52 analysisServer.packageMapProvider.computePackageMap(folder); |
| 50 ContextDirectory contextDirectory = new ContextDirectory( | 53 ContextDirectory contextDirectory = new ContextDirectory( |
| 51 analysisServer.defaultSdk, resourceProvider, folder, pubspecFile); | 54 analysisServer.defaultSdk, resourceProvider, folder, packageMap); |
| 52 analysisServer.folderMap[folder] = contextDirectory; | 55 analysisServer.folderMap[folder] = contextDirectory; |
| 53 AnalysisContext context = contextDirectory.context; | 56 AnalysisContext context = contextDirectory.context; |
| 54 context.analysisOptions = new AnalysisOptionsImpl.con1(defaultOptions); | 57 context.analysisOptions = new AnalysisOptionsImpl.con1(defaultOptions); |
| 55 analysisServer.schedulePerformAnalysisOperation(context); | 58 analysisServer.schedulePerformAnalysisOperation(context); |
| 56 } | 59 } |
| 57 | 60 |
| 58 @override | 61 @override |
| 59 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { | 62 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) { |
| 60 AnalysisContext context = analysisServer.folderMap[contextFolder].context; | 63 AnalysisContext context = analysisServer.folderMap[contextFolder].context; |
| 61 context.applyChanges(changeSet); | 64 context.applyChanges(changeSet); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 79 */ | 82 */ |
| 80 final ServerCommunicationChannel channel; | 83 final ServerCommunicationChannel channel; |
| 81 | 84 |
| 82 /** | 85 /** |
| 83 * [ContextDirectoryManager] which handles the mapping from analysis roots | 86 * [ContextDirectoryManager] which handles the mapping from analysis roots |
| 84 * to context directories. | 87 * to context directories. |
| 85 */ | 88 */ |
| 86 AnalysisServerContextDirectoryManager contextDirectoryManager; | 89 AnalysisServerContextDirectoryManager contextDirectoryManager; |
| 87 | 90 |
| 88 /** | 91 /** |
| 92 * Provider which is used to determine the mapping from package name to |
| 93 * package folder. |
| 94 */ |
| 95 final PackageMapProvider packageMapProvider; |
| 96 |
| 97 /** |
| 89 * A flag indicating whether the server is running. When false, contexts | 98 * A flag indicating whether the server is running. When false, contexts |
| 90 * will no longer be added to [contextWorkQueue], and [performOperation] will | 99 * will no longer be added to [contextWorkQueue], and [performOperation] will |
| 91 * discard any tasks it finds on [contextWorkQueue]. | 100 * discard any tasks it finds on [contextWorkQueue]. |
| 92 */ | 101 */ |
| 93 bool running; | 102 bool running; |
| 94 | 103 |
| 95 /** | 104 /** |
| 96 * A list of the request handlers used to handle the requests sent to this | 105 * A list of the request handlers used to handle the requests sent to this |
| 97 * server. | 106 * server. |
| 98 */ | 107 */ |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 /** | 148 /** |
| 140 * Initialize a newly created server to receive requests from and send | 149 * Initialize a newly created server to receive requests from and send |
| 141 * responses to the given [channel]. | 150 * responses to the given [channel]. |
| 142 * | 151 * |
| 143 * If [rethrowExceptions] is true, then any exceptions thrown by analysis are | 152 * If [rethrowExceptions] is true, then any exceptions thrown by analysis are |
| 144 * propagated up the call stack. The default is true to allow analysis | 153 * propagated up the call stack. The default is true to allow analysis |
| 145 * exceptions to show up in unit tests, but it should be set to false when | 154 * exceptions to show up in unit tests, but it should be set to false when |
| 146 * running a full analysis server. | 155 * running a full analysis server. |
| 147 */ | 156 */ |
| 148 AnalysisServer(this.channel, ResourceProvider resourceProvider, | 157 AnalysisServer(this.channel, ResourceProvider resourceProvider, |
| 149 {this.rethrowExceptions: true}) { | 158 this.packageMapProvider, {this.rethrowExceptions: true}) { |
| 150 operationQueue = new ServerOperationQueue(this); | 159 operationQueue = new ServerOperationQueue(this); |
| 151 contextDirectoryManager = new AnalysisServerContextDirectoryManager(this, re
sourceProvider); | 160 contextDirectoryManager = new AnalysisServerContextDirectoryManager(this, re
sourceProvider); |
| 152 AnalysisEngine.instance.logger = new AnalysisLogger(); | 161 AnalysisEngine.instance.logger = new AnalysisLogger(); |
| 153 running = true; | 162 running = true; |
| 154 Notification notification = new Notification(SERVER_CONNECTED); | 163 Notification notification = new Notification(SERVER_CONNECTED); |
| 155 channel.sendNotification(notification); | 164 channel.sendNotification(notification); |
| 156 channel.listen(handleRequest, onDone: done, onError: error); | 165 channel.listen(handleRequest, onDone: done, onError: error); |
| 157 } | 166 } |
| 158 | 167 |
| 159 /** | 168 /** |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 * The root [ResourceProvider] of this [ContextDirectory]. | 577 * The root [ResourceProvider] of this [ContextDirectory]. |
| 569 */ | 578 */ |
| 570 final ResourceProvider _resourceProvider; | 579 final ResourceProvider _resourceProvider; |
| 571 | 580 |
| 572 /** | 581 /** |
| 573 * The root [Folder] of this [ContextDirectory]. | 582 * The root [Folder] of this [ContextDirectory]. |
| 574 */ | 583 */ |
| 575 final Folder _folder; | 584 final Folder _folder; |
| 576 | 585 |
| 577 /** | 586 /** |
| 578 * The `pubspec.yaml` file in [_folder], or null if there isn't one. | |
| 579 */ | |
| 580 File _pubspecFile; | |
| 581 | |
| 582 /** | |
| 583 * The [AnalysisContext] of this [_folder]. | 587 * The [AnalysisContext] of this [_folder]. |
| 584 */ | 588 */ |
| 585 AnalysisContext _context; | 589 AnalysisContext _context; |
| 586 | 590 |
| 587 ContextDirectory(DartSdk sdk, this._resourceProvider, this._folder, | 591 ContextDirectory(DartSdk sdk, this._resourceProvider, this._folder, |
| 588 this._pubspecFile) { | 592 Map<String, Folder> packageMap) { |
| 589 // create AnalysisContext | 593 // create AnalysisContext |
| 590 _context = AnalysisEngine.instance.createAnalysisContext(); | 594 _context = AnalysisEngine.instance.createAnalysisContext(); |
| 591 // TODO(scheglov) replace FileUriResolver with an Resource based resolver | 595 // TODO(scheglov) replace FileUriResolver with an Resource based resolver |
| 592 List<UriResolver> resolvers = <UriResolver>[new DartUriResolver(sdk), | 596 List<UriResolver> resolvers = <UriResolver>[new DartUriResolver(sdk), |
| 593 new FileUriResolver(), | 597 new FileUriResolver(), |
| 594 ]; | 598 ]; |
| 595 { | 599 if (packageMap != null) { |
| 596 UriResolver packageResolver = _createPackageUriResolver(); | 600 resolvers.add(new PackageMapUriResolver(_resourceProvider, packageMap)); |
| 597 if (packageResolver != null) { | |
| 598 resolvers.add(packageResolver); | |
| 599 } | |
| 600 } | 601 } |
| 601 _context.sourceFactory = new SourceFactory(resolvers); | 602 _context.sourceFactory = new SourceFactory(resolvers); |
| 602 } | 603 } |
| 603 | 604 |
| 604 /** | 605 /** |
| 605 * Return the [AnalysisContext] of this folder. | 606 * Return the [AnalysisContext] of this folder. |
| 606 */ | 607 */ |
| 607 AnalysisContext get context => _context; | 608 AnalysisContext get context => _context; |
| 608 | |
| 609 /** | |
| 610 * Returns an [UriResolver] for `package` URIs, or `null` if not a Pub | |
| 611 * application. | |
| 612 */ | |
| 613 UriResolver _createPackageUriResolver() { | |
| 614 // prepare 'packages' folder | |
| 615 Resource packagesResource = _folder.getChild('packages'); | |
| 616 if (packagesResource is! Folder) { | |
| 617 return null; | |
| 618 } | |
| 619 Folder packagesFolder = packagesResource; | |
| 620 // list packages | |
| 621 Map<String, Folder> packageMap = <String, Folder>{}; | |
| 622 List<Resource> children = packagesFolder.getChildren(); | |
| 623 for (Resource child in children) { | |
| 624 if (child is Folder) { | |
| 625 packageMap[child.shortName] = child; | |
| 626 } | |
| 627 } | |
| 628 // done | |
| 629 return new PackageMapUriResolver(_resourceProvider, packageMap); | |
| 630 } | |
| 631 } | 609 } |
| 632 | 610 |
| 633 typedef void OptionUpdater(AnalysisOptionsImpl options); | 611 typedef void OptionUpdater(AnalysisOptionsImpl options); |
| 634 | 612 |
| 635 /** | 613 /** |
| 636 * An enumeration of the services provided by the server domain. | 614 * An enumeration of the services provided by the server domain. |
| 637 */ | 615 */ |
| 638 class ServerService extends Enum2<ServerService> { | 616 class ServerService extends Enum2<ServerService> { |
| 639 static const ServerService STATUS = const ServerService('STATUS', 0); | 617 static const ServerService STATUS = const ServerService('STATUS', 0); |
| 640 | 618 |
| 641 static const List<ServerService> VALUES = const [STATUS]; | 619 static const List<ServerService> VALUES = const [STATUS]; |
| 642 | 620 |
| 643 const ServerService(String name, int ordinal) : super(name, ordinal); | 621 const ServerService(String name, int ordinal) : super(name, ordinal); |
| 644 } | 622 } |
| OLD | NEW |