Migrate most of rustc_builtin_macros
to diagnostic impls
Co-authored-by: Joe ST <joe@fbstj.net> Co-authored-by: Michael Goulet <michael@errs.io>
This commit is contained in:
parent
b6f6104a1f
commit
64f7597776
31 changed files with 978 additions and 349 deletions
|
@ -1,8 +1,8 @@
|
|||
use crate::cfg_eval::cfg_eval;
|
||||
use crate::errors;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::{GenericParamKind, ItemKind, MetaItemKind, NestedMetaItem, StmtKind};
|
||||
use rustc_errors::{struct_span_err, Applicability};
|
||||
use rustc_expand::base::{Annotatable, ExpandResult, ExtCtxt, Indeterminate, MultiItemModifier};
|
||||
use rustc_feature::AttributeTemplate;
|
||||
use rustc_parse::validate_attr;
|
||||
|
@ -116,49 +116,33 @@ fn report_bad_target(sess: &Session, item: &Annotatable, span: Span) -> bool {
|
|||
let bad_target =
|
||||
!matches!(item_kind, Some(ItemKind::Struct(..) | ItemKind::Enum(..) | ItemKind::Union(..)));
|
||||
if bad_target {
|
||||
struct_span_err!(
|
||||
sess,
|
||||
span,
|
||||
E0774,
|
||||
"`derive` may only be applied to `struct`s, `enum`s and `union`s",
|
||||
)
|
||||
.span_label(span, "not applicable here")
|
||||
.span_label(item.span(), "not a `struct`, `enum` or `union`")
|
||||
.emit();
|
||||
sess.emit_err(errors::BadDeriveTarget { span, item: item.span() });
|
||||
}
|
||||
bad_target
|
||||
}
|
||||
|
||||
fn report_unexpected_meta_item_lit(sess: &Session, lit: &ast::MetaItemLit) {
|
||||
let help_msg = match lit.kind {
|
||||
let help = match lit.kind {
|
||||
ast::LitKind::Str(_, ast::StrStyle::Cooked)
|
||||
if rustc_lexer::is_ident(lit.symbol.as_str()) =>
|
||||
{
|
||||
format!("try using `#[derive({})]`", lit.symbol)
|
||||
errors::BadDeriveLitHelp::StrLit { sym: lit.symbol }
|
||||
}
|
||||
_ => "for example, write `#[derive(Debug)]` for `Debug`".to_string(),
|
||||
_ => errors::BadDeriveLitHelp::Other,
|
||||
};
|
||||
struct_span_err!(sess, lit.span, E0777, "expected path to a trait, found literal",)
|
||||
.span_label(lit.span, "not a trait")
|
||||
.help(&help_msg)
|
||||
.emit();
|
||||
sess.emit_err(errors::BadDeriveLit { span: lit.span, help });
|
||||
}
|
||||
|
||||
fn report_path_args(sess: &Session, meta: &ast::MetaItem) {
|
||||
let report_error = |title, action| {
|
||||
let span = meta.span.with_lo(meta.path.span.hi());
|
||||
sess.struct_span_err(span, title)
|
||||
.span_suggestion(span, action, "", Applicability::MachineApplicable)
|
||||
.emit();
|
||||
};
|
||||
let span = meta.span.with_lo(meta.path.span.hi());
|
||||
|
||||
match meta.kind {
|
||||
MetaItemKind::Word => {}
|
||||
MetaItemKind::List(..) => report_error(
|
||||
"traits in `#[derive(...)]` don't accept arguments",
|
||||
"remove the arguments",
|
||||
),
|
||||
MetaItemKind::List(..) => {
|
||||
sess.emit_err(errors::DerivePathArgsList { span });
|
||||
}
|
||||
MetaItemKind::NameValue(..) => {
|
||||
report_error("traits in `#[derive(...)]` don't accept values", "remove the value")
|
||||
sess.emit_err(errors::DerivePathArgsValue { span });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue