mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-30 14:01:51 +00:00
Add `on_unimplemented" typo suggestions
This commit is contained in:
parent
ac385a5af6
commit
18d7411719
@ -347,5 +347,13 @@ pub(super) fn builtin(sess: &Session, diagnostic: BuiltinLintDiag, diag: &mut Di
|
||||
"reduce the glob import's visibility or increase visibility of imported items",
|
||||
);
|
||||
}
|
||||
BuiltinLintDiag::MaybeTypo { span, name } => {
|
||||
diag.span_suggestion_verbose(
|
||||
span,
|
||||
"an attribute with a similar name exists",
|
||||
name,
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -663,6 +663,10 @@ pub enum BuiltinLintDiag {
|
||||
span: Span,
|
||||
max_vis: String,
|
||||
},
|
||||
MaybeTypo {
|
||||
span: Span,
|
||||
name: Symbol,
|
||||
},
|
||||
}
|
||||
|
||||
/// Lints that are buffered up early on in the `Session` before the
|
||||
|
@ -29,6 +29,7 @@ use rustc_session::lint::builtin::{LEGACY_DERIVE_HELPERS, SOFT_UNSTABLE};
|
||||
use rustc_session::lint::builtin::{UNUSED_MACROS, UNUSED_MACRO_RULES};
|
||||
use rustc_session::lint::BuiltinLintDiag;
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::edit_distance::edit_distance;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::hygiene::{self, ExpnData, ExpnKind, LocalExpnId};
|
||||
use rustc_span::hygiene::{AstPass, MacroKind};
|
||||
@ -568,15 +569,24 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||
}
|
||||
|
||||
if res == Res::NonMacroAttr(NonMacroAttrKind::Tool)
|
||||
&& path.segments.len() >= 2
|
||||
&& path.segments[0].ident.name == sym::diagnostic
|
||||
&& path.segments[1].ident.name != sym::on_unimplemented
|
||||
&& let [namespace, attribute, ..] = &*path.segments
|
||||
&& namespace.ident.name == sym::diagnostic
|
||||
&& attribute.ident.name != sym::on_unimplemented
|
||||
{
|
||||
self.tcx.sess.psess.buffer_lint(
|
||||
let distance =
|
||||
edit_distance(attribute.ident.name.as_str(), sym::on_unimplemented.as_str(), 5);
|
||||
|
||||
let help = if distance.is_some() {
|
||||
BuiltinLintDiag::MaybeTypo { span: attribute.span(), name: sym::on_unimplemented }
|
||||
} else {
|
||||
BuiltinLintDiag::Normal
|
||||
};
|
||||
self.tcx.sess.psess.buffer_lint_with_diagnostic(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
path.segments[1].span(),
|
||||
attribute.span(),
|
||||
node_id,
|
||||
"unknown diagnostic attribute",
|
||||
help,
|
||||
);
|
||||
}
|
||||
|
||||
|
18
tests/ui/diagnostic_namespace/suggest_typos.rs
Normal file
18
tests/ui/diagnostic_namespace/suggest_typos.rs
Normal file
@ -0,0 +1,18 @@
|
||||
#![deny(unknown_or_malformed_diagnostic_attributes)]
|
||||
|
||||
#[diagnostic::onunimplemented]
|
||||
//~^ERROR unknown diagnostic attribute
|
||||
//~^^HELP an attribute with a similar name exists
|
||||
trait X{}
|
||||
|
||||
#[diagnostic::un_onimplemented]
|
||||
//~^ERROR unknown diagnostic attribute
|
||||
//~^^HELP an attribute with a similar name exists
|
||||
trait Y{}
|
||||
|
||||
#[diagnostic::on_implemented]
|
||||
//~^ERROR unknown diagnostic attribute
|
||||
//~^^HELP an attribute with a similar name exists
|
||||
trait Z{}
|
||||
|
||||
fn main(){}
|
40
tests/ui/diagnostic_namespace/suggest_typos.stderr
Normal file
40
tests/ui/diagnostic_namespace/suggest_typos.stderr
Normal file
@ -0,0 +1,40 @@
|
||||
error: unknown diagnostic attribute
|
||||
--> $DIR/suggest_typos.rs:3:15
|
||||
|
|
||||
LL | #[diagnostic::onunimplemented]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/suggest_typos.rs:1:9
|
||||
|
|
||||
LL | #![deny(unknown_or_malformed_diagnostic_attributes)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: an attribute with a similar name exists
|
||||
|
|
||||
LL | #[diagnostic::on_unimplemented]
|
||||
| ~~~~~~~~~~~~~~~~
|
||||
|
||||
error: unknown diagnostic attribute
|
||||
--> $DIR/suggest_typos.rs:8:15
|
||||
|
|
||||
LL | #[diagnostic::un_onimplemented]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
help: an attribute with a similar name exists
|
||||
|
|
||||
LL | #[diagnostic::on_unimplemented]
|
||||
| ~~~~~~~~~~~~~~~~
|
||||
|
||||
error: unknown diagnostic attribute
|
||||
--> $DIR/suggest_typos.rs:13:15
|
||||
|
|
||||
LL | #[diagnostic::on_implemented]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
help: an attribute with a similar name exists
|
||||
|
|
||||
LL | #[diagnostic::on_unimplemented]
|
||||
| ~~~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user