about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2017-11-22 09:49:27 -0800
committerEsteban Küber <esteban@kuber.com.ar>2017-11-24 07:34:32 -0800
commitdf357b20be69d799fb9d562c33cbb98a03c64ae9 (patch)
treed41d74899b56eea6003d467043e8368af8dca056
parentc82e9e8e1e634250b901b69808f65fbe5f3312c3 (diff)
downloadrust-df357b20be69d799fb9d562c33cbb98a03c64ae9.tar.gz
rust-df357b20be69d799fb9d562c33cbb98a03c64ae9.zip
Suggest macro call when not sure that it is fn definition
-rw-r--r--src/libsyntax/parse/parser.rs35
-rw-r--r--src/test/parse-fail/doc-after-struct-field.rs2
-rw-r--r--src/test/parse-fail/doc-before-struct-rbrace-1.rs2
-rw-r--r--src/test/parse-fail/doc-before-struct-rbrace-2.rs2
-rw-r--r--src/test/parse-fail/issue-22647.rs1
-rw-r--r--src/test/parse-fail/issue-22712.rs2
-rw-r--r--src/test/parse-fail/issue-24197.rs2
-rw-r--r--src/test/parse-fail/mut-patterns.rs1
-rw-r--r--src/test/parse-fail/pat-lt-bracket-5.rs4
-rw-r--r--src/test/parse-fail/pat-ranges-1.rs2
-rw-r--r--src/test/parse-fail/pat-ranges-2.rs2
-rw-r--r--src/test/parse-fail/pat-ranges-3.rs2
-rw-r--r--src/test/parse-fail/pat-ranges-4.rs2
-rw-r--r--src/test/parse-fail/range-3.rs2
-rw-r--r--src/test/parse-fail/range-4.rs2
-rw-r--r--src/test/ui/suggestions/pub-ident-fn-2.stderr1
-rw-r--r--src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr2
-rw-r--r--src/test/ui/suggestions/pub-ident-fn-or-struct.stderr2
-rw-r--r--src/test/ui/suggestions/pub-ident-fn.stderr1
-rw-r--r--src/test/ui/suggestions/pub-ident-struct.stderr1
20 files changed, 33 insertions, 37 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index f839a839853..be7e589f4ad 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -3158,9 +3158,7 @@ impl<'a> Parser<'a> {
         attrs.extend(iattrs);
 
         let hi = self.prev_span;
-        Ok(self.mk_expr(span_lo.to(hi),
-                        ExprKind::ForLoop(pat, expr, loop_block, opt_ident),
-                        attrs))
+        Ok(self.mk_expr(span_lo.to(hi), ExprKind::ForLoop(pat, expr, loop_block, opt_ident), attrs))
     }
 
     /// Parse a 'while' or 'while let' expression ('while' token already eaten)
@@ -4252,13 +4250,11 @@ impl<'a> Parser<'a> {
             return Err(e);
         }
 
-        Ok(self.parse_block_tail(lo, BlockCheckMode::Default)?)
+        self.parse_block_tail(lo, BlockCheckMode::Default)
     }
 
     /// Parse a block. Inner attrs are allowed.
