// 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';

/// Defines style and best practice recommendations.
///
/// Unlike [HintCode]s, which are akin to traditional static warnings from a
/// compiler, lint recommendations focus on matters of style and practices that
/// might aggregated to define a project's style guide.
class LintCode extends ErrorCode {
  const LintCode(
    String name,
    String message, {
    String? correction,
    String? uniqueName,
  }) : super(
          correction: correction,
          message: message,
          name: name,
          uniqueName: uniqueName ?? 'LintCode.$name',
        );

  @override
  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;

  @override
  int get hashCode => uniqueName.hashCode;

  @override
  ErrorType get type => ErrorType.LINT;

  @override
  String get url => 'https://dart-lang.github.io/linter/lints/$name.html';

  @override
  bool operator ==(Object other) =>
      other is LintCode && uniqueName == other.uniqueName;
}

@Deprecated('Use SecurityLintCode and its uniqueName')
class LintCodeWithUniqueName extends LintCode {
  const LintCodeWithUniqueName(String name, String uniqueName, String message,
      {String? correction})
      : super(name, message, uniqueName: uniqueName, correction: correction);
}

/// Defines security-related best practice recommendations.
///
/// The primary difference from [LintCode]s is that these codes cannot be
/// suppressed with `// ignore:` or `// ignore_for_file:` comments.
class SecurityLintCode extends LintCode {
  const SecurityLintCode(String name, String message,
      {String? uniqueName, String? correction})
      : super(name, message,
            uniqueName: uniqueName ?? 'LintCode.$name', correction: correction);

  @override
  bool get isIgnorable => false;
}

@Deprecated('Use SecurityLintCode and its uniqueName')
class SecurityLintCodeWithUniqueName extends SecurityLintCode {
  const SecurityLintCodeWithUniqueName(
      String name, String uniqueName, String message,
      {String? correction})
      : super(name, message, uniqueName: uniqueName, correction: correction);
}
