OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 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 analyzer.src.context.context_builder; | 5 library analyzer.src.context.context_builder; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 import 'dart:core'; | 8 import 'dart:core'; |
9 | 9 |
10 import 'package:analyzer/context/declared_variables.dart'; | 10 import 'package:analyzer/context/declared_variables.dart'; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 * they can be shared across contexts. | 62 * they can be shared across contexts. |
63 */ | 63 */ |
64 final DartSdkManager sdkManager; | 64 final DartSdkManager sdkManager; |
65 | 65 |
66 /** | 66 /** |
67 * The cache containing the contents of overlaid files. | 67 * The cache containing the contents of overlaid files. |
68 */ | 68 */ |
69 final ContentCache contentCache; | 69 final ContentCache contentCache; |
70 | 70 |
71 /** | 71 /** |
| 72 * The options used by the context builder. |
| 73 */ |
| 74 final ContextBuilderOptions builderOptions; |
| 75 |
| 76 /** |
72 * The resolver provider used to create a package: URI resolver, or `null` if | 77 * The resolver provider used to create a package: URI resolver, or `null` if |
73 * the normal (Package Specification DEP) lookup mechanism is to be used. | 78 * the normal (Package Specification DEP) lookup mechanism is to be used. |
74 */ | 79 */ |
75 @deprecated | 80 @deprecated |
76 ResolverProvider packageResolverProvider; | 81 ResolverProvider packageResolverProvider; |
77 | 82 |
78 /** | 83 /** |
79 * The resolver provider used to create a file: URI resolver, or `null` if | 84 * The resolver provider used to create a file: URI resolver, or `null` if |
80 * the normal file URI resolver is to be used. | 85 * the normal file URI resolver is to be used. |
81 */ | 86 */ |
82 @deprecated | 87 @deprecated |
83 ResolverProvider fileResolverProvider; | 88 ResolverProvider fileResolverProvider; |
84 | 89 |
85 /** | 90 /** |
86 * The file path of the .packages file that should be used in place of any | |
87 * file found using the normal (Package Specification DEP) lookup mechanism, | |
88 * or `null` if the normal lookup mechanism should be used. | |
89 */ | |
90 String defaultPackageFilePath; | |
91 | |
92 /** | |
93 * The file path of the packages directory that should be used in place of any | |
94 * file found using the normal (Package Specification DEP) lookup mechanism, | |
95 * or `null` if the normal lookup mechanism should be used. | |
96 */ | |
97 String defaultPackagesDirectoryPath; | |
98 | |
99 /** | |
100 * The file path of the file containing the summary of the SDK that should be | |
101 * used to "analyze" the SDK. This option should only be specified by | |
102 * command-line tools such as 'dartanalyzer' or 'ddc'. | |
103 */ | |
104 String dartSdkSummaryPath; | |
105 | |
106 /** | |
107 * The file path of the analysis options file that should be used in place of | |
108 * any file in the root directory or a parent of the root directory, or `null` | |
109 * if the normal lookup mechanism should be used. | |
110 */ | |
111 String defaultAnalysisOptionsFilePath; | |
112 | |
113 /** | |
114 * The default analysis options that should be used unless some or all of them | |
115 * are overridden in the analysis options file, or `null` if the default | |
116 * defaults should be used. | |
117 */ | |
118 AnalysisOptions defaultOptions; | |
119 | |
120 /** | |
121 * A table mapping variable names to values for the declared variables, or | |
122 * `null` if no additional variables should be declared. | |
123 */ | |
124 Map<String, String> declaredVariables; | |
125 | |
126 /** | |
127 * The manager of pub package summaries. | |
128 */ | |
129 PubSummaryManager pubSummaryManager; | |
130 | |
131 /** | |
132 * Initialize a newly created builder to be ready to build a context rooted in | 91 * Initialize a newly created builder to be ready to build a context rooted in |
133 * the directory with the given [rootDirectoryPath]. | 92 * the directory with the given [rootDirectoryPath]. |
134 */ | 93 */ |
135 ContextBuilder(this.resourceProvider, this.sdkManager, this.contentCache); | 94 ContextBuilder(this.resourceProvider, this.sdkManager, this.contentCache, |
| 95 {ContextBuilderOptions options}) |
| 96 : builderOptions = options ?? new ContextBuilderOptions(); |
136 | 97 |
137 /** | 98 /** |
138 * Return an analysis context that is configured correctly to analyze code in | 99 * Return an analysis context that is configured correctly to analyze code in |
139 * the directory with the given [path]. | 100 * the directory with the given [path]. |
140 * | 101 * |
141 * *Note:* This method is not yet fully implemented and should not be used. | 102 * *Note:* This method is not yet fully implemented and should not be used. |
142 */ | 103 */ |
143 AnalysisContext buildContext(String path) { | 104 AnalysisContext buildContext(String path) { |
144 InternalAnalysisContext context = | 105 InternalAnalysisContext context = |
145 AnalysisEngine.instance.createAnalysisContext(); | 106 AnalysisEngine.instance.createAnalysisContext(); |
146 AnalysisOptions options = getAnalysisOptions(context, path); | 107 AnalysisOptions options = getAnalysisOptions(context, path); |
147 context.contentCache = contentCache; | 108 context.contentCache = contentCache; |
148 context.sourceFactory = createSourceFactory(path, options); | 109 context.sourceFactory = createSourceFactory(path, options); |
149 context.analysisOptions = options; | 110 context.analysisOptions = options; |
150 context.name = path; | 111 context.name = path; |
151 //_processAnalysisOptions(context, optionMap); | 112 //_processAnalysisOptions(context, optionMap); |
152 declareVariables(context); | 113 declareVariables(context); |
153 configureSummaries(context); | 114 configureSummaries(context); |
154 return context; | 115 return context; |
155 } | 116 } |
156 | 117 |
157 /** | 118 /** |
158 * Configure the context to make use of summaries. | 119 * Configure the context to make use of summaries. |
159 */ | 120 */ |
160 void configureSummaries(InternalAnalysisContext context) { | 121 void configureSummaries(InternalAnalysisContext context) { |
161 if (pubSummaryManager != null) { | 122 PubSummaryManager manager = builderOptions.pubSummaryManager; |
162 List<LinkedPubPackage> linkedBundles = | 123 if (manager != null) { |
163 pubSummaryManager.getLinkedBundles(context); | 124 List<LinkedPubPackage> linkedBundles = manager.getLinkedBundles(context); |
164 if (linkedBundles.isNotEmpty) { | 125 if (linkedBundles.isNotEmpty) { |
165 SummaryDataStore store = new SummaryDataStore([]); | 126 SummaryDataStore store = new SummaryDataStore([]); |
166 for (LinkedPubPackage package in linkedBundles) { | 127 for (LinkedPubPackage package in linkedBundles) { |
167 store.addBundle(null, package.unlinked); | 128 store.addBundle(null, package.unlinked); |
168 store.addBundle(null, package.linked); | 129 store.addBundle(null, package.linked); |
169 } | 130 } |
170 context.resultProvider = | 131 context.resultProvider = |
171 new InputPackagesResultProvider(context, store); | 132 new InputPackagesResultProvider(context, store); |
172 } | 133 } |
173 } | 134 } |
(...skipping 30 matching lines...) Expand all Loading... |
204 // } | 165 // } |
205 // } on Exception catch (e) { | 166 // } on Exception catch (e) { |
206 // optionsProcessors.forEach((OptionsProcessor p) => p.onError(e)); | 167 // optionsProcessors.forEach((OptionsProcessor p) => p.onError(e)); |
207 // } | 168 // } |
208 // } | 169 // } |
209 | 170 |
210 /** | 171 /** |
211 * Return an analysis options object containing the default option values. | 172 * Return an analysis options object containing the default option values. |
212 */ | 173 */ |
213 AnalysisOptions createDefaultOptions() { | 174 AnalysisOptions createDefaultOptions() { |
| 175 AnalysisOptions defaultOptions = builderOptions.defaultOptions; |
214 if (defaultOptions == null) { | 176 if (defaultOptions == null) { |
215 return new AnalysisOptionsImpl(); | 177 return new AnalysisOptionsImpl(); |
216 } | 178 } |
217 return new AnalysisOptionsImpl.from(defaultOptions); | 179 return new AnalysisOptionsImpl.from(defaultOptions); |
218 } | 180 } |
219 | 181 |
220 Packages createPackageMap(String rootDirectoryPath) { | 182 Packages createPackageMap(String rootDirectoryPath) { |
221 if (defaultPackageFilePath != null) { | 183 String filePath = builderOptions.defaultPackageFilePath; |
222 File configFile = resourceProvider.getFile(defaultPackageFilePath); | 184 if (filePath != null) { |
| 185 File configFile = resourceProvider.getFile(filePath); |
223 List<int> bytes = configFile.readAsBytesSync(); | 186 List<int> bytes = configFile.readAsBytesSync(); |
224 Map<String, Uri> map = parse(bytes, configFile.toUri()); | 187 Map<String, Uri> map = parse(bytes, configFile.toUri()); |
225 resolveSymbolicLinks(map); | 188 resolveSymbolicLinks(map); |
226 return new MapPackages(map); | 189 return new MapPackages(map); |
227 } else if (defaultPackagesDirectoryPath != null) { | 190 } |
228 Folder folder = resourceProvider.getFolder(defaultPackagesDirectoryPath); | 191 String directoryPath = builderOptions.defaultPackagesDirectoryPath; |
| 192 if (directoryPath != null) { |
| 193 Folder folder = resourceProvider.getFolder(directoryPath); |
229 return getPackagesFromFolder(folder); | 194 return getPackagesFromFolder(folder); |
230 } | 195 } |
231 return findPackagesFromFile(rootDirectoryPath); | 196 return findPackagesFromFile(rootDirectoryPath); |
232 } | 197 } |
233 | 198 |
234 SourceFactory createSourceFactory(String rootPath, AnalysisOptions options) { | 199 SourceFactory createSourceFactory(String rootPath, AnalysisOptions options) { |
235 BazelWorkspace bazelWorkspace = | 200 BazelWorkspace bazelWorkspace = |
236 BazelWorkspace.find(resourceProvider, rootPath); | 201 BazelWorkspace.find(resourceProvider, rootPath); |
237 if (bazelWorkspace != null) { | 202 if (bazelWorkspace != null) { |
238 List<UriResolver> resolvers = <UriResolver>[ | 203 List<UriResolver> resolvers = <UriResolver>[ |
(...skipping 12 matching lines...) Expand all Loading... |
251 new ResourceUriResolver(resourceProvider) | 216 new ResourceUriResolver(resourceProvider) |
252 ]; | 217 ]; |
253 return new SourceFactory(resolvers, packages, resourceProvider); | 218 return new SourceFactory(resolvers, packages, resourceProvider); |
254 } | 219 } |
255 | 220 |
256 /** | 221 /** |
257 * Add any [declaredVariables] to the list of declared variables used by the | 222 * Add any [declaredVariables] to the list of declared variables used by the |
258 * given [context]. | 223 * given [context]. |
259 */ | 224 */ |
260 void declareVariables(InternalAnalysisContext context) { | 225 void declareVariables(InternalAnalysisContext context) { |
261 if (declaredVariables != null && declaredVariables.isNotEmpty) { | 226 Map<String, String> variables = builderOptions.declaredVariables; |
| 227 if (variables != null && variables.isNotEmpty) { |
262 DeclaredVariables contextVariables = context.declaredVariables; | 228 DeclaredVariables contextVariables = context.declaredVariables; |
263 declaredVariables.forEach((String variableName, String value) { | 229 variables.forEach((String variableName, String value) { |
264 contextVariables.define(variableName, value); | 230 contextVariables.define(variableName, value); |
265 }); | 231 }); |
266 } | 232 } |
267 } | 233 } |
268 | 234 |
269 /** | 235 /** |
270 * Finds a package resolution strategy for the directory at the given absolute | 236 * Finds a package resolution strategy for the directory at the given absolute |
271 * [path]. | 237 * [path]. |
272 * | 238 * |
273 * This function first tries to locate a `.packages` file in the directory. If | 239 * This function first tries to locate a `.packages` file in the directory. If |
(...skipping 11 matching lines...) Expand all Loading... |
285 resolveSymbolicLinks(map); | 251 resolveSymbolicLinks(map); |
286 return new MapPackages(map); | 252 return new MapPackages(map); |
287 } else if (location is Folder) { | 253 } else if (location is Folder) { |
288 return getPackagesFromFolder(location); | 254 return getPackagesFromFolder(location); |
289 } | 255 } |
290 return Packages.noPackages; | 256 return Packages.noPackages; |
291 } | 257 } |
292 | 258 |
293 /** | 259 /** |
294 * Return the SDK that should be used to analyze code. Use the given | 260 * Return the SDK that should be used to analyze code. Use the given |
295 * [packageMap] and [options] to locate the SDK. | 261 * [packageMap] and [analysisOptions] to locate the SDK. |
296 */ | 262 */ |
297 DartSdk findSdk( | 263 DartSdk findSdk( |
298 Map<String, List<Folder>> packageMap, AnalysisOptions options) { | 264 Map<String, List<Folder>> packageMap, AnalysisOptions analysisOptions) { |
299 if (dartSdkSummaryPath != null) { | 265 String summaryPath = builderOptions.dartSdkSummaryPath; |
300 return new SummaryBasedDartSdk(dartSdkSummaryPath, options.strongMode); | 266 if (summaryPath != null) { |
| 267 return new SummaryBasedDartSdk(summaryPath, analysisOptions.strongMode); |
301 } else if (packageMap != null) { | 268 } else if (packageMap != null) { |
302 SdkExtensionFinder extFinder = new SdkExtensionFinder(packageMap); | 269 SdkExtensionFinder extFinder = new SdkExtensionFinder(packageMap); |
303 List<String> extFilePaths = extFinder.extensionFilePaths; | 270 List<String> extFilePaths = extFinder.extensionFilePaths; |
304 EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap); | 271 EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap); |
305 Map<Folder, YamlMap> embedderYamls = locator.embedderYamls; | 272 Map<Folder, YamlMap> embedderYamls = locator.embedderYamls; |
306 EmbedderSdk embedderSdk = | 273 EmbedderSdk embedderSdk = |
307 new EmbedderSdk(resourceProvider, embedderYamls); | 274 new EmbedderSdk(resourceProvider, embedderYamls); |
308 if (embedderSdk.sdkLibraries.length > 0) { | 275 if (embedderSdk.sdkLibraries.length > 0) { |
309 // | 276 // |
310 // There is an embedder file that defines the content of the SDK and | 277 // There is an embedder file that defines the content of the SDK and |
311 // there might be an extension file that extends it. | 278 // there might be an extension file that extends it. |
312 // | 279 // |
313 List<String> paths = <String>[]; | 280 List<String> paths = <String>[]; |
314 for (Folder folder in embedderYamls.keys) { | 281 for (Folder folder in embedderYamls.keys) { |
315 paths.add(folder | 282 paths.add(folder |
316 .getChildAssumingFile(EmbedderYamlLocator.EMBEDDER_FILE_NAME) | 283 .getChildAssumingFile(EmbedderYamlLocator.EMBEDDER_FILE_NAME) |
317 .path); | 284 .path); |
318 } | 285 } |
319 paths.addAll(extFilePaths); | 286 paths.addAll(extFilePaths); |
320 SdkDescription description = new SdkDescription(paths, options); | 287 SdkDescription description = new SdkDescription(paths, analysisOptions); |
321 DartSdk dartSdk = sdkManager.getSdk(description, () { | 288 DartSdk dartSdk = sdkManager.getSdk(description, () { |
322 if (extFilePaths.isNotEmpty) { | 289 if (extFilePaths.isNotEmpty) { |
323 embedderSdk.addExtensions(extFinder.urlMappings); | 290 embedderSdk.addExtensions(extFinder.urlMappings); |
324 } | 291 } |
325 embedderSdk.analysisOptions = options; | 292 embedderSdk.analysisOptions = analysisOptions; |
326 embedderSdk.useSummary = sdkManager.canUseSummaries; | 293 embedderSdk.useSummary = sdkManager.canUseSummaries; |
327 return embedderSdk; | 294 return embedderSdk; |
328 }); | 295 }); |
329 return dartSdk; | 296 return dartSdk; |
330 } else if (extFilePaths != null && extFilePaths.isNotEmpty) { | 297 } else if (extFilePaths != null && extFilePaths.isNotEmpty) { |
331 // | 298 // |
332 // We have an extension file, but no embedder file. | 299 // We have an extension file, but no embedder file. |
333 // | 300 // |
334 String sdkPath = sdkManager.defaultSdkDirectory; | 301 String sdkPath = sdkManager.defaultSdkDirectory; |
335 List<String> paths = <String>[sdkPath]; | 302 List<String> paths = <String>[sdkPath]; |
336 paths.addAll(extFilePaths); | 303 paths.addAll(extFilePaths); |
337 SdkDescription description = new SdkDescription(paths, options); | 304 SdkDescription description = new SdkDescription(paths, analysisOptions); |
338 return sdkManager.getSdk(description, () { | 305 return sdkManager.getSdk(description, () { |
339 FolderBasedDartSdk sdk = new FolderBasedDartSdk( | 306 FolderBasedDartSdk sdk = new FolderBasedDartSdk( |
340 resourceProvider, resourceProvider.getFolder(sdkPath)); | 307 resourceProvider, resourceProvider.getFolder(sdkPath)); |
341 if (extFilePaths.isNotEmpty) { | 308 if (extFilePaths.isNotEmpty) { |
342 sdk.addExtensions(extFinder.urlMappings); | 309 sdk.addExtensions(extFinder.urlMappings); |
343 } | 310 } |
344 sdk.analysisOptions = options; | 311 sdk.analysisOptions = analysisOptions; |
345 sdk.useSummary = sdkManager.canUseSummaries; | 312 sdk.useSummary = sdkManager.canUseSummaries; |
346 return sdk; | 313 return sdk; |
347 }); | 314 }); |
348 } | 315 } |
349 } | 316 } |
350 String sdkPath = sdkManager.defaultSdkDirectory; | 317 String sdkPath = sdkManager.defaultSdkDirectory; |
351 SdkDescription description = new SdkDescription(<String>[sdkPath], options); | 318 SdkDescription description = |
| 319 new SdkDescription(<String>[sdkPath], analysisOptions); |
352 return sdkManager.getSdk(description, () { | 320 return sdkManager.getSdk(description, () { |
353 FolderBasedDartSdk sdk = new FolderBasedDartSdk(resourceProvider, | 321 FolderBasedDartSdk sdk = new FolderBasedDartSdk(resourceProvider, |
354 resourceProvider.getFolder(sdkPath), options.strongMode); | 322 resourceProvider.getFolder(sdkPath), analysisOptions.strongMode); |
355 sdk.analysisOptions = options; | 323 sdk.analysisOptions = analysisOptions; |
356 sdk.useSummary = sdkManager.canUseSummaries; | 324 sdk.useSummary = sdkManager.canUseSummaries; |
357 return sdk; | 325 return sdk; |
358 }); | 326 }); |
359 } | 327 } |
360 | 328 |
361 /** | 329 /** |
362 * Return the analysis options that should be used when the given [context] is | 330 * Return the analysis options that should be used when the given [context] is |
363 * used to analyze code in the directory with the given [path]. | 331 * used to analyze code in the directory with the given [path]. |
364 */ | 332 */ |
365 AnalysisOptions getAnalysisOptions(AnalysisContext context, String path) { | 333 AnalysisOptions getAnalysisOptions(AnalysisContext context, String path) { |
(...skipping 13 matching lines...) Expand all Loading... |
379 } | 347 } |
380 } | 348 } |
381 return options; | 349 return options; |
382 } | 350 } |
383 | 351 |
384 /** | 352 /** |
385 * Return the analysis options file that should be used when analyzing code in | 353 * Return the analysis options file that should be used when analyzing code in |
386 * the directory with the given [path]. | 354 * the directory with the given [path]. |
387 */ | 355 */ |
388 File getOptionsFile(String path) { | 356 File getOptionsFile(String path) { |
389 if (defaultAnalysisOptionsFilePath != null) { | 357 String filePath = builderOptions.defaultAnalysisOptionsFilePath; |
390 return resourceProvider.getFile(defaultAnalysisOptionsFilePath); | 358 if (filePath != null) { |
| 359 return resourceProvider.getFile(filePath); |
391 } | 360 } |
392 Folder root = resourceProvider.getFolder(path); | 361 Folder root = resourceProvider.getFolder(path); |
393 for (Folder folder = root; folder != null; folder = folder.parent) { | 362 for (Folder folder = root; folder != null; folder = folder.parent) { |
394 File file = | 363 File file = |
395 folder.getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_FILE); | 364 folder.getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_FILE); |
396 if (file.exists) { | 365 if (file.exists) { |
397 return file; | 366 return file; |
398 } | 367 } |
399 file = folder | 368 file = folder |
400 .getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE); | 369 .getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 if (packagesCfgFile != null) { | 466 if (packagesCfgFile != null) { |
498 return packagesCfgFile; | 467 return packagesCfgFile; |
499 } | 468 } |
500 parentDir = parentDir.parent; | 469 parentDir = parentDir.parent; |
501 } | 470 } |
502 return null; | 471 return null; |
503 } | 472 } |
504 } | 473 } |
505 | 474 |
506 /** | 475 /** |
| 476 * Options used by a [ContextBuilder]. |
| 477 */ |
| 478 class ContextBuilderOptions { |
| 479 /** |
| 480 * The file path of the file containing the summary of the SDK that should be |
| 481 * used to "analyze" the SDK. This option should only be specified by |
| 482 * command-line tools such as 'dartanalyzer' or 'ddc'. |
| 483 */ |
| 484 String dartSdkSummaryPath; |
| 485 |
| 486 /** |
| 487 * The file path of the analysis options file that should be used in place of |
| 488 * any file in the root directory or a parent of the root directory, or `null` |
| 489 * if the normal lookup mechanism should be used. |
| 490 */ |
| 491 String defaultAnalysisOptionsFilePath; |
| 492 |
| 493 /** |
| 494 * A table mapping variable names to values for the declared variables, or |
| 495 * `null` if no additional variables should be declared. |
| 496 */ |
| 497 Map<String, String> declaredVariables; |
| 498 |
| 499 /** |
| 500 * The default analysis options that should be used unless some or all of them |
| 501 * are overridden in the analysis options file, or `null` if the default |
| 502 * defaults should be used. |
| 503 */ |
| 504 AnalysisOptions defaultOptions; |
| 505 |
| 506 /** |
| 507 * The file path of the .packages file that should be used in place of any |
| 508 * file found using the normal (Package Specification DEP) lookup mechanism, |
| 509 * or `null` if the normal lookup mechanism should be used. |
| 510 */ |
| 511 String defaultPackageFilePath; |
| 512 |
| 513 /** |
| 514 * The file path of the packages directory that should be used in place of any |
| 515 * file found using the normal (Package Specification DEP) lookup mechanism, |
| 516 * or `null` if the normal lookup mechanism should be used. |
| 517 */ |
| 518 String defaultPackagesDirectoryPath; |
| 519 |
| 520 /** |
| 521 * The manager of pub package summaries. |
| 522 */ |
| 523 PubSummaryManager pubSummaryManager; |
| 524 |
| 525 /** |
| 526 * Initialize a newly created set of options |
| 527 */ |
| 528 ContextBuilderOptions(); |
| 529 } |
| 530 |
| 531 /** |
507 * Given a package map, check in each package's lib directory for the existence | 532 * Given a package map, check in each package's lib directory for the existence |
508 * of an `_embedder.yaml` file. If the file contains a top level YamlMap, it | 533 * of an `_embedder.yaml` file. If the file contains a top level YamlMap, it |
509 * will be added to the [embedderYamls] map. | 534 * will be added to the [embedderYamls] map. |
510 */ | 535 */ |
511 class EmbedderYamlLocator { | 536 class EmbedderYamlLocator { |
512 /** | 537 /** |
513 * The name of the embedder files being searched for. | 538 * The name of the embedder files being searched for. |
514 */ | 539 */ |
515 static const String EMBEDDER_FILE_NAME = '_embedder.yaml'; | 540 static const String EMBEDDER_FILE_NAME = '_embedder.yaml'; |
516 | 541 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 String _readEmbedderYaml(Folder libDir) { | 615 String _readEmbedderYaml(Folder libDir) { |
591 File file = libDir.getChild(EMBEDDER_FILE_NAME); | 616 File file = libDir.getChild(EMBEDDER_FILE_NAME); |
592 try { | 617 try { |
593 return file.readAsStringSync(); | 618 return file.readAsStringSync(); |
594 } on FileSystemException { | 619 } on FileSystemException { |
595 // File can't be read. | 620 // File can't be read. |
596 return null; | 621 return null; |
597 } | 622 } |
598 } | 623 } |
599 } | 624 } |
OLD | NEW |