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

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

Issue 1238173003: Add a PathFilter to each context in analysis_server (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 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
« no previous file with comments | « no previous file | pkg/analysis_server/pubspec.yaml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 import 'dart:core' hide Resource; 9 import 'dart:core' hide Resource;
10 10
11 import 'package:analysis_server/src/analysis_server.dart'; 11 import 'package:analysis_server/src/analysis_server.dart';
12 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.d art'; 12 import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.d art';
13 import 'package:analysis_server/uri/resolver_provider.dart'; 13 import 'package:analysis_server/uri/resolver_provider.dart';
14 import 'package:analyzer/file_system/file_system.dart'; 14 import 'package:analyzer/file_system/file_system.dart';
15 import 'package:analyzer/instrumentation/instrumentation.dart'; 15 import 'package:analyzer/instrumentation/instrumentation.dart';
16 import 'package:analyzer/source/package_map_resolver.dart'; 16 import 'package:analyzer/source/package_map_resolver.dart';
17 import 'package:analyzer/source/path_filter.dart';
17 import 'package:analyzer/src/generated/engine.dart'; 18 import 'package:analyzer/src/generated/engine.dart';
18 import 'package:analyzer/src/generated/java_io.dart'; 19 import 'package:analyzer/src/generated/java_io.dart';
19 import 'package:analyzer/src/generated/source.dart'; 20 import 'package:analyzer/src/generated/source.dart';
20 import 'package:analyzer/src/generated/source_io.dart'; 21 import 'package:analyzer/src/generated/source_io.dart';
21 import 'package:path/path.dart' as pathos; 22 import 'package:path/path.dart' as pathos;
22 import 'package:watcher/watcher.dart'; 23 import 'package:watcher/watcher.dart';
23 24
24 /** 25 /**
25 * Class that maintains a mapping from included/excluded paths to a set of 26 * Class that maintains a mapping from included/excluded paths to a set of
26 * folders that should correspond to analysis contexts. 27 * folders that should correspond to analysis contexts.
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 return contexts; 157 return contexts;
157 } 158 }
158 159
159 /** 160 /**
160 * We have finished computing the package map. 161 * We have finished computing the package map.
161 */ 162 */
162 void endComputePackageMap() { 163 void endComputePackageMap() {
163 // Do nothing. 164 // Do nothing.
164 } 165 }
165 166
167 // Sets the [ignorePatterns] for the context [folder].
168 void setIgnorePatternsForContext(Folder folder, List<String> ignorePatterns) {
169 _ContextInfo info = _contexts[folder];
170 if (info == null) {
171 return;
172 }
173 var pathFilter = info.pathFilter;
174 pathFilter.setIgnorePatterns(ignorePatterns);
175 }
176
166 @override 177 @override
167 bool isInAnalysisRoot(String path) { 178 bool isInAnalysisRoot(String path) {
168 // check if excluded 179 // check if excluded
169 if (_isExcluded(path)) { 180 if (_isExcluded(path)) {
170 return false; 181 return false;
171 } 182 }
172 // check if in of the roots 183 // check if in of the roots
173 for (Folder root in _contexts.keys) { 184 for (Folder root in _contexts.keys) {
174 if (root.contains(path)) { 185 if (root.contains(path)) {
175 return true; 186 return true;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 List<Resource> children; 322 List<Resource> children;
312 try { 323 try {
313 children = folder.getChildren(); 324 children = folder.getChildren();
314 } on FileSystemException { 325 } on FileSystemException {
315 // The folder no longer exists, or cannot be read, to there's nothing to 326 // The folder no longer exists, or cannot be read, to there's nothing to
316 // do. 327 // do.
317 return; 328 return;
318 } 329 }
319 for (Resource child in children) { 330 for (Resource child in children) {
320 String path = child.path; 331 String path = child.path;
332 // Path is being ignored.
333 if (info.ignored(path)) {
334 continue;
335 }
321 // add files, recurse into folders 336 // add files, recurse into folders
322 if (child is File) { 337 if (child is File) {
323 // ignore if should not be analyzed at all 338 // ignore if should not be analyzed at all
324 if (!shouldFileBeAnalyzed(child)) { 339 if (!shouldFileBeAnalyzed(child)) {
325 continue; 340 continue;
326 } 341 }
327 // ignore if was not excluded 342 // ignore if was not excluded
328 bool wasExcluded = _isExcludedBy(oldExcludedPaths, path) && 343 bool wasExcluded = _isExcludedBy(oldExcludedPaths, path) &&
329 !_isExcludedBy(excludedPaths, path); 344 !_isExcludedBy(excludedPaths, path);
330 if (!wasExcluded) { 345 if (!wasExcluded) {
(...skipping 23 matching lines...) Expand all
354 try { 369 try {
355 children = folder.getChildren(); 370 children = folder.getChildren();
356 } on FileSystemException { 371 } on FileSystemException {
357 // The directory either doesn't exist or cannot be read. Either way, there 372 // The directory either doesn't exist or cannot be read. Either way, there
358 // are no children that need to be added. 373 // are no children that need to be added.
359 return; 374 return;
360 } 375 }
361 for (Resource child in children) { 376 for (Resource child in children) {
362 String path = child.path; 377 String path = child.path;
363 // ignore excluded files or folders 378 // ignore excluded files or folders
364 if (_isExcluded(path) || info.excludes(path)) { 379 if (_isExcluded(path) || info.excludes(path) || info.ignored(path)) {
365 continue; 380 continue;
366 } 381 }
367 // add files, recurse into folders 382 // add files, recurse into folders
368 if (child is File) { 383 if (child is File) {
369 if (shouldFileBeAnalyzed(child)) { 384 if (shouldFileBeAnalyzed(child)) {
370 Source source = createSourceInContext(info.context, child); 385 Source source = createSourceInContext(info.context, child);
371 changeSet.addedSource(source); 386 changeSet.addedSource(source);
372 info.sources[path] = source; 387 info.sources[path] = source;
373 } 388 }
374 } else if (child is Folder) { 389 } else if (child is Folder) {
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 folder.path, event.path, event.type.toString()); 614 folder.path, event.path, event.type.toString());
600 String path = event.path; 615 String path = event.path;
601 // maybe excluded globally 616 // maybe excluded globally
602 if (_isExcluded(path)) { 617 if (_isExcluded(path)) {
603 return; 618 return;
604 } 619 }
605 // maybe excluded from the context, so other context will handle it 620 // maybe excluded from the context, so other context will handle it
606 if (info.excludes(path)) { 621 if (info.excludes(path)) {
607 return; 622 return;
608 } 623 }
624 if (info.ignored(path)) {
625 return;
626 }
609 // handle the change 627 // handle the change
610 switch (event.type) { 628 switch (event.type) {
611 case ChangeType.ADD: 629 case ChangeType.ADD:
612 if (_isInPackagesDir(path, folder)) { 630 if (_isInPackagesDir(path, folder)) {
613 return; 631 return;
614 } 632 }
615 Resource resource = resourceProvider.getResource(path); 633 Resource resource = resourceProvider.getResource(path);
616 // pubspec was added in a sub-folder, extract a new context 634 // pubspec was added in a sub-folder, extract a new context
617 if (_isPubspec(path) && info.isRoot && !info.isPubspec(path)) { 635 if (_isPubspec(path) && info.isRoot && !info.isPubspec(path)) {
618 _extractContext(info, resource); 636 _extractContext(info, resource);
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 870
853 /** 871 /**
854 * Information tracked by the [ContextManager] for each context. 872 * Information tracked by the [ContextManager] for each context.
855 */ 873 */
856 class _ContextInfo { 874 class _ContextInfo {
857 /** 875 /**
858 * The [Folder] for which this information object is created. 876 * The [Folder] for which this information object is created.
859 */ 877 */
860 final Folder folder; 878 final Folder folder;
861 879
880 /// The [PathFilter] used to filter sources from being analyzed.
881 final PathFilter pathFilter;
882
862 /** 883 /**
863 * The enclosed pubspec-based contexts. 884 * The enclosed pubspec-based contexts.
864 */ 885 */
865 final List<_ContextInfo> children; 886 final List<_ContextInfo> children;
866 887
867 /** 888 /**
868 * The package root for this context, or null if there is no package root. 889 * The package root for this context, or null if there is no package root.
869 */ 890 */
870 String packageRoot; 891 String packageRoot;
871 892
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 */ 924 */
904 Map<String, Source> sources = new HashMap<String, Source>(); 925 Map<String, Source> sources = new HashMap<String, Source>();
905 926
906 /** 927 /**
907 * Info returned by the last call to 928 * Info returned by the last call to
908 * [OptimizingPubPackageMapProvider.computePackageMap], or `null` if the 929 * [OptimizingPubPackageMapProvider.computePackageMap], or `null` if the
909 * package map hasn't been computed for this context yet. 930 * package map hasn't been computed for this context yet.
910 */ 931 */
911 OptimizingPubPackageMapInfo packageMapInfo; 932 OptimizingPubPackageMapInfo packageMapInfo;
912 933
913 _ContextInfo(this.folder, File pubspecFile, this.children, this.packageRoot) { 934 _ContextInfo(Folder folder, File pubspecFile, this.children, this.packageRoot)
935 : folder = folder,
936 pathFilter = new PathFilter(folder.path, null) {
914 pubspecPath = pubspecFile.path; 937 pubspecPath = pubspecFile.path;
915 for (_ContextInfo child in children) { 938 for (_ContextInfo child in children) {
916 child.parent = this; 939 child.parent = this;
917 } 940 }
918 } 941 }
919 942
920 /** 943 /**
921 * Returns `true` if this context is root folder based. 944 * Returns `true` if this context is root folder based.
922 */ 945 */
923 bool get isRoot => parent == null; 946 bool get isRoot => parent == null;
924 947
925 /** 948 /**
926 * Returns `true` if [path] is excluded, as it is in one of the children. 949 * Returns `true` if [path] is excluded, as it is in one of the children.
927 */ 950 */
928 bool excludes(String path) { 951 bool excludes(String path) {
929 return children.any((child) { 952 return children.any((child) {
930 return child.folder.contains(path); 953 return child.folder.contains(path);
931 }); 954 });
932 } 955 }
933 956
957 /// Returns `true` if [path] should be ignored.
958 bool ignored(String path) => pathFilter.ignored(path);
959
934 /** 960 /**
935 * Returns `true` if [resource] is excluded, as it is in one of the children. 961 * Returns `true` if [resource] is excluded, as it is in one of the children.
936 */ 962 */
937 bool excludesResource(Resource resource) { 963 bool excludesResource(Resource resource) {
938 return excludes(resource.path); 964 return excludes(resource.path);
939 } 965 }
940 966
941 /** 967 /**
942 * Returns `true` if [path] is the pubspec file of this context. 968 * Returns `true` if [path] is the pubspec file of this context.
943 */ 969 */
944 bool isPubspec(String path) { 970 bool isPubspec(String path) {
945 return path == pubspecPath; 971 return path == pubspecPath;
946 } 972 }
947 } 973 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698