// Copyright (c) 2017, 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.

import 'package:analyzer/error/error.dart';
import 'package:analyzer/source/error_processor.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer_cli/src/options.dart';

/// Compute the severity of the error; however:
/// - if [options.enableTypeChecks] is false, then de-escalate checked-mode
///   compile time errors to a severity of [ErrorSeverity.INFO].
/// - if [options.lintsAreFatal] is true, escalate lints to errors.
ErrorSeverity computeSeverity(
  AnalysisError error,
  CommandLineOptions commandLineOptions,
  AnalysisOptions analysisOptions,
) {
  if (analysisOptions != null) {
    var processor = ErrorProcessor.getProcessor(analysisOptions, error);
    // If there is a processor for this error, defer to it.
    if (processor != null) {
      return processor.severity;
    }
  }

  if (commandLineOptions.lintsAreFatal && error.errorCode is LintCode) {
    return ErrorSeverity.ERROR;
  }

  return error.errorCode.errorSeverity;
}

/// Check various configuration options to get a desired severity for this
/// [error] (or `null` if it's to be suppressed).
ErrorSeverity determineProcessedSeverity(AnalysisError error,
    CommandLineOptions commandLineOptions, AnalysisOptions analysisOptions) {
  var severity = computeSeverity(error, commandLineOptions, analysisOptions);
  // Skip TODOs categorically unless escalated to ERROR or HINT (#26215).
  if (error.errorCode.type == ErrorType.TODO &&
      severity == ErrorSeverity.INFO) {
    return null;
  }

  // TODO(devoncarew): We should not filter hints here.
  // If not overridden, some "natural" severities get globally filtered.
  // Check for global hint filtering.
  if (severity == ErrorSeverity.INFO && commandLineOptions.disableHints) {
    return null;
  }

  return severity;
}
