migrate: internal.rs
This commit is contained in:
parent
5ffaae758e
commit
0b19227524
3 changed files with 99 additions and 76 deletions
|
@ -83,6 +83,8 @@ lint_diag_out_of_impl =
|
||||||
|
|
||||||
lint_untranslatable_diag = diagnostics should be created using translatable messages
|
lint_untranslatable_diag = diagnostics should be created using translatable messages
|
||||||
|
|
||||||
|
lint_bad_opt_access = {$msg}
|
||||||
|
|
||||||
lint_cstring_ptr = getting the inner pointer of a temporary `CString`
|
lint_cstring_ptr = getting the inner pointer of a temporary `CString`
|
||||||
.as_ptr_label = this pointer will be invalid
|
.as_ptr_label = this pointer will be invalid
|
||||||
.unwrap_label = this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
.unwrap_label = this `CString` is deallocated at the end of the statement, bind it to a variable to extend its lifetime
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
//! Some lints that are only useful in the compiler or crates that use compiler internals, such as
|
//! Some lints that are only useful in the compiler or crates that use compiler internals, such as
|
||||||
//! Clippy.
|
//! Clippy.
|
||||||
|
|
||||||
|
#![deny(rustc::untranslatable_diagnostic)]
|
||||||
|
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||||
|
use crate::lints::{
|
||||||
|
BadOptAccessDiag, DefaultHashTypesDiag, DiagOutOfImpl, LintPassByHand, NonExistantDocKeyword,
|
||||||
|
QueryInstability, TyQualified, TykindDiag, TykindKind, UntranslatableDiag,
|
||||||
|
};
|
||||||
use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
|
use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_errors::{fluent, Applicability};
|
|
||||||
use rustc_hir::def::Res;
|
use rustc_hir::def::Res;
|
||||||
use rustc_hir::{def_id::DefId, Expr, ExprKind, GenericArg, PatKind, Path, PathSegment, QPath};
|
use rustc_hir::{def_id::DefId, Expr, ExprKind, GenericArg, PatKind, Path, PathSegment, QPath};
|
||||||
use rustc_hir::{HirId, Impl, Item, ItemKind, Node, Pat, Ty, TyKind};
|
use rustc_hir::{HirId, Impl, Item, ItemKind, Node, Pat, Ty, TyKind};
|
||||||
|
@ -29,20 +34,15 @@ impl LateLintPass<'_> for DefaultHashTypes {
|
||||||
// don't lint imports, only actual usages
|
// don't lint imports, only actual usages
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let replace = match cx.tcx.get_diagnostic_name(def_id) {
|
let preferred = match cx.tcx.get_diagnostic_name(def_id) {
|
||||||
Some(sym::HashMap) => "FxHashMap",
|
Some(sym::HashMap) => "FxHashMap",
|
||||||
Some(sym::HashSet) => "FxHashSet",
|
Some(sym::HashSet) => "FxHashSet",
|
||||||
_ => return,
|
_ => return,
|
||||||
};
|
};
|
||||||
cx.struct_span_lint(
|
cx.emit_spanned_lint(
|
||||||
DEFAULT_HASH_TYPES,
|
DEFAULT_HASH_TYPES,
|
||||||
path.span,
|
path.span,
|
||||||
fluent::lint_default_hash_types,
|
DefaultHashTypesDiag { preferred, used: cx.tcx.item_name(def_id) },
|
||||||
|lint| {
|
|
||||||
lint.set_arg("preferred", replace)
|
|
||||||
.set_arg("used", cx.tcx.item_name(def_id))
|
|
||||||
.note(fluent::note)
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,12 +83,11 @@ impl LateLintPass<'_> for QueryStability {
|
||||||
if let Ok(Some(instance)) = ty::Instance::resolve(cx.tcx, cx.param_env, def_id, substs) {
|
if let Ok(Some(instance)) = ty::Instance::resolve(cx.tcx, cx.param_env, def_id, substs) {
|
||||||
let def_id = instance.def_id();
|
let def_id = instance.def_id();
|
||||||
if cx.tcx.has_attr(def_id, sym::rustc_lint_query_instability) {
|
if cx.tcx.has_attr(def_id, sym::rustc_lint_query_instability) {
|
||||||
cx.struct_span_lint(
|
cx.emit_spanned_lint(
|
||||||
POTENTIAL_QUERY_INSTABILITY,
|
POTENTIAL_QUERY_INSTABILITY,
|
||||||
span,
|
span,
|
||||||
fluent::lint_query_instability,
|
QueryInstability { query: cx.tcx.item_name(def_id) },
|
||||||
|lint| lint.set_arg("query", cx.tcx.item_name(def_id)).note(fluent::note),
|
);
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,14 +125,8 @@ impl<'tcx> LateLintPass<'tcx> for TyTyKind {
|
||||||
let span = path.span.with_hi(
|
let span = path.span.with_hi(
|
||||||
segment.args.map_or(segment.ident.span, |a| a.span_ext).hi()
|
segment.args.map_or(segment.ident.span, |a| a.span_ext).hi()
|
||||||
);
|
);
|
||||||
cx.struct_span_lint(USAGE_OF_TY_TYKIND, path.span, fluent::lint_tykind_kind, |lint| {
|
cx.emit_spanned_lint(USAGE_OF_TY_TYKIND, path.span, TykindKind {
|
||||||
lint
|
suggestion: span,
|
||||||
.span_suggestion(
|
|
||||||
span,
|
|
||||||
fluent::suggestion,
|
|
||||||
"ty",
|
|
||||||
Applicability::MaybeIncorrect, // ty maybe needs an import
|
|
||||||
)
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,39 +183,17 @@ impl<'tcx> LateLintPass<'tcx> for TyTyKind {
|
||||||
|
|
||||||
match span {
|
match span {
|
||||||
Some(span) => {
|
Some(span) => {
|
||||||
cx.struct_span_lint(
|
cx.emit_spanned_lint(USAGE_OF_TY_TYKIND, path.span, TykindKind {
|
||||||
USAGE_OF_TY_TYKIND,
|
suggestion: span,
|
||||||
path.span,
|
});
|
||||||
fluent::lint_tykind_kind,
|
|
||||||
|lint| lint.span_suggestion(
|
|
||||||
span,
|
|
||||||
fluent::suggestion,
|
|
||||||
"ty",
|
|
||||||
Applicability::MaybeIncorrect, // ty maybe needs an import
|
|
||||||
)
|
|
||||||
)
|
|
||||||
},
|
},
|
||||||
None => cx.struct_span_lint(
|
None => cx.emit_spanned_lint(USAGE_OF_TY_TYKIND, path.span, TykindDiag),
|
||||||
USAGE_OF_TY_TYKIND,
|
|
||||||
path.span,
|
|
||||||
fluent::lint_tykind,
|
|
||||||
|lint| lint.help(fluent::help)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else if !ty.span.from_expansion() && let Some(t) = is_ty_or_ty_ctxt(cx, &path) {
|
|
||||||
if path.segments.len() > 1 {
|
|
||||||
cx.struct_span_lint(USAGE_OF_QUALIFIED_TY, path.span, fluent::lint_ty_qualified, |lint| {
|
|
||||||
lint
|
|
||||||
.set_arg("ty", t.clone())
|
|
||||||
.span_suggestion(
|
|
||||||
path.span,
|
|
||||||
fluent::suggestion,
|
|
||||||
t,
|
|
||||||
// The import probably needs to be changed
|
|
||||||
Applicability::MaybeIncorrect,
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
} else if !ty.span.from_expansion() && path.segments.len() > 1 && let Some(t) = is_ty_or_ty_ctxt(cx, &path) {
|
||||||
|
cx.emit_spanned_lint(USAGE_OF_QUALIFIED_TY, path.span, TyQualified {
|
||||||
|
ty: t.clone(),
|
||||||
|
suggestion: path.span,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -303,12 +274,11 @@ impl EarlyLintPass for LintPassImpl {
|
||||||
&& call_site.ctxt().outer_expn_data().kind
|
&& call_site.ctxt().outer_expn_data().kind
|
||||||
!= ExpnKind::Macro(MacroKind::Bang, sym::declare_lint_pass)
|
!= ExpnKind::Macro(MacroKind::Bang, sym::declare_lint_pass)
|
||||||
{
|
{
|
||||||
cx.struct_span_lint(
|
cx.emit_spanned_lint(
|
||||||
LINT_PASS_IMPL_WITHOUT_MACRO,
|
LINT_PASS_IMPL_WITHOUT_MACRO,
|
||||||
lint_pass.path.span,
|
lint_pass.path.span,
|
||||||
fluent::lint_lintpass_by_hand,
|
LintPassByHand,
|
||||||
|lint| lint.help(fluent::help),
|
);
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -338,17 +308,16 @@ impl<'tcx> LateLintPass<'tcx> for ExistingDocKeyword {
|
||||||
if let Some(list) = attr.meta_item_list() {
|
if let Some(list) = attr.meta_item_list() {
|
||||||
for nested in list {
|
for nested in list {
|
||||||
if nested.has_name(sym::keyword) {
|
if nested.has_name(sym::keyword) {
|
||||||
let v = nested
|
let keyword = nested
|
||||||
.value_str()
|
.value_str()
|
||||||
.expect("#[doc(keyword = \"...\")] expected a value!");
|
.expect("#[doc(keyword = \"...\")] expected a value!");
|
||||||
if is_doc_keyword(v) {
|
if is_doc_keyword(keyword) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cx.struct_span_lint(
|
cx.emit_spanned_lint(
|
||||||
EXISTING_DOC_KEYWORD,
|
EXISTING_DOC_KEYWORD,
|
||||||
attr.span,
|
attr.span,
|
||||||
fluent::lint_non_existant_doc_keyword,
|
NonExistantDocKeyword { keyword },
|
||||||
|lint| lint.set_arg("keyword", v).help(fluent::help),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -407,12 +376,7 @@ impl LateLintPass<'_> for Diagnostics {
|
||||||
}
|
}
|
||||||
debug!(?found_impl);
|
debug!(?found_impl);
|
||||||
if !found_parent_with_attr && !found_impl {
|
if !found_parent_with_attr && !found_impl {
|
||||||
cx.struct_span_lint(
|
cx.emit_spanned_lint(DIAGNOSTIC_OUTSIDE_OF_IMPL, span, DiagOutOfImpl);
|
||||||
DIAGNOSTIC_OUTSIDE_OF_IMPL,
|
|
||||||
span,
|
|
||||||
fluent::lint_diag_out_of_impl,
|
|
||||||
|lint| lint,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut found_diagnostic_message = false;
|
let mut found_diagnostic_message = false;
|
||||||
|
@ -428,12 +392,7 @@ impl LateLintPass<'_> for Diagnostics {
|
||||||
}
|
}
|
||||||
debug!(?found_diagnostic_message);
|
debug!(?found_diagnostic_message);
|
||||||
if !found_parent_with_attr && !found_diagnostic_message {
|
if !found_parent_with_attr && !found_diagnostic_message {
|
||||||
cx.struct_span_lint(
|
cx.emit_spanned_lint(UNTRANSLATABLE_DIAGNOSTIC, span, UntranslatableDiag);
|
||||||
UNTRANSLATABLE_DIAGNOSTIC,
|
|
||||||
span,
|
|
||||||
fluent::lint_untranslatable_diag,
|
|
||||||
|lint| lint,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -465,9 +424,9 @@ impl LateLintPass<'_> for BadOptAccess {
|
||||||
let Some(lit) = item.lit() &&
|
let Some(lit) = item.lit() &&
|
||||||
let ast::LitKind::Str(val, _) = lit.kind
|
let ast::LitKind::Str(val, _) = lit.kind
|
||||||
{
|
{
|
||||||
cx.struct_span_lint(BAD_OPT_ACCESS, expr.span, val.as_str(), |lint|
|
cx.emit_spanned_lint(BAD_OPT_ACCESS, expr.span, BadOptAccessDiag {
|
||||||
lint
|
msg: val.as_str(),
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,68 @@ pub struct EnumIntrinsicsMemVariant<'a> {
|
||||||
pub ty_param: Ty<'a>,
|
pub ty_param: Ty<'a>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// internal.rs
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_default_hash_types)]
|
||||||
|
#[note]
|
||||||
|
pub struct DefaultHashTypesDiag<'a> {
|
||||||
|
pub preferred: &'a str,
|
||||||
|
pub used: Symbol,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_query_instability)]
|
||||||
|
#[note]
|
||||||
|
pub struct QueryInstability {
|
||||||
|
pub query: Symbol,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_tykind_kind)]
|
||||||
|
pub struct TykindKind {
|
||||||
|
#[suggestion(code = "ty", applicability = "maybe-incorrect")]
|
||||||
|
pub suggestion: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_tykind)]
|
||||||
|
#[help]
|
||||||
|
pub struct TykindDiag;
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_ty_qualified)]
|
||||||
|
pub struct TyQualified {
|
||||||
|
pub ty: String,
|
||||||
|
#[suggestion(code = "{ty}", applicability = "maybe-incorrect")]
|
||||||
|
pub suggestion: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_lintpass_by_hand)]
|
||||||
|
#[help]
|
||||||
|
pub struct LintPassByHand;
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_non_existant_doc_keyword)]
|
||||||
|
#[help]
|
||||||
|
pub struct NonExistantDocKeyword {
|
||||||
|
pub keyword: Symbol,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_diag_out_of_impl)]
|
||||||
|
pub struct DiagOutOfImpl;
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_untranslatable_diag)]
|
||||||
|
pub struct UntranslatableDiag;
|
||||||
|
|
||||||
|
#[derive(LintDiagnostic)]
|
||||||
|
#[diag(lint_bad_opt_access)]
|
||||||
|
pub struct BadOptAccessDiag<'a> {
|
||||||
|
pub msg: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
// let_underscore.rs
|
// let_underscore.rs
|
||||||
#[derive(LintDiagnostic)]
|
#[derive(LintDiagnostic)]
|
||||||
pub enum NonBindingLet {
|
pub enum NonBindingLet {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue