OLD | NEW |
| (Empty) |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
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. | |
4 | |
5 import 'package:analyzer/file_system/file_system.dart'; | |
6 import 'package:analyzer/source/analysis_options_provider.dart'; | |
7 import 'package:analyzer/src/generated/engine.dart'; | |
8 import 'package:analyzer/src/task/model.dart'; | |
9 import 'package:analyzer/task/model.dart'; | |
10 import 'package:package_config/packages.dart'; | |
11 import 'package:yaml/src/yaml_node.dart'; | |
12 import 'package:yaml/yaml.dart'; | |
13 | |
14 /// The descriptor used to associate analysis configuration with analysis | |
15 /// contexts in configuration data. | |
16 final ResultDescriptor<AnalysisConfiguration> ANALYSIS_CONFIGURATION = | |
17 new ResultDescriptorImpl('analysis.config', null); | |
18 | |
19 /// Return configuration associated with this [context], or `null` if there is | |
20 /// none. | |
21 AnalysisConfiguration getConfiguration(AnalysisContext context) => | |
22 context.getConfigurationData(ANALYSIS_CONFIGURATION); | |
23 | |
24 /// Associate this [config] with the given [context]. | |
25 void setConfiguration(AnalysisContext context, AnalysisConfiguration config) { | |
26 context.setConfigurationData(ANALYSIS_CONFIGURATION, config); | |
27 } | |
28 | |
29 /// Analysis configuration. | |
30 abstract class AnalysisConfiguration { | |
31 final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider(); | |
32 final Packages packages; | |
33 final ResourceProvider resourceProvider; | |
34 AnalysisConfiguration(this.resourceProvider, this.packages); | |
35 | |
36 factory AnalysisConfiguration.fromPubspec( | |
37 File pubspec, ResourceProvider resourceProvider, Packages packages) => | |
38 new PubspecConfiguration(pubspec, resourceProvider, packages); | |
39 | |
40 /// Get a map of options defined by this configuration (or `null` if none | |
41 /// are specified). | |
42 Map get options; | |
43 } | |
44 | |
45 /// Describes an analysis configuration. | |
46 class AnalysisConfigurationDescriptor { | |
47 /// The name of the package hosting the configuration. | |
48 String package; | |
49 | |
50 /// The name of the configuration "pragma". | |
51 String pragma; | |
52 | |
53 AnalysisConfigurationDescriptor.fromAnalyzerOptions(Map analyzerOptions) { | |
54 Object config = analyzerOptions['configuration']; | |
55 if (config is String) { | |
56 List<String> items = config.split('/'); | |
57 if (items.length == 2) { | |
58 package = items[0].trim(); | |
59 pragma = items[1].trim(); | |
60 } | |
61 } | |
62 } | |
63 | |
64 /// Return true if this descriptor is valid. | |
65 bool get isValid => package != null && pragma != null; | |
66 } | |
67 | |
68 /// Pubspec-specified analysis configuration. | |
69 class PubspecConfiguration extends AnalysisConfiguration { | |
70 final File pubspec; | |
71 PubspecConfiguration( | |
72 this.pubspec, ResourceProvider resourceProvider, Packages packages) | |
73 : super(resourceProvider, packages); | |
74 | |
75 @override | |
76 Map get options { | |
77 //Safest not to cache (requested infrequently). | |
78 if (pubspec.exists) { | |
79 try { | |
80 String contents = pubspec.readAsStringSync(); | |
81 YamlNode map = loadYamlNode(contents); | |
82 if (map is YamlMap) { | |
83 YamlNode config = map['analyzer']; | |
84 if (config is YamlMap) { | |
85 AnalysisConfigurationDescriptor descriptor = | |
86 new AnalysisConfigurationDescriptor.fromAnalyzerOptions(config); | |
87 | |
88 if (descriptor.isValid) { | |
89 //Create a path, given descriptor and packagemap | |
90 Uri uri = packages.asMap()[descriptor.package]; | |
91 Uri pragma = new Uri.file('config/${descriptor.pragma}.yaml', | |
92 windows: false); | |
93 Uri optionsUri = uri.resolveUri(pragma); | |
94 String path = resourceProvider.pathContext.fromUri(optionsUri); | |
95 File file = resourceProvider.getFile(path); | |
96 if (file.exists) { | |
97 return optionsProvider.getOptionsFromFile(file); | |
98 } | |
99 } | |
100 } | |
101 } | |
102 } catch (_) { | |
103 // Skip exceptional configurations. | |
104 } | |
105 } | |
106 return null; | |
107 } | |
108 } | |
OLD | NEW |