From e69f2ab8c071f53a09cca0cca335c7e38270f159 Mon Sep 17 00:00:00 2001 From: Felix Raimundo Date: Sat, 4 Oct 2014 02:16:38 +0200 Subject: [PATCH 1/2] Changed `extern crate foo as bar;` error message Closes #17709 --- src/libsyntax/parse/parser.rs | 19 ++++++++++++++----- .../extern-crate-as-no-string-help.rs | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 src/test/compile-fail/extern-crate-as-no-string-help.rs diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 4c877c0b101e0..f2236b6a463e2 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4981,18 +4981,27 @@ impl<'a> Parser<'a> { attrs: Vec ) -> ItemOrViewItem { + let span = self.span; let (maybe_path, ident) = match self.token { token::IDENT(..) => { let the_ident = self.parse_ident(); - self.expect_one_of(&[], &[token::EQ, token::SEMI]); - let path = if self.token == token::EQ { - self.bump(); + let path = if self.eat(&token::EQ) { let path = self.parse_str(); let span = self.span; self.obsolete(span, ObsoleteExternCrateRenaming); Some(path) - } else {None}; - + } else if self.eat_keyword(keywords::As) { + // skip the ident if there is one + if is_ident(&self.token) { self.bump(); } + + self.span_err(span, + format!("expected `;`, found `as`; perhaps you meant \ + to enclose the crate name `{}` in a string?", + the_ident.as_str()).as_slice()); + None + } else { + None + }; self.expect(&token::SEMI); (path, the_ident) }, diff --git a/src/test/compile-fail/extern-crate-as-no-string-help.rs b/src/test/compile-fail/extern-crate-as-no-string-help.rs new file mode 100644 index 0000000000000..70d4ae9ab03de --- /dev/null +++ b/src/test/compile-fail/extern-crate-as-no-string-help.rs @@ -0,0 +1,14 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Tests that the proper help is displayed in the error message + +extern crate foo as bar; +//~^ ERROR expected `;`, found `as`; perhaps you meant to enclose the crate name `foo` in a string? From 0af88e3c0495c5dfc78a8a31d0d8d4fee4f5aea8 Mon Sep 17 00:00:00 2001 From: Felix Raimundo Date: Sun, 12 Oct 2014 23:48:22 +0200 Subject: [PATCH 2/2] Update a test error message #17709 --- src/test/compile-fail/extern-foreign-crate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/compile-fail/extern-foreign-crate.rs b/src/test/compile-fail/extern-foreign-crate.rs index 97a5f2a11e96a..24b978b0a21ff 100644 --- a/src/test/compile-fail/extern-foreign-crate.rs +++ b/src/test/compile-fail/extern-foreign-crate.rs @@ -11,4 +11,4 @@ // Verifies that the expected token errors for `extern crate` are // raised -extern crate foo {} //~ERROR expected one of `=`, `;`, found `{` +extern crate foo {} //~ERROR expected `;`, found `{`