migrate: bad_attr
to SessionDiagnostic
This commit is contained in:
parent
d197c1eb5b
commit
874a79fae3
3 changed files with 53 additions and 18 deletions
|
@ -394,5 +394,13 @@ lint_builtin_deref_nullptr = dereferencing a null pointer
|
||||||
|
|
||||||
lint_builtin_asm_labels = avoid using named labels in inline assembly
|
lint_builtin_asm_labels = avoid using named labels in inline assembly
|
||||||
|
|
||||||
|
lint_malformed_attribute = malformed lint attribute input
|
||||||
|
|
||||||
|
lint_bad_attribute_argument = bad attribute argument
|
||||||
|
|
||||||
|
lint_reason_must_be_string_literal = reason must be a string literal
|
||||||
|
|
||||||
|
lint_reason_must_come_last = reason in lint attribute must come last
|
||||||
|
|
||||||
lint_unknown_tool = unknown tool name `{$tool_name}` found in scoped lint: `{$tool_name}::{$lint_name}`
|
lint_unknown_tool = unknown tool name `{$tool_name}` found in scoped lint: `{$tool_name}::{$lint_name}`
|
||||||
.help = add `#![register_tool({$tool_name})]` to the crate root
|
.help = add `#![register_tool({$tool_name})]` to the crate root
|
||||||
|
|
|
@ -1,6 +1,25 @@
|
||||||
use rustc_macros::SessionDiagnostic;
|
use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[error(lint::malformed_attribute, code = "E0452")]
|
||||||
|
pub struct MalformedAttribute {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub sub: MalformedAttributeSub,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionSubdiagnostic)]
|
||||||
|
pub enum MalformedAttributeSub {
|
||||||
|
#[label(lint::bad_attribute_argument)]
|
||||||
|
BadAttributeArgument(#[primary_span] Span),
|
||||||
|
#[label(lint::reason_must_be_string_literal)]
|
||||||
|
ReasonMustBeStringLiteral(#[primary_span] Span),
|
||||||
|
#[label(lint::reason_must_come_last)]
|
||||||
|
ReasonMustComeLast(#[primary_span] Span),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(SessionDiagnostic)]
|
#[derive(SessionDiagnostic)]
|
||||||
#[error(lint::unknown_tool, code = "E0710")]
|
#[error(lint::unknown_tool, code = "E0710")]
|
||||||
pub struct UnknownTool {
|
pub struct UnknownTool {
|
||||||
|
|
|
@ -26,7 +26,7 @@ use rustc_span::symbol::{sym, Symbol};
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use crate::errors::UnknownTool;
|
use crate::errors::{MalformedAttribute, MalformedAttributeSub, UnknownTool};
|
||||||
|
|
||||||
fn lint_levels(tcx: TyCtxt<'_>, (): ()) -> LintLevelMap {
|
fn lint_levels(tcx: TyCtxt<'_>, (): ()) -> LintLevelMap {
|
||||||
let store = unerased_lint_store(tcx);
|
let store = unerased_lint_store(tcx);
|
||||||
|
@ -271,7 +271,7 @@ impl<'s> LintLevelsBuilder<'s> {
|
||||||
self.cur = self.sets.list.push(LintSet { specs: FxHashMap::default(), parent: prev });
|
self.cur = self.sets.list.push(LintSet { specs: FxHashMap::default(), parent: prev });
|
||||||
|
|
||||||
let sess = self.sess;
|
let sess = self.sess;
|
||||||
let bad_attr = |span| struct_span_err!(sess, span, E0452, "malformed lint attribute input");
|
// let bad_attr = |span| struct_span_err!(sess, span, E0452, "malformed lint attribute input");
|
||||||
for (attr_index, attr) in attrs.iter().enumerate() {
|
for (attr_index, attr) in attrs.iter().enumerate() {
|
||||||
if attr.has_name(sym::automatically_derived) {
|
if attr.has_name(sym::automatically_derived) {
|
||||||
self.current_specs_mut().insert(
|
self.current_specs_mut().insert(
|
||||||
|
@ -322,20 +322,27 @@ impl<'s> LintLevelsBuilder<'s> {
|
||||||
}
|
}
|
||||||
reason = Some(rationale);
|
reason = Some(rationale);
|
||||||
} else {
|
} else {
|
||||||
bad_attr(name_value.span)
|
sess.emit_err(MalformedAttribute {
|
||||||
.span_label(name_value.span, "reason must be a string literal")
|
span: name_value.span,
|
||||||
.emit();
|
sub: MalformedAttributeSub::ReasonMustBeStringLiteral(
|
||||||
|
name_value.span,
|
||||||
|
),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
// found reason, reslice meta list to exclude it
|
// found reason, reslice meta list to exclude it
|
||||||
metas.pop().unwrap();
|
metas.pop().unwrap();
|
||||||
} else {
|
} else {
|
||||||
bad_attr(item.span)
|
sess.emit_err(MalformedAttribute {
|
||||||
.span_label(item.span, "bad attribute argument")
|
span: item.span,
|
||||||
.emit();
|
sub: MalformedAttributeSub::BadAttributeArgument(item.span),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast::MetaItemKind::List(_) => {
|
ast::MetaItemKind::List(_) => {
|
||||||
bad_attr(item.span).span_label(item.span, "bad attribute argument").emit();
|
sess.emit_err(MalformedAttribute {
|
||||||
|
span: item.span,
|
||||||
|
sub: MalformedAttributeSub::BadAttributeArgument(item.span),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -353,20 +360,21 @@ impl<'s> LintLevelsBuilder<'s> {
|
||||||
let meta_item = match li {
|
let meta_item = match li {
|
||||||
ast::NestedMetaItem::MetaItem(meta_item) if meta_item.is_word() => meta_item,
|
ast::NestedMetaItem::MetaItem(meta_item) if meta_item.is_word() => meta_item,
|
||||||
_ => {
|
_ => {
|
||||||
let mut err = bad_attr(sp);
|
|
||||||
let mut add_label = true;
|
|
||||||
if let Some(item) = li.meta_item() {
|
if let Some(item) = li.meta_item() {
|
||||||
if let ast::MetaItemKind::NameValue(_) = item.kind {
|
if let ast::MetaItemKind::NameValue(_) = item.kind {
|
||||||
if item.path == sym::reason {
|
if item.path == sym::reason {
|
||||||
err.span_label(sp, "reason in lint attribute must come last");
|
sess.emit_err(MalformedAttribute {
|
||||||
add_label = false;
|
span: sp,
|
||||||
|
sub: MalformedAttributeSub::ReasonMustComeLast(sp),
|
||||||
|
});
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if add_label {
|
sess.emit_err(MalformedAttribute {
|
||||||
err.span_label(sp, "bad attribute argument");
|
span: sp,
|
||||||
}
|
sub: MalformedAttributeSub::BadAttributeArgument(sp),
|
||||||
err.emit();
|
});
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue