Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: pkg/analysis_server/lib/src/analysis_server.dart

Issue 341893010: Use "pub list-package-dirs" to resolve package URIs in analysis server. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698