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 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/analysis_options_provider.dart'; |
16 import 'package:analyzer/source/package_map_resolver.dart'; | 17 import 'package:analyzer/source/package_map_resolver.dart'; |
17 import 'package:analyzer/source/path_filter.dart'; | 18 import 'package:analyzer/source/path_filter.dart'; |
18 import 'package:analyzer/src/generated/engine.dart'; | 19 import 'package:analyzer/src/generated/engine.dart'; |
19 import 'package:analyzer/src/generated/java_io.dart'; | 20 import 'package:analyzer/src/generated/java_io.dart'; |
20 import 'package:analyzer/src/generated/source.dart'; | 21 import 'package:analyzer/src/generated/source.dart'; |
21 import 'package:analyzer/src/generated/source_io.dart'; | 22 import 'package:analyzer/src/generated/source_io.dart'; |
22 import 'package:path/path.dart' as pathos; | 23 import 'package:path/path.dart' as pathos; |
23 import 'package:watcher/watcher.dart'; | 24 import 'package:watcher/watcher.dart'; |
| 25 import 'package:yaml/yaml.dart'; |
24 | 26 |
25 /** | 27 /** |
26 * Class that maintains a mapping from included/excluded paths to a set of | 28 * Class that maintains a mapping from included/excluded paths to a set of |
27 * folders that should correspond to analysis contexts. | 29 * folders that should correspond to analysis contexts. |
28 */ | 30 */ |
29 abstract class AbstractContextManager implements ContextManager { | 31 abstract class AbstractContextManager implements ContextManager { |
30 /** | 32 /** |
31 * The name of the `lib` directory. | 33 * The name of the `lib` directory. |
32 */ | 34 */ |
33 static const String LIB_DIR_NAME = 'lib'; | 35 static const String LIB_DIR_NAME = 'lib'; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 * to the standard URI resolver. | 89 * to the standard URI resolver. |
88 */ | 90 */ |
89 final ResolverProvider packageResolverProvider; | 91 final ResolverProvider packageResolverProvider; |
90 | 92 |
91 /** | 93 /** |
92 * Provider which is used to determine the mapping from package name to | 94 * Provider which is used to determine the mapping from package name to |
93 * package folder. | 95 * package folder. |
94 */ | 96 */ |
95 final OptimizingPubPackageMapProvider _packageMapProvider; | 97 final OptimizingPubPackageMapProvider _packageMapProvider; |
96 | 98 |
| 99 /// Provider of analysis options. |
| 100 AnalysisOptionsProvider analysisOptionsProvider = |
| 101 new AnalysisOptionsProvider(); |
| 102 |
97 /** | 103 /** |
98 * The instrumentation service used to report instrumentation data. | 104 * The instrumentation service used to report instrumentation data. |
99 */ | 105 */ |
100 final InstrumentationService _instrumentationService; | 106 final InstrumentationService _instrumentationService; |
101 | 107 |
102 AbstractContextManager(this.resourceProvider, this.packageResolverProvider, | 108 AbstractContextManager(this.resourceProvider, this.packageResolverProvider, |
103 this._packageMapProvider, this._instrumentationService) { | 109 this._packageMapProvider, this._instrumentationService) { |
104 pathContext = resourceProvider.pathContext; | 110 pathContext = resourceProvider.pathContext; |
105 } | 111 } |
106 | 112 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 return contexts; | 163 return contexts; |
158 } | 164 } |
159 | 165 |
160 /** | 166 /** |
161 * We have finished computing the package map. | 167 * We have finished computing the package map. |
162 */ | 168 */ |
163 void endComputePackageMap() { | 169 void endComputePackageMap() { |
164 // Do nothing. | 170 // Do nothing. |
165 } | 171 } |
166 | 172 |
167 // Sets the [ignorePatterns] for the context [folder]. | 173 /// Sets the [ignorePatterns] for the context [folder]. |
168 void setIgnorePatternsForContext(Folder folder, List<String> ignorePatterns) { | 174 void setIgnorePatternsForContext(Folder folder, List<String> ignorePatterns) { |
169 _ContextInfo info = _contexts[folder]; | 175 _ContextInfo info = _contexts[folder]; |
170 if (info == null) { | 176 if (info == null) { |
171 return; | 177 return; |
172 } | 178 } |
173 var pathFilter = info.pathFilter; | 179 var pathFilter = info.pathFilter; |
174 pathFilter.setIgnorePatterns(ignorePatterns); | 180 pathFilter.setIgnorePatterns(ignorePatterns); |
175 } | 181 } |
176 | 182 |
| 183 /// Process [options] for the context [folder]. |
| 184 void processOptionsForContext(Folder folder, Map<String, YamlNode> options) { |
| 185 _ContextInfo info = _contexts[folder]; |
| 186 if (info == null) { |
| 187 return; |
| 188 } |
| 189 YamlMap analyzer = options['analyzer']; |
| 190 if (analyzer == null) { |
| 191 // No options for analyzer. |
| 192 return; |
| 193 } |
| 194 |
| 195 // Set ignore patterns. |
| 196 YamlList exclude = analyzer['exclude']; |
| 197 if (exclude != null) { |
| 198 setIgnorePatternsForContext(folder, exclude); |
| 199 } |
| 200 } |
| 201 |
177 @override | 202 @override |
178 bool isInAnalysisRoot(String path) { | 203 bool isInAnalysisRoot(String path) { |
179 // check if excluded | 204 // check if excluded |
180 if (_isExcluded(path)) { | 205 if (_isExcluded(path)) { |
181 return false; | 206 return false; |
182 } | 207 } |
183 // check if in of the roots | 208 // check if in of the roots |
184 for (Folder root in _contexts.keys) { | 209 for (Folder root in _contexts.keys) { |
185 if (root.contains(path)) { | 210 if (root.contains(path)) { |
186 return true; | 211 return true; |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 } | 508 } |
484 | 509 |
485 /** | 510 /** |
486 * Create a new empty context associated with [folder]. | 511 * Create a new empty context associated with [folder]. |
487 */ | 512 */ |
488 _ContextInfo _createContext( | 513 _ContextInfo _createContext( |
489 Folder folder, File pubspecFile, List<_ContextInfo> children) { | 514 Folder folder, File pubspecFile, List<_ContextInfo> children) { |
490 _ContextInfo info = new _ContextInfo( | 515 _ContextInfo info = new _ContextInfo( |
491 folder, pubspecFile, children, normalizedPackageRoots[folder.path]); | 516 folder, pubspecFile, children, normalizedPackageRoots[folder.path]); |
492 _contexts[folder] = info; | 517 _contexts[folder] = info; |
| 518 try { |
| 519 var options = analysisOptionsProvider.getOptions(folder); |
| 520 processOptionsForContext(folder, options); |
| 521 } catch (_) { |
| 522 rethrow; |
| 523 } |
493 info.changeSubscription = folder.changes.listen((WatchEvent event) { | 524 info.changeSubscription = folder.changes.listen((WatchEvent event) { |
494 _handleWatchEvent(folder, info, event); | 525 _handleWatchEvent(folder, info, event); |
495 }); | 526 }); |
496 try { | 527 try { |
497 UriResolver packageUriResolver = _computePackageUriResolver(folder, info); | 528 UriResolver packageUriResolver = _computePackageUriResolver(folder, info); |
498 info.context = addContext(folder, packageUriResolver); | 529 info.context = addContext(folder, packageUriResolver); |
499 info.context.name = folder.path; | 530 info.context.name = folder.path; |
500 } catch (_) { | 531 } catch (_) { |
501 info.changeSubscription.cancel(); | 532 info.changeSubscription.cancel(); |
502 rethrow; | 533 rethrow; |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 return excludes(resource.path); | 995 return excludes(resource.path); |
965 } | 996 } |
966 | 997 |
967 /** | 998 /** |
968 * Returns `true` if [path] is the pubspec file of this context. | 999 * Returns `true` if [path] is the pubspec file of this context. |
969 */ | 1000 */ |
970 bool isPubspec(String path) { | 1001 bool isPubspec(String path) { |
971 return path == pubspecPath; | 1002 return path == pubspecPath; |
972 } | 1003 } |
973 } | 1004 } |
OLD | NEW |