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

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

Issue 1089453002: Avoid redundant calls to "pub list" when multiple dependencies change. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add missing source file. Created 5 years, 8 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 context.directory.manager; 5 library context.directory.manager;
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_server.dart'; 10 import 'package:analysis_server/src/analysis_server.dart';
11 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.d art';
11 import 'package:analyzer/file_system/file_system.dart'; 12 import 'package:analyzer/file_system/file_system.dart';
12 import 'package:analyzer/instrumentation/instrumentation.dart'; 13 import 'package:analyzer/instrumentation/instrumentation.dart';
13 import 'package:analyzer/source/package_map_provider.dart';
14 import 'package:analyzer/source/package_map_resolver.dart'; 14 import 'package:analyzer/source/package_map_resolver.dart';
15 import 'package:analyzer/src/generated/engine.dart'; 15 import 'package:analyzer/src/generated/engine.dart';
16 import 'package:analyzer/src/generated/java_io.dart'; 16 import 'package:analyzer/src/generated/java_io.dart';
17 import 'package:analyzer/src/generated/source.dart'; 17 import 'package:analyzer/src/generated/source.dart';
18 import 'package:analyzer/src/generated/source_io.dart'; 18 import 'package:analyzer/src/generated/source_io.dart';
19 import 'package:path/path.dart' as pathos; 19 import 'package:path/path.dart' as pathos;
20 import 'package:watcher/watcher.dart'; 20 import 'package:watcher/watcher.dart';
21 21
22 /** 22 /**
23 * The name of `packages` folders. 23 * The name of `packages` folders.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 /** 75 /**
76 * Same as [packageRoots], except that source folders have been normalized 76 * Same as [packageRoots], except that source folders have been normalized
77 * and non-folders have been removed. 77 * and non-folders have been removed.
78 */ 78 */
79 Map<String, String> normalizedPackageRoots = <String, String>{}; 79 Map<String, String> normalizedPackageRoots = <String, String>{};
80 80
81 /** 81 /**
82 * Provider which is used to determine the mapping from package name to 82 * Provider which is used to determine the mapping from package name to
83 * package folder. 83 * package folder.
84 */ 84 */
85 final PackageMapProvider _packageMapProvider; 85 final OptimizingPubPackageMapProvider _packageMapProvider;
86 86
87 /** 87 /**
88 * The instrumentation service used to report instrumentation data. 88 * The instrumentation service used to report instrumentation data.
89 */ 89 */
90 final InstrumentationService _instrumentationService; 90 final InstrumentationService _instrumentationService;
91 91
92 ContextManager(this.resourceProvider, this._packageMapProvider, 92 ContextManager(this.resourceProvider, this._packageMapProvider,
93 this._instrumentationService) { 93 this._instrumentationService) {
94 pathContext = resourceProvider.pathContext; 94 pathContext = resourceProvider.pathContext;
95 } 95 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 if (context != contextN) { 130 if (context != contextN) {
131 for (Source source in contextN.sources) { 131 for (Source source in contextN.sources) {
132 flushedFiles.remove(source.fullName); 132 flushedFiles.remove(source.fullName);
133 } 133 }
134 } 134 }
135 } 135 }
136 return flushedFiles.toList(growable: false); 136 return flushedFiles.toList(growable: false);
137 } 137 }
138 138
139 /** 139 /**
140 * Return a list containing all of the contexts contained in the given
141 * [analysisRoot].
142 */
143 List<AnalysisContext> contextsInAnalysisRoot(Folder analysisRoot) {
144 List<AnalysisContext> contexts = <AnalysisContext>[];
145 _contexts.forEach((Folder contextFolder, _ContextInfo info) {
146 if (analysisRoot.isOrContains(contextFolder.path)) {
147 contexts.add(info.context);
148 }
149 });
150 return contexts;
151 }
152
153 /**
140 * We have finished computing the package map. 154 * We have finished computing the package map.
141 */ 155 */
142 void endComputePackageMap() { 156 void endComputePackageMap() {
143 // Do nothing. 157 // Do nothing.
144 } 158 }
145 159
146 /** 160 /**
147 * Returns `true` if the given absolute [path] is in one of the current 161 * Returns `true` if the given absolute [path] is in one of the current
148 * root folders and is not excluded. 162 * root folders and is not excluded.
149 */ 163 */
150 bool isInAnalysisRoot(String path) { 164 bool isInAnalysisRoot(String path) {
151 // check if excluded 165 // check if excluded
152 if (_isExcluded(path)) { 166 if (_isExcluded(path)) {
153 return false; 167 return false;
154 } 168 }
155 // check if in of the roots 169 // check if in of the roots
156 for (Folder root in _contexts.keys) { 170 for (Folder root in _contexts.keys) {
157 if (root.contains(path)) { 171 if (root.contains(path)) {
158 return true; 172 return true;
159 } 173 }
160 } 174 }
161 // no 175 // no
162 return false; 176 return false;
163 } 177 }
164 178
165 /** 179 /**
166 * Return a list containing all of the contexts contained in the given
167 * [analysisRoot].
168 */
169 List<AnalysisContext> contextsInAnalysisRoot(Folder analysisRoot) {
170 List<AnalysisContext> contexts = <AnalysisContext>[];
171 _contexts.forEach((Folder contextFolder, _ContextInfo info) {
172 if (analysisRoot.isOrContains(contextFolder.path)) {
173 contexts.add(info.context);
174 }
175 });
176 return contexts;
177 }
178
179 /**
180 * Rebuild the set of contexts from scratch based on the data last sent to 180 * Rebuild the set of contexts from scratch based on the data last sent to
181 * setRoots(). Only contexts contained in the given list of analysis [roots] 181 * setRoots(). Only contexts contained in the given list of analysis [roots]
182 * will be rebuilt, unless the list is `null`, in which case every context 182 * will be rebuilt, unless the list is `null`, in which case every context
183 * will be rebuilt. 183 * will be rebuilt.
184 */ 184 */
185 void refresh(List<Resource> roots) { 185 void refresh(List<Resource> roots) {
186 // Destroy old contexts 186 // Destroy old contexts
187 List<Folder> contextFolders = _contexts.keys.toList(); 187 List<Folder> contextFolders = _contexts.keys.toList();
188 if (roots == null) { 188 if (roots == null) {
189 contextFolders.forEach(_destroyContext); 189 contextFolders.forEach(_destroyContext);
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 } 381 }
382 } 382 }
383 383
384 /** 384 /**
385 * Compute the appropriate package URI resolver for [folder], and store 385 * Compute the appropriate package URI resolver for [folder], and store
386 * dependency information in [info]. Return `null` if no package map can 386 * dependency information in [info]. Return `null` if no package map can
387 * be computed. 387 * be computed.
388 */ 388 */
389 UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) { 389 UriResolver _computePackageUriResolver(Folder folder, _ContextInfo info) {
390 if (info.packageRoot != null) { 390 if (info.packageRoot != null) {
391 info.packageMapDependencies = new Set<String>(); 391 info.packageMapInfo = null;
392 return new PackageUriResolver([new JavaFile(info.packageRoot)]); 392 return new PackageUriResolver([new JavaFile(info.packageRoot)]);
393 } else { 393 } else {
394 beginComputePackageMap(); 394 beginComputePackageMap();
395 PackageMapInfo packageMapInfo; 395 OptimizingPubPackageMapInfo packageMapInfo;
396 ServerPerformanceStatistics.pub.makeCurrentWhile(() { 396 ServerPerformanceStatistics.pub.makeCurrentWhile(() {
397 packageMapInfo = _packageMapProvider.computePackageMap(folder); 397 packageMapInfo =
398 _packageMapProvider.computePackageMap(folder, info.packageMapInfo);
398 }); 399 });
399 endComputePackageMap(); 400 endComputePackageMap();
400 info.packageMapDependencies = packageMapInfo.dependencies; 401 info.packageMapInfo = packageMapInfo;
401 if (packageMapInfo.packageMap == null) { 402 if (packageMapInfo.packageMap == null) {
402 return null; 403 return null;
403 } 404 }
404 return new PackageMapUriResolver( 405 return new PackageMapUriResolver(
405 resourceProvider, packageMapInfo.packageMap); 406 resourceProvider, packageMapInfo.packageMap);
406 // TODO(paulberry): if any of the dependencies is outside of [folder], 407 // TODO(paulberry): if any of the dependencies is outside of [folder],
407 // we'll need to watch their parent folders as well. 408 // we'll need to watch their parent folders as well.
408 } 409 }
409 } 410 }
410 411
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 if (!sources.isEmpty) { 588 if (!sources.isEmpty) {
588 ChangeSet changeSet = new ChangeSet(); 589 ChangeSet changeSet = new ChangeSet();
589 sources.forEach((Source source) { 590 sources.forEach((Source source) {
590 changeSet.changedSource(source); 591 changeSet.changedSource(source);
591 }); 592 });
592 applyChangesToContext(folder, changeSet); 593 applyChangesToContext(folder, changeSet);
593 } 594 }
594 break; 595 break;
595 } 596 }
596 597
597 if (info.packageMapDependencies.contains(path)) { 598 if (info.packageMapInfo != null &&
599 info.packageMapInfo.isChangedDependency(path, resourceProvider)) {
598 _recomputePackageUriResolver(info); 600 _recomputePackageUriResolver(info);
599 } 601 }
600 } 602 }
601 603
602 /** 604 /**
603 * Returns `true` if the given [path] is excluded by [excludedPaths]. 605 * Returns `true` if the given [path] is excluded by [excludedPaths].
604 */ 606 */
605 bool _isExcluded(String path) { 607 bool _isExcluded(String path) {
606 return _isExcludedBy(excludedPaths, path); 608 return _isExcludedBy(excludedPaths, path);
607 } 609 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 */ 739 */
738 AnalysisContext context; 740 AnalysisContext context;
739 741
740 /** 742 /**
741 * Map from full path to the [Source] object, for each source that has been 743 * Map from full path to the [Source] object, for each source that has been
742 * added to the context. 744 * added to the context.
743 */ 745 */
744 Map<String, Source> sources = new HashMap<String, Source>(); 746 Map<String, Source> sources = new HashMap<String, Source>();
745 747
746 /** 748 /**
747 * Dependencies of the context's package map. 749 * Info returned by the last call to
748 * If any of these files changes, the package map needs to be recomputed. 750 * [OptimizingPubPackageMapProvider.computePackageMap], or `null` if the
751 * package map hasn't been computed for this context yet.
749 */ 752 */
750 Set<String> packageMapDependencies; 753 OptimizingPubPackageMapInfo packageMapInfo;
751 754
752 _ContextInfo(this.folder, File pubspecFile, this.children, this.packageRoot) { 755 _ContextInfo(this.folder, File pubspecFile, this.children, this.packageRoot) {
753 pubspecPath = pubspecFile.path; 756 pubspecPath = pubspecFile.path;
754 for (_ContextInfo child in children) { 757 for (_ContextInfo child in children) {
755 child.parent = this; 758 child.parent = this;
756 } 759 }
757 } 760 }
758 761
759 /** 762 /**
760 * Returns `true` if this context is root folder based. 763 * Returns `true` if this context is root folder based.
(...skipping 16 matching lines...) Expand all
777 return excludes(resource.path); 780 return excludes(resource.path);
778 } 781 }
779 782
780 /** 783 /**
781 * Returns `true` if [path] is the pubspec file of this context. 784 * Returns `true` if [path] is the pubspec file of this context.
782 */ 785 */
783 bool isPubspec(String path) { 786 bool isPubspec(String path) {
784 return path == pubspecPath; 787 return path == pubspecPath;
785 } 788 }
786 } 789 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/analysis_server.dart ('k') | pkg/analysis_server/lib/src/socket_server.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698