OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.task.options; | 5 library analyzer.src.task.options; |
6 | 6 |
7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
8 import 'package:analyzer/plugin/options.dart'; | 8 import 'package:analyzer/plugin/options.dart'; |
9 import 'package:analyzer/source/analysis_options_provider.dart'; | 9 import 'package:analyzer/source/analysis_options_provider.dart'; |
10 import 'package:analyzer/src/generated/engine.dart'; | 10 import 'package:analyzer/src/generated/engine.dart'; |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 List<int> lineStarts = StringUtilities.computeLineStarts(content); | 220 List<int> lineStarts = StringUtilities.computeLineStarts(content); |
221 return new LineInfo(lineStarts); | 221 return new LineInfo(lineStarts); |
222 } | 222 } |
223 | 223 |
224 /// Create a task based on the given [target] in the given [context]. | 224 /// Create a task based on the given [target] in the given [context]. |
225 static GenerateOptionsErrorsTask createTask( | 225 static GenerateOptionsErrorsTask createTask( |
226 AnalysisContext context, AnalysisTarget target) => | 226 AnalysisContext context, AnalysisTarget target) => |
227 new GenerateOptionsErrorsTask(context, target); | 227 new GenerateOptionsErrorsTask(context, target); |
228 } | 228 } |
229 | 229 |
230 /// Validates `analyzer` strong-mode value configuration options. | |
231 class StrongModeOptionValueValidator extends OptionsValidator { | |
232 ErrorBuilder trueOrFalseBuilder = new TrueOrFalseValueErrorBuilder(); | |
233 | |
234 @override | |
235 void validate(ErrorReporter reporter, Map<String, YamlNode> options) { | |
236 var analyzer = options[AnalyzerOptions.analyzer]; | |
237 if (analyzer is! YamlMap) { | |
238 return; | |
239 } | |
240 | |
241 var v = analyzer.nodes[AnalyzerOptions.strong_mode]; | |
242 if (v is YamlScalar) { | |
243 var value = toLowerCase(v.value); | |
244 if (!AnalyzerOptions.trueOrFalse.contains(value)) { | |
245 trueOrFalseBuilder.reportError( | |
246 reporter, AnalyzerOptions.strong_mode, v); | |
247 } | |
248 } | |
249 } | |
250 } | |
251 | |
252 /// Validates `analyzer` language configuration options. | 230 /// Validates `analyzer` language configuration options. |
253 class LanguageOptionValidator extends OptionsValidator { | 231 class LanguageOptionValidator extends OptionsValidator { |
254 ErrorBuilder builder = new ErrorBuilder(AnalyzerOptions.languageOptions); | 232 ErrorBuilder builder = new ErrorBuilder(AnalyzerOptions.languageOptions); |
255 ErrorBuilder trueOrFalseBuilder = new TrueOrFalseValueErrorBuilder(); | 233 ErrorBuilder trueOrFalseBuilder = new TrueOrFalseValueErrorBuilder(); |
256 | 234 |
257 @override | 235 @override |
258 void validate(ErrorReporter reporter, Map<String, YamlNode> options) { | 236 void validate(ErrorReporter reporter, Map<String, YamlNode> options) { |
259 var analyzer = options[AnalyzerOptions.analyzer]; | 237 var analyzer = options[AnalyzerOptions.analyzer]; |
260 if (analyzer is! YamlMap) { | 238 if (analyzer is! YamlMap) { |
261 return; | 239 return; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 } | 284 } |
307 | 285 |
308 List<AnalysisError> validate(Map<String, YamlNode> options) { | 286 List<AnalysisError> validate(Map<String, YamlNode> options) { |
309 RecordingErrorListener recorder = new RecordingErrorListener(); | 287 RecordingErrorListener recorder = new RecordingErrorListener(); |
310 ErrorReporter reporter = new ErrorReporter(recorder, source); | 288 ErrorReporter reporter = new ErrorReporter(recorder, source); |
311 _validators.forEach((OptionsValidator v) => v.validate(reporter, options)); | 289 _validators.forEach((OptionsValidator v) => v.validate(reporter, options)); |
312 return recorder.errors; | 290 return recorder.errors; |
313 } | 291 } |
314 } | 292 } |
315 | 293 |
| 294 /// Validates `analyzer` strong-mode value configuration options. |
| 295 class StrongModeOptionValueValidator extends OptionsValidator { |
| 296 ErrorBuilder trueOrFalseBuilder = new TrueOrFalseValueErrorBuilder(); |
| 297 |
| 298 @override |
| 299 void validate(ErrorReporter reporter, Map<String, YamlNode> options) { |
| 300 var analyzer = options[AnalyzerOptions.analyzer]; |
| 301 if (analyzer is! YamlMap) { |
| 302 return; |
| 303 } |
| 304 |
| 305 var v = analyzer.nodes[AnalyzerOptions.strong_mode]; |
| 306 if (v is YamlScalar) { |
| 307 var value = toLowerCase(v.value); |
| 308 if (!AnalyzerOptions.trueOrFalse.contains(value)) { |
| 309 trueOrFalseBuilder.reportError( |
| 310 reporter, AnalyzerOptions.strong_mode, v); |
| 311 } |
| 312 } |
| 313 } |
| 314 } |
| 315 |
316 /// Validates `analyzer` top-level options. | 316 /// Validates `analyzer` top-level options. |
317 class TopLevelAnalyzerOptionsValidator extends TopLevelOptionValidator { | 317 class TopLevelAnalyzerOptionsValidator extends TopLevelOptionValidator { |
318 TopLevelAnalyzerOptionsValidator() | 318 TopLevelAnalyzerOptionsValidator() |
319 : super(AnalyzerOptions.analyzer, AnalyzerOptions.topLevel); | 319 : super(AnalyzerOptions.analyzer, AnalyzerOptions.topLevel); |
320 } | 320 } |
321 | 321 |
322 /// Validates top-level options. For example, | 322 /// Validates top-level options. For example, |
323 /// plugin: | 323 /// plugin: |
324 /// top-level-option: true | 324 /// top-level-option: true |
325 class TopLevelOptionValidator extends OptionsValidator { | 325 class TopLevelOptionValidator extends OptionsValidator { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 AnalysisOptionsWarningCode.UNSUPPORTED_VALUE; | 365 AnalysisOptionsWarningCode.UNSUPPORTED_VALUE; |
366 } | 366 } |
367 | 367 |
368 class _OptionsProcessor { | 368 class _OptionsProcessor { |
369 void configure(AnalysisContext context, Map<String, YamlNode> options) { | 369 void configure(AnalysisContext context, Map<String, YamlNode> options) { |
370 if (options == null) { | 370 if (options == null) { |
371 return; | 371 return; |
372 } | 372 } |
373 | 373 |
374 var analyzer = options[AnalyzerOptions.analyzer]; | 374 var analyzer = options[AnalyzerOptions.analyzer]; |
375 if (analyzer is! YamlMap) { | 375 if (analyzer is! Map) { |
376 return; | 376 return; |
377 } | 377 } |
378 | 378 |
379 // Set strong mode (default is false). | 379 // Set strong mode (default is false). |
380 var strongMode = analyzer[AnalyzerOptions.strong_mode]; | 380 var strongMode = analyzer[AnalyzerOptions.strong_mode]; |
381 setStrongMode(context, strongMode); | 381 setStrongMode(context, strongMode); |
382 | 382 |
383 // Set filters. | 383 // Set filters. |
384 var filters = analyzer[AnalyzerOptions.errors]; | 384 var filters = analyzer[AnalyzerOptions.errors]; |
385 setFilters(context, filters); | 385 setFilters(context, filters); |
(...skipping 16 matching lines...) Expand all Loading... |
402 // Case-insensitive. | 402 // Case-insensitive. |
403 String code = toUpperCase(k.value); | 403 String code = toUpperCase(k.value); |
404 filters.add((AnalysisError error) => error.errorCode.name == code); | 404 filters.add((AnalysisError error) => error.errorCode.name == code); |
405 } | 405 } |
406 } | 406 } |
407 }); | 407 }); |
408 } | 408 } |
409 context.setConfigurationData(CONFIGURED_ERROR_FILTERS, filters); | 409 context.setConfigurationData(CONFIGURED_ERROR_FILTERS, filters); |
410 } | 410 } |
411 | 411 |
| 412 void setLanguageOption( |
| 413 AnalysisContext context, Object feature, Object value) { |
| 414 if (feature == AnalyzerOptions.enableSuperMixins) { |
| 415 if (isTrue(value)) { |
| 416 AnalysisOptionsImpl options = |
| 417 new AnalysisOptionsImpl.from(context.analysisOptions); |
| 418 options.enableSuperMixins = true; |
| 419 context.analysisOptions = options; |
| 420 } |
| 421 } |
| 422 if (feature == AnalyzerOptions.enableGenericMethods) { |
| 423 if (isTrue(value)) { |
| 424 AnalysisOptionsImpl options = |
| 425 new AnalysisOptionsImpl.from(context.analysisOptions); |
| 426 options.enableGenericMethods = true; |
| 427 context.analysisOptions = options; |
| 428 } |
| 429 } |
| 430 } |
| 431 |
412 void setLanguageOptions(AnalysisContext context, Object configs) { | 432 void setLanguageOptions(AnalysisContext context, Object configs) { |
413 if (configs is YamlMap) { | 433 if (configs is YamlMap) { |
414 configs.nodes.forEach((k, v) { | 434 configs.nodes.forEach((k, v) { |
415 String feature; | |
416 if (k is YamlScalar && v is YamlScalar) { | 435 if (k is YamlScalar && v is YamlScalar) { |
417 feature = k.value?.toString(); | 436 String feature = k.value?.toString(); |
418 if (feature == AnalyzerOptions.enableSuperMixins) { | 437 setLanguageOption(context, feature, v.value); |
419 if (isTrue(v.value)) { | |
420 AnalysisOptionsImpl options = | |
421 new AnalysisOptionsImpl.from(context.analysisOptions); | |
422 options.enableSuperMixins = true; | |
423 context.analysisOptions = options; | |
424 } | |
425 } | |
426 if (feature == AnalyzerOptions.enableGenericMethods) { | |
427 if (isTrue(v.value)) { | |
428 AnalysisOptionsImpl options = | |
429 new AnalysisOptionsImpl.from(context.analysisOptions); | |
430 options.enableGenericMethods = true; | |
431 context.analysisOptions = options; | |
432 } | |
433 } | |
434 } | 438 } |
435 }); | 439 }); |
| 440 } else if (configs is Map) { |
| 441 configs.forEach((k, v) => setLanguageOption(context, k, v)); |
436 } | 442 } |
437 } | 443 } |
438 | 444 |
439 void setStrongMode(AnalysisContext context, Object strongMode) { | 445 void setStrongMode(AnalysisContext context, Object strongMode) { |
440 bool strong = strongMode is bool ? strongMode : false; | 446 bool strong = strongMode is bool ? strongMode : false; |
441 if (context.analysisOptions.strongMode != strong) { | 447 if (context.analysisOptions.strongMode != strong) { |
442 AnalysisOptionsImpl options = | 448 AnalysisOptionsImpl options = |
443 new AnalysisOptionsImpl.from(context.analysisOptions); | 449 new AnalysisOptionsImpl.from(context.analysisOptions); |
444 options.strongMode = strong; | 450 options.strongMode = strong; |
445 context.analysisOptions = options; | 451 context.analysisOptions = options; |
446 } | 452 } |
447 } | 453 } |
448 } | 454 } |
OLD | NEW |