| Index: pkg/analyzer/lib/source/error_processor.dart
|
| diff --git a/pkg/analyzer/lib/source/error_processor.dart b/pkg/analyzer/lib/source/error_processor.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b20716a4a5ee7188865e21218365450499d60aba
|
| --- /dev/null
|
| +++ b/pkg/analyzer/lib/source/error_processor.dart
|
| @@ -0,0 +1,105 @@
|
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +library analyzer.source.error_processor;
|
| +
|
| +import 'package:analyzer/src/generated/engine.dart';
|
| +import 'package:analyzer/src/generated/error.dart';
|
| +import 'package:analyzer/src/generated/utilities_general.dart';
|
| +import 'package:analyzer/src/task/options.dart';
|
| +import 'package:yaml/yaml.dart';
|
| +
|
| +/// Error processor configuration derived from analysis (or embedder) options.
|
| +class ErrorConfig {
|
| + /// The processors in this config.
|
| + final List<ErrorProcessor> processors = <ErrorProcessor>[];
|
| +
|
| + /// Create an error config for the given error code map.
|
| + /// For example:
|
| + /// new ErrorConfig({'missing_return' : 'error'});
|
| + /// will create a processor config that turns `missing_return` hints into
|
| + /// errors.
|
| + ErrorConfig(Object codeMap) {
|
| + _processMap(codeMap);
|
| + }
|
| +
|
| + void _process(String code, Object action) {
|
| + action = toLowerCase(action);
|
| + code = toUpperCase(code);
|
| + if (AnalyzerOptions.ignoreSynonyms.contains(action)) {
|
| + processors.add(new ErrorProcessor.ignore(code));
|
| + } else {
|
| + ErrorSeverity severity = _toSeverity(action);
|
| + if (severity != null) {
|
| + processors.add(new ErrorProcessor(code, severity));
|
| + }
|
| + }
|
| + }
|
| +
|
| + void _processMap(Object codes) {
|
| + if (codes is YamlMap) {
|
| + // TODO(pq): stop traversing nodes and unify w/ standard map handling
|
| + codes.nodes.forEach((k, v) {
|
| + if (k is YamlScalar && v is YamlScalar) {
|
| + _process(k.value, v.value);
|
| + }
|
| + });
|
| + } else if (codes is Map) {
|
| + codes.forEach((k, v) {
|
| + if (k is String) {
|
| + _process(k, v);
|
| + }
|
| + });
|
| + }
|
| + }
|
| +
|
| + ErrorSeverity _toSeverity(String severity) {
|
| + switch (severity) {
|
| + case 'error':
|
| + return ErrorSeverity.ERROR;
|
| + case 'info':
|
| + return ErrorSeverity.INFO;
|
| + case 'warning':
|
| + return ErrorSeverity.WARNING;
|
| + }
|
| + return null;
|
| + }
|
| +
|
| +}
|
| +
|
| +/// Process errors by filtering or changing associated [ErrorSeverity].
|
| +class ErrorProcessor {
|
| + /// The code name of the associated error.
|
| + final String code;
|
| +
|
| + /// The desired severity of the processed error.
|
| + ///
|
| + /// If `null`, this processor will "filter" the associated error code.
|
| + final ErrorSeverity severity;
|
| +
|
| + /// Create an error processor that assigns errors with this [code] the
|
| + /// given [severity].
|
| + ///
|
| + /// If [severity] is `null`, matching errors will be filtered.
|
| + ErrorProcessor(this.code, [this.severity]);
|
| +
|
| + /// Create an error processor that ignores the given error by [code].
|
| + factory ErrorProcessor.ignore(String code) => new ErrorProcessor(code);
|
| +
|
| + /// Check if this processor applies to the given [error].
|
| + bool appliesTo(AnalysisError error) => code == error.errorCode.name;
|
| +
|
| + /// Return an error processor associated with this [context] for the given
|
| + /// [error], or `null` if none is found.
|
| + static ErrorProcessor getProcessor(
|
| + AnalysisContext context, AnalysisError error) {
|
| + if (context == null) {
|
| + return null;
|
| + }
|
| + List<ErrorProcessor> processors =
|
| + context.getConfigurationData(CONFIGURED_ERROR_PROCESSORS);
|
| + return processors.firstWhere((ErrorProcessor p) => p.appliesTo(error),
|
| + orElse: () => null);
|
| + }
|
| +}
|
|
|