1
Fork 0

migrate: bad_attr to SessionDiagnostic

This commit is contained in:
Rejyr 2022-08-19 17:17:14 -04:00
parent d197c1eb5b
commit 874a79fae3
3 changed files with 53 additions and 18 deletions

View file

@ -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

View file

@ -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 {

View file

@ -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;
} }
}; };