-    fn parse_inner_attrs_and_block(&mut self)
-        -> PResult<'a, (Vec<Attribute>, P<Block>)>
-    {
+    fn parse_inner_attrs_and_block(&mut self) -> PResult<'a, (Vec<Attribute>, P<Block>)> {
         maybe_whole!(self, NtBlock, |x| (Vec::new(), x));
 
         let lo = self.span;
@@ -4269,9 +4265,7 @@ impl<'a> Parser<'a> {
 
     /// Parse the rest of a block expression or function body
     /// Precondition: already parsed the '{'.
-    fn parse_block_tail(&mut self, lo: Span, s: BlockCheckMode)
-        -> PResult<'a, P<Block>>
-    {
+    fn parse_block_tail(&mut self, lo: Span, s: BlockCheckMode) -> PResult<'a, P<Block>> {
         let mut stmts = vec![];
 
         while !self.eat(&token::CloseDelim(token::Brace)) {
@@ -5340,32 +5334,23 @@ impl<'a> Parser<'a> {
     }
 
     fn consume_block(&mut self, delim: token::DelimToken) {
-        debug!("consuming {:?}", delim);
-        debug!("self.token {:?}", self.token);
         let mut brace_depth = 0;
         if !self.eat(&token::OpenDelim(delim)) {
-            debug!("didn't eat delim");
             return;
         }
         loop {
             if self.eat(&token::OpenDelim(delim)) {
-                debug!("add depth");
                 brace_depth += 1;
             } else if self.eat(&token::CloseDelim(delim)) {
-                debug!("found closing");
                 if brace_depth == 0 {
-                    debug!("ending");
                     return;
                 } else {
-                    debug!("decrease");
                     brace_depth -= 1;
                     continue;
                 }
             } else if self.eat(&token::Eof) || self.eat(&token::CloseDelim(token::NoDelim)) {
-                debug!("eof or nodelim");
                 return;
             } else {
-                debug!("bump");
                 self.bump();
             }
         }
@@ -6297,6 +6282,8 @@ impl<'a> Parser<'a> {
             //     pub   S {}
             //        ^^^ `sp` points here
             let sp = self.prev_span.between(self.span);
+            let full_sp = self.prev_span.to(self.span);
+            let ident_sp = self.span;
             if self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace)) {
                 // possible public struct definition where `struct` was forgotten
                 let ident = self.parse_ident().unwrap();
@@ -6328,6 +6315,16 @@ impl<'a> Parser<'a> {
                                              ident,
                                              kw_name);
                     err.span_suggestion_short(sp, &suggestion, format!(" {} ", kw));
+                } else {
+                    if let Ok(snippet) = self.sess.codemap().span_to_snippet(ident_sp) {
+                        err.span_suggestion(
+                            full_sp,
+                            "if you meant to call a macro, write instead",
+                            format!("{}!", snippet));
+                    } else {
+                        err.help("if you meant to call a macro, remove the `pub` \
+                                  and add a trailing `!` after the identifier");
+                    }
                 }
                 return Err(err);
             }
diff --git a/src/test/parse-fail/doc-after-struct-field.rs b/src/test/parse-fail/doc-after-struct-field.rs
index 1aa6af5b78f..8babf4daadd 100644
--- a/src/test/parse-fail/doc-after-struct-field.rs
+++ b/src/test/parse-fail/doc-after-struct-field.rs
@@ -16,5 +16,5 @@ struct X {
 }
 
 fn main() {
-    let y = X {a = 1};
+    let y = X {a: 1};
 }
diff --git a/src/test/parse-fail/doc-before-struct-rbrace-1.rs b/src/test/parse-fail/doc-before-struct-rbrace-1.rs
index 5ba83190c8e..6d9b4b05ad9 100644
--- a/src/test/parse-fail/doc-before-struct-rbrace-1.rs
+++ b/src/test/parse-fail/doc-before-struct-rbrace-1.rs
@@ -17,5 +17,5 @@ struct X {
 }
 
 fn main() {
-    let y = X {a = 1};
+    let y = X {a: 1};
 }
diff --git a/src/test/parse-fail/doc-before-struct-rbrace-2.rs b/src/test/parse-fail/doc-before-struct-rbrace-2.rs
index 643e4aa17a1..63b2f963799 100644
--- a/src/test/parse-fail/doc-before-struct-rbrace-2.rs
+++ b/src/test/parse-fail/doc-before-struct-rbrace-2.rs
@@ -16,5 +16,5 @@ struct X {
 }
 
 fn main() {
-    let y = X {a = 1};
+    let y = X {a: 1};
 }
diff --git a/src/test/parse-fail/issue-22647.rs b/src/test/parse-fail/issue-22647.rs
index 1ace57edba3..3da9d1a8712 100644
--- a/src/test/parse-fail/issue-22647.rs
+++ b/src/test/parse-fail/issue-22647.rs
@@ -16,6 +16,7 @@ fn main() {
         println!("Y {}",x);
         return x;
     };
+    //~^ ERROR expected item, found `;`
 
     caller(bar_handler);
 }
diff --git a/src/test/parse-fail/issue-22712.rs b/src/test/parse-fail/issue-22712.rs
index ed936cdd9a9..84d4a757a07 100644
--- a/src/test/parse-fail/issue-22712.rs
+++ b/src/test/parse-fail/issue-22712.rs
@@ -14,6 +14,6 @@ struct Foo<B> {
 
 fn bar() {
     let Foo<Vec<u8>>  //~ ERROR expected one of `:`, `;`, `=`, or `@`, found `<`
-}
+}  //~ ERROR expected item, found `}`
 
 fn main() {}
diff --git a/src/test/parse-fail/issue-24197.rs b/src/test/parse-fail/issue-24197.rs
index 37d62182612..b6bc3a29e06 100644
--- a/src/test/parse-fail/issue-24197.rs
+++ b/src/test/parse-fail/issue-24197.rs
@@ -10,4 +10,4 @@
 
 fn main() {
     let buf[0] = 0; //~ ERROR expected one of `:`, `;`, `=`, or `@`, found `[`
-}
+}  //~ ERROR expected item, found `}`
diff --git a/src/test/parse-fail/mut-patterns.rs b/src/test/parse-fail/mut-patterns.rs
index 71d826c67f8..ffb45597552 100644
--- a/src/test/parse-fail/mut-patterns.rs
+++ b/src/test/parse-fail/mut-patterns.rs
@@ -15,4 +15,5 @@
 pub fn main() {
     struct Foo { x: isize }
     let mut Foo { x: x } = Foo { x: 3 }; //~ ERROR: expected one of `:`, `;`, `=`, or `@`, found `{`
+    //~^ ERROR expected item, found `=`
 }
diff --git a/src/test/parse-fail/pat-lt-bracket-5.rs b/src/test/parse-fail/pat-lt-bracket-5.rs
index 3345845eee9..95ad006402e 100644
--- a/src/test/parse-fail/pat-lt-bracket-5.rs
+++ b/src/test/parse-fail/pat-lt-bracket-5.rs
@@ -9,5 +9,5 @@
 // except according to those terms.
 
 fn main() {
-    let v[0] = v[1]; //~ error: expected one of `:`, `;`, `=`, or `@`, found `[`
-}
+    let v[0] = v[1]; //~ ERROR expected one of `:`, `;`, `=`, or `@`, found `[`
+} //~ ERROR expected item, found `}`
diff --git a/src/test/parse-fail/pat-ranges-1.rs b/src/test/parse-fail/pat-ranges-1.rs
index 857a3924aec..7a42f453c74 100644
--- a/src/test/parse-fail/pat-ranges-1.rs
+++ b/src/test/parse-fail/pat-ranges-1.rs
@@ -12,4 +12,4 @@
 
 fn main() {
     let macropus!() ..= 11 = 12; //~ error: expected one of `:`, `;`, or `=`, found `..=`
-}
+} //~ ERROR expected item, found `}`
diff --git a/src/test/parse-fail/pat-ranges-2.rs b/src/test/parse-fail/pat-ranges-2.rs
index 64c749333cf..ad0a3b3b67f 100644
--- a/src/test/parse-fail/pat-ranges-2.rs
+++ b/src/test/parse-fail/pat-ranges-2.rs
@@ -12,4 +12,4 @@
 
 fn main() {
     let 10 ..= makropulos!() = 12; //~ error: expected one of `::`, `:`, `;`, or `=`, found `!`
-}
+} //~ ERROR expected item, found `}`
diff --git a/src/test/parse-fail/pat-ranges-3.rs b/src/test/parse-fail/pat-ranges-3.rs
index 1327a9fab36..4a9a12bcdd2 100644
--- a/src/test/parse-fail/pat-ranges-3.rs
+++ b/src/test/parse-fail/pat-ranges-3.rs
@@ -12,4 +12,4 @@
 
 fn main() {
     let 10 ..= 10 + 3 = 12; //~ expected one of `:`, `;`, or `=`, found `+`
-}
+} //~ ERROR expected item, found `}`
diff --git a/src/test/parse-fail/pat-ranges-4.rs b/src/test/parse-fail/pat-ranges-4.rs
index c159c770250..32fdc263b2d 100644
--- a/src/test/parse-fail/pat-ranges-4.rs
+++ b/src/test/parse-fail/pat-ranges-4.rs
@@ -13,4 +13,4 @@
 fn main() {
     let 10 - 3 ..= 10 = 8;
     //~^ error: expected one of `...`, `..=`, `..`, `:`, `;`, or `=`, found `-`
-}
+} //~ ERROR expected item, found `}`
diff --git a/src/test/parse-fail/range-3.rs b/src/test/parse-fail/range-3.rs
index 95aa71b0cdf..f413ac34087 100644
--- a/src/test/parse-fail/range-3.rs
+++ b/src/test/parse-fail/range-3.rs
@@ -15,4 +15,4 @@
 pub fn main() {
     let r = 1..2..3;
     //~^ ERROR expected one of `.`, `;`, `?`, or an operator, found `..`
-}
+} //~ ERROR expected item, found `}`
diff --git a/src/test/parse-fail/range-4.rs b/src/test/parse-fail/range-4.rs
index 4500df116a2..0b385129b23 100644
--- a/src/test/parse-fail/range-4.rs
+++ b/src/test/parse-fail/range-4.rs
@@ -15,4 +15,4 @@
 pub fn main() {
     let r = ..1..2;
     //~^ ERROR expected one of `.`, `;`, `?`, or an operator, found `..`
-}
+} //~ ERROR expected item, found `}`
diff --git a/src/test/ui/suggestions/pub-ident-fn-2.stderr b/src/test/ui/suggestions/pub-ident-fn-2.stderr
index 43b81efbf4c..7d3abceb11b 100644
--- a/src/test/ui/suggestions/pub-ident-fn-2.stderr
+++ b/src/test/ui/suggestions/pub-ident-fn-2.stderr
@@ -3,7 +3,6 @@ error: missing `fn` for method definition
    |
 11 | pub foo(s: usize) { bar() }
    |    ^
