use crate::ext::base::*;
use crate::ext::proc_macro::collect_derives;
use crate::ext::hygiene::{ExpnId, SyntaxContext, ExpnInfo, ExpnKind};
+use crate::ext::tt::macro_rules::annotate_err_with_kind;
use crate::ext::placeholders::{placeholder, PlaceholderExpander};
use crate::feature_gate::{self, Features, GateIssue, is_builtin_attr, emit_feature_err};
use crate::mut_visit::*;
}
Err(mut err) => {
err.set_span(span);
- match kind {
- AstFragmentKind::Ty => {
- err.span_label(
- span,
- "this macro call doesn't expand to a type",
- );
- }
- AstFragmentKind::Pat => {
- err.span_label(
- span,
- "this macro call doesn't expand to a pattern",
- );
- }
- _ => {}
- };
+ annotate_err_with_kind(&mut err, kind, span);
err.emit();
self.cx.trace_macros_diag();
kind.dummy(span)
use crate::tokenstream::{DelimSpan, TokenStream, TokenTree};
use crate::{ast, attr, attr::TransparencyError};
-use errors::FatalError;
+use errors::{DiagnosticBuilder, FatalError};
use log::debug;
use syntax_pos::Span;
arm_span: Span,
}
+pub fn annotate_err_with_kind(err: &mut DiagnosticBuilder<'_>, kind: AstFragmentKind, span: Span) {
+ match kind {
+ AstFragmentKind::Ty => {
+ err.span_label(span, "this macro call doesn't expand to a type");
+ }
+ AstFragmentKind::Pat => {
+ err.span_label(span, "this macro call doesn't expand to a pattern");
+ }
+ _ => {}
+ };
+}
+
impl<'a> ParserAnyMacro<'a> {
pub fn make(mut self: Box<ParserAnyMacro<'a>>, kind: AstFragmentKind) -> AstFragment {
let ParserAnyMacro { site_span, macro_ident, ref mut parser, arm_span } = *self;
e.span_label(site_span, "in this macro invocation");
}
match kind {
- AstFragmentKind::Ty => {
- e.span_label(
- site_span,
- "this macro call doesn't expand to a type",
- );
- }
AstFragmentKind::Pat if macro_ident.name == sym::vec => {
- e.span_label(
- site_span,
- "use a slice pattern here instead",
- );
+ let mut suggestion = None;
+ if let Ok(code) = parser.sess.source_map().span_to_snippet(site_span) {
+ if let Some(bang) = code.find('!') {
+ suggestion = Some(code[bang + 1..].to_string());
+ }
+ }
+ if let Some(suggestion) = suggestion {
+ e.span_suggestion(
+ site_span,
+ "use a slice pattern here instead",
+ suggestion,
+ Applicability::MachineApplicable,
+ );
+ } else {
+ e.span_label(
+ site_span,
+ "use a slice pattern here instead",
+ );
+ }
e.help("for more information, see https://doc.rust-lang.org/edition-guide/\
- rust-2018/slice-patterns.html");
- }
- AstFragmentKind::Pat => {
- e.span_label(
- site_span,
- "this macro call doesn't expand to a pattern",
- );
+ rust-2018/slice-patterns.html");
}
- _ => {}
+ _ => annotate_err_with_kind(&mut e, kind, site_span),
};
e
}));
error: unexpected `(` after qualified path
- --> $DIR/vec-macro-in-pattern.rs:3:14
+ --> $DIR/vec-macro-in-pattern.rs:5:14
|
-LL | Some(vec![x]) => (),
- | ^^^^^^^
+LL | Some(vec![_x]) => (),
+ | ^^^^^^^^
| |
| unexpected `(` after qualified path
| in this macro invocation
- | use a slice pattern here instead
+ | help: use a slice pattern here instead: `[_x]`
|
= help: for more information, see https://doc.rust-lang.org/edition-guide/rust-2018/slice-patterns.html
= note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)