// Copyright (c) 2014, 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';

/// The error codes used for errors in analysis options files. The convention
/// for this class is for the name of the error code to indicate the problem
/// that caused the error to be generated and for the error message to explain
/// what is wrong and, when appropriate, how the problem can be corrected.
class AnalysisOptionsErrorCode extends ErrorCode {
  /// An error code indicating that there is a syntactic error in the included
  /// file.
  ///
  /// Parameters:
  /// 0: the path of the file containing the error
  /// 1: the starting offset of the text in the file that contains the error
  /// 2: the ending offset of the text in the file that contains the error
  /// 3: the error message
  static const AnalysisOptionsErrorCode INCLUDED_FILE_PARSE_ERROR =
      AnalysisOptionsErrorCode(
          'INCLUDED_FILE_PARSE_ERROR', '{3} in {0}({1}..{2})');

  /// An error code indicating that there is a syntactic error in the file.
  ///
  /// Parameters:
  /// 0: the error message from the parse error
  static const AnalysisOptionsErrorCode PARSE_ERROR =
      AnalysisOptionsErrorCode('PARSE_ERROR', '{0}');

  /// Initialize a newly created error code to have the given [name].
  const AnalysisOptionsErrorCode(String name, String message,
      {String correction})
      : super.temporary(name, message, correction: correction);

  @override
  ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;

  @override
  ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
}

class AnalysisOptionsHintCode extends ErrorCode {
  /// An error code indicating the analysis options file name is deprecated and
  /// the file should be renamed.
  ///
  /// Parameters:
  /// 0: the uri of the file which should be renamed
  static const AnalysisOptionsHintCode DEPRECATED_ANALYSIS_OPTIONS_FILE_NAME =
      AnalysisOptionsHintCode(
          'DEPRECATED_ANALYSIS_OPTIONS_FILE_NAME',
          "The name of the analysis options file {0} is deprecated;"
              " consider renaming it to analysis_options.yaml.");

  /// An error code indicating that the enablePreviewDart2 setting is
  /// deprecated.
  static const AnalysisOptionsHintCode PREVIEW_DART_2_SETTING_DEPRECATED =
      AnalysisOptionsHintCode('PREVIEW_DART_2_SETTING_DEPRECATED',
          "The 'enablePreviewDart2' setting is deprecated.",
          correction: "It is no longer necessary to explicitly enable Dart 2.");

  /// An error code indicating that strong-mode: true is deprecated.
  static const AnalysisOptionsHintCode STRONG_MODE_SETTING_DEPRECATED =
      AnalysisOptionsHintCode('STRONG_MODE_SETTING_DEPRECATED',
          "The 'strong-mode: true' setting is deprecated.",
          correction:
              "It is no longer necessary to explicitly enable strong mode.");

  /// An error code indicating that the enablePreviewDart2 setting is
  /// deprecated.
  static const AnalysisOptionsHintCode SUPER_MIXINS_SETTING_DEPRECATED =
      AnalysisOptionsHintCode('SUPER_MIXINS_SETTING_DEPRECATED',
          "The 'enableSuperMixins' setting is deprecated.",
          correction:
              "Support has been added to the language for 'mixin' based "
              'mixins.');

  /// Initialize a newly created hint code to have the given [name].
  const AnalysisOptionsHintCode(String name, String message,
      {String correction})
      : super.temporary(name, message, correction: correction);

  @override
  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;

  @override
  ErrorType get type => ErrorType.HINT;
}

/// The error codes used for warnings in analysis options files. The convention
/// for this class is for the name of the error code to indicate the problem
/// that caused the error to be generated and for the error message to explain
/// what is wrong and, when appropriate, how the problem can be corrected.
class AnalysisOptionsWarningCode extends ErrorCode {
  /// An error code indicating that the given option is deprecated.
  static const AnalysisOptionsWarningCode ANALYSIS_OPTION_DEPRECATED =
      AnalysisOptionsWarningCode('ANALYSIS_OPTION_DEPRECATED',
          "The option '{0}' is no longer supported.");

  /// An error code indicating a specified include file could not be found.
  ///
  /// Parameters:
  /// 0: the uri of the file to be included
  /// 1: the path of the file containing the include directive
  static const AnalysisOptionsWarningCode INCLUDE_FILE_NOT_FOUND =
      AnalysisOptionsWarningCode('INCLUDE_FILE_NOT_FOUND',
          "The include file {0} in {1} cannot be found.");