-   |
 help: add `fn` here to parse `foo` as a public method
    |
 11 | pub fn foo(s: usize) { bar() }
diff --git a/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr b/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr
index e8636f67e0b..68dea2aec3a 100644
--- a/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr
+++ b/src/test/ui/suggestions/pub-ident-fn-or-struct-2.stderr
@@ -2,7 +2,7 @@ error: missing `fn` or `struct` for method or struct definition
   --> $DIR/pub-ident-fn-or-struct-2.rs:11:4
    |
 11 | pub S();
-   |    ^
+   | ---^- help: if you meant to call a macro, write instead: `S!`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr b/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr
index dc391c1113d..0c19f776bd1 100644
--- a/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr
+++ b/src/test/ui/suggestions/pub-ident-fn-or-struct.stderr
@@ -2,7 +2,7 @@ error: missing `fn` or `struct` for method or struct definition
   --> $DIR/pub-ident-fn-or-struct.rs:11:4
    |
 11 | pub S (foo) bar
-   |    ^
+   | ---^- help: if you meant to call a macro, write instead: `S!`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/suggestions/pub-ident-fn.stderr b/src/test/ui/suggestions/pub-ident-fn.stderr
index 19d3db157c2..d36b9b127e0 100644
--- a/src/test/ui/suggestions/pub-ident-fn.stderr
+++ b/src/test/ui/suggestions/pub-ident-fn.stderr
@@ -3,7 +3,6 @@ error: missing `fn` for method definition
    |
 11 | pub   foo(s: usize) -> bool { true }
    |    ^^^
-   |
 help: add `fn` here to parse `foo` as a public method
    |
 11 | pub fn foo(s: usize) -> bool { true }
diff --git a/src/test/ui/suggestions/pub-ident-struct.stderr b/src/test/ui/suggestions/pub-ident-struct.stderr
index bae2f6a4f80..36ef3072722 100644
--- a/src/test/ui/suggestions/pub-ident-struct.stderr
+++ b/src/test/ui/suggestions/pub-ident-struct.stderr
@@ -3,7 +3,6 @@ error: missing `struct` for struct definition
    |
 11 | pub S {
    |    ^
-   |
 help: add `struct` here to parse `S` as a public struct
    |
 11 | pub struct S {