// 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' hide AnalysisResult;
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) {
    ErrorProcessor 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) {
  ErrorSeverity 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;
}
