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 |
107 /** | 113 /** |
108 * Create and return a new analysis context. | 114 * Create and return a new analysis context. |
109 */ | 115 */ |
110 AnalysisContext addContext(Folder folder, UriResolver packageUriResolver); | 116 AnalysisContext addContext(Folder folder, UriResolver packageUriResolver); |
111 | 117 |
112 /** | 118 /** |
(...skipping 44 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 ignore = analyzer['ignore']; | |
Brian Wilkerson
2015/07/17 21:03:22
"ignore" --> "exclude"
Cutch
2015/07/17 21:09:40
Done.
| |
197 if (ignore != null) { | |
198 setIgnorePatternsForContext(folder, ignore); | |
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; | |
Brian Wilkerson
2015/07/17 21:03:22
Is there a reason to catch the exception if we're
Cutch
2015/07/17 21:09:41
The analyzer tells me I need to have a catch or fi
Brian Wilkerson
2015/07/17 21:11:53
Ok. I'll re-phrase. Why do you want a try block he
Cutch
2015/07/17 21:13:16
Sorry, I was being dense. I now understand your or
Brian Wilkerson
2015/07/17 21:14:25
No problem. A follow-up CL will work.
| |
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 |