  /// An error code indicating a specified include file has a warning.
  ///
  /// Parameters:
  /// 0: the path of the file containing the warnings
  /// 1: the starting offset of the text in the file that contains the warning
  /// 2: the ending offset of the text in the file that contains the warning
  /// 3: the warning message
  static const AnalysisOptionsWarningCode INCLUDED_FILE_WARNING =
      AnalysisOptionsWarningCode('INCLUDED_FILE_WARNING',
          "Warning in the included options file {0}({1}..{2}): {3}");

  /// An error code indicating that a plugin is being configured with an invalid
  /// value for an option and a detail message is provided.
  static const AnalysisOptionsWarningCode INVALID_OPTION =
      AnalysisOptionsWarningCode(
          'INVALID_OPTION', "Invalid option specified for '{0}': {1}");

  /// An error code indicating an invalid format for an options file section.
  ///
  /// Parameters:
  /// 0: the section name
  static const AnalysisOptionsWarningCode INVALID_SECTION_FORMAT =
      AnalysisOptionsWarningCode(
          'INVALID_SECTION_FORMAT', "Invalid format for the '{0}' section.");

  /// An error code indicating that strong-mode: false is has been removed.
  static const AnalysisOptionsWarningCode SPEC_MODE_REMOVED =
      AnalysisOptionsWarningCode('SPEC_MODE_REMOVED',
          "The option 'strong-mode: false' is no longer supported.",
          correction:
              "It's recommended to remove the 'strong-mode:' setting (and make "
              "your code Dart 2 compliant).");

  /// An error code indicating that an unrecognized error code is being used to
  /// specify an error filter.
  ///
  /// Parameters:
  /// 0: the unrecognized error code
  static const AnalysisOptionsWarningCode UNRECOGNIZED_ERROR_CODE =
      AnalysisOptionsWarningCode(
          'UNRECOGNIZED_ERROR_CODE', "'{0}' isn't a recognized error code.");

  /// An error code indicating that a plugin is being configured with an
  /// unsupported option where there is just one legal value.
  ///
  /// Parameters:
  /// 0: the plugin name
  /// 1: the unsupported option key
  /// 2: the legal value
  static const AnalysisOptionsWarningCode UNSUPPORTED_OPTION_WITH_LEGAL_VALUE =
      AnalysisOptionsWarningCode(
          'UNSUPPORTED_OPTION_WITH_LEGAL_VALUE',
          "The option '{1}' isn't supported by '{0}'. "
              "Try using the only supported option: '{2}'.");

  /// An error code indicating that a plugin is being configured with an
  /// unsupported option and legal options are provided.
  ///
  /// Parameters:
  /// 0: the plugin name
  /// 1: the unsupported option key
  /// 2: legal values
  static const AnalysisOptionsWarningCode UNSUPPORTED_OPTION_WITH_LEGAL_VALUES =
      AnalysisOptionsWarningCode('UNSUPPORTED_OPTION_WITH_LEGAL_VALUES',
          "The option '{1}' isn't supported by '{0}'.",
          correction: "Try using one of the supported options: {2}.");

  /// An error code indicating that a plugin is being configured with an
  /// unsupported option and legal options are provided.
  ///
  /// Parameters:
  /// 0: the plugin name
  /// 1: the unsupported option key
  static const AnalysisOptionsWarningCode UNSUPPORTED_OPTION_WITHOUT_VALUES =
      AnalysisOptionsWarningCode(
    'UNSUPPORTED_OPTION_WITHOUT_VALUES',
    "The option '{1}' isn't supported by '{0}'.",
  );

  /// An error code indicating that an option entry is being configured with an
  /// unsupported value.
  ///
  /// Parameters:
  /// 0: the option name
  /// 1: the unsupported value
  /// 2: legal values
  static const AnalysisOptionsWarningCode UNSUPPORTED_VALUE =
      AnalysisOptionsWarningCode(
          'UNSUPPORTED_VALUE', "The value '{1}' isn't supported by '{0}'.",
          correction: "Try using one of the supported options: {2}.");

  /// Initialize a newly created warning code to have the given [name].
  const AnalysisOptionsWarningCode(String name, String message,
      {String correction})
      : super.temporary(name, message, correction: correction);

  @override
  ErrorSeverity get errorSeverity => ErrorSeverity.WARNING;

  @override
  ErrorType get type => ErrorType.STATIC_WARNING;
}
