about summary refs log tree commit diff
path: root/src/libsyntax/ext
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2018-10-23 10:07:34 -0700
committerEsteban Küber <esteban@kuber.com.ar>2018-10-23 10:07:34 -0700
commitad144ac3c1da0d4a25d8ca95113ac6f29bc0fce5 (patch)
treeb5f92e6875f8e8e002a8bf51b93f52f439ca222e /src/libsyntax/ext
parent8544db0faa9e0f7a70323ad5f3e75358bba6820d (diff)
downloadrust-ad144ac3c1da0d4a25d8ca95113ac6f29bc0fce5.tar.gz
rust-ad144ac3c1da0d4a25d8ca95113ac6f29bc0fce5.zip
Modify invalid macro in expression context diagnostic
Diffstat (limited to 'src/libsyntax/ext')
-rw-r--r--src/libsyntax/ext/expand.rs24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 9e06384f5a8..436e0b53a76 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -1036,10 +1036,26 @@ impl<'a> Parser<'a> {
             // Avoid emitting backtrace info twice.
             let def_site_span = self.span.with_ctxt(SyntaxContext::empty());
             let mut err = self.diagnostic().struct_span_err(def_site_span, &msg);
-            let msg = format!("caused by the macro expansion here; the usage \
-                               of `{}!` is likely invalid in {} context",
-                               macro_path, kind_name);
-            err.span_note(span, &msg).emit();
+            err.span_label(span, "caused by the macro expansion here");
+            let msg = format!(
+                "the usage of `{}!` is likely invalid in {} context",
+                macro_path,
+                kind_name,
+            );
+            err.note(&msg);
+            let semi_span = self.sess.source_map().next_point(span);
+            match self.sess.source_map().span_to_snippet(semi_span) {
+                Ok(ref snippet) if &snippet[..] != ";" && kind_name == "expression" => {
+                    err.span_suggestion_with_applicability(
+                        semi_span,
+                        "you might be missing a semicolon here",
+                        ";".to_owned(),
+                        Applicability::MaybeIncorrect,
+                    );
+                }
+                _ => {}
+            }
+            err.emit();
         }
     }
 }