blob: adb5c825d4f9f6ed8420d836755e46dc7f74542f [file] [log] [blame]
// 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.
/// @docImport 'package:analyzer/src/error/codes.dart';
/// @docImport 'package:analyzer/analysis_rule/analysis_rule.dart';
library;
import 'package:_fe_analyzer_shared/src/base/analyzer_public_api.dart';
import 'package:_fe_analyzer_shared/src/base/errors.dart';
export 'package:_fe_analyzer_shared/src/base/errors.dart'
show
DiagnosticWithArguments,
DiagnosticWithoutArguments,
ExpectedType,
LocatableDiagnostic,
LocatableDiagnosticImpl;
/// Diagnostic codes which are not reported by default.
///
/// Lint codes are only reported when a lint rule (either a first-party lint
/// rule, or one declared in an analyzer plugin) is enabled.
@AnalyzerPublicApi(message: 'exported by lib/error/error.dart')
class LintCode extends DiagnosticCode {
@override
final DiagnosticSeverity severity;
/// Initializes a lint code.
///
/// The [name] is a "snake_case" name for the reported diagnostic.
///
/// The [problemMessage] is a concise, human-readable message indicating
/// the problematic behavior.
///
/// The [correctionMessage], if given, is a concise, human-readable message
/// indicating one or two possible corrections.
///
/// The [problemMessage] and [correctionMessage] text is printed with a
/// reported diagnostics. For example, `dart analyze` and `flutter analyze`
/// will print the [problemMessage] with each diagnostic. The [problemMessage]
/// and [correctionMessage] area each printed in an IDE's "problems" panel
/// with each diagnostic.
///
/// The [problemMessage] and [correctionMessage] text can contain
/// interpolation placeholders, in the form of `{0}`, `{1}`, etc. When a
/// diagnostic for this LintCode is produced (for example with
/// [AnalysisRule.reportAtNode]) with arguments, they are interpolated into
/// the [problemMessage] and [correctionMessage]. If present, the first
/// argument (at position 0) replaces each instance of `{0}`, the second
/// argument (at position 1) replaces each instance of `{1}`, etc.
// TODO(srawlins): Add a 'url' parameter for plugin authors.
// TODO(srawlins): Document `uniqueName` and `severity`.
const LintCode(
String name,
String problemMessage, {
super.correctionMessage,
@Deprecated('To be removed without replacement') super.hasPublishedDocs,
String? uniqueName,
this.severity = DiagnosticSeverity.INFO,
}) : super(
problemMessage: problemMessage,
name: name,
uniqueName: uniqueName ?? 'LintCode.$name',
);
@override
int get hashCode => uniqueName.hashCode;
@override
DiagnosticType get type => DiagnosticType.LINT;
@override
String? get url => null;
@override
bool operator ==(Object other) =>
other is LintCode && uniqueName == other.uniqueName;
}
/// Private subtype of [LintCode] that supports runtime checking of parameter
/// types.
abstract class LintCodeWithExpectedTypes extends DiagnosticCodeWithExpectedTypes
implements LintCode {
const LintCodeWithExpectedTypes({
required super.name,
required super.problemMessage,
super.correctionMessage,
super.hasPublishedDocs,
required super.uniqueName,
required super.expectedTypes,
}) : super(type: DiagnosticType.LINT);
@override
int get hashCode => uniqueName.hashCode;
@override
String? get url => null;
@override
bool operator ==(Object other) =>
other is LintCode && uniqueName == other.uniqueName;
}
/// 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 DiagnosticCodeImpl implements LintCode {
const SecurityLintCode(
String name,
String problemMessage, {
String? uniqueName,
super.correctionMessage,
}) : super(
name: name,
problemMessage: problemMessage,
type: DiagnosticType.LINT,
uniqueName: uniqueName ?? 'LintCode.$name',
);
@override
bool get isIgnorable => false;
}