Skip to content

Commit

Permalink
Rollup merge of rust-lang#100188 - chenyukang:fix-issue-100165, r=est…
Browse files Browse the repository at this point in the history
…ebank

Parser will not suggest invalid expression when use public

Fixes rust-lang#100165
  • Loading branch information
Dylan-DPC authored Aug 20, 2022
2 parents ce43db3 + 863488d commit fbb575b
Show file tree
Hide file tree
Showing 8 changed files with 79 additions and 10 deletions.
20 changes: 20 additions & 0 deletions compiler/rustc_ast/src/token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,26 @@ impl Token {
|| self == &OpenDelim(Delimiter::Parenthesis)
}

/// Returns `true` if the token can appear at the start of a item
pub fn can_begin_item(&self) -> bool {
self.is_keyword(kw::Use)
|| self.is_keyword(kw::Fn)
|| self.is_keyword(kw::Extern)
|| self.is_keyword(kw::Crate)
|| self.is_keyword(kw::Mod)
|| self.is_keyword(kw::Const)
|| self.is_keyword(kw::Static)
|| self.is_keyword(kw::Trait)
|| self.is_keyword(kw::Impl)
|| self.is_keyword(kw::Mod)
|| self.is_keyword(kw::Type)
|| self.is_keyword(kw::Enum)
|| self.is_keyword(kw::Struct)
|| self.is_keyword(kw::Union)
|| self.is_keyword(kw::Macro)
|| self == &OpenDelim(Delimiter::Parenthesis)
}

/// Returns `true` if the token is any literal.
pub fn is_lit(&self) -> bool {
matches!(self.kind, Literal(..))
Expand Down
18 changes: 8 additions & 10 deletions compiler/rustc_parse/src/parser/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ use rustc_errors::{
use rustc_errors::{pluralize, struct_span_err, Diagnostic, ErrorGuaranteed};
use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic};
use rustc_span::source_map::Spanned;
use rustc_span::symbol::{kw, Ident};
use rustc_span::symbol::{kw, sym, Ident};
use rustc_span::{Span, SpanSnippetError, DUMMY_SP};
use std::ops::{Deref, DerefMut};

Expand Down Expand Up @@ -602,15 +602,13 @@ impl<'a> Parser<'a> {
self.last_unexpected_token_span = Some(self.token.span);
let mut err = self.struct_span_err(self.token.span, &msg_exp);

if let TokenKind::Ident(symbol, _) = &self.prev_token.kind {
if symbol.as_str() == "public" {
err.span_suggestion_short(
self.prev_token.span,
"write `pub` instead of `public` to make the item public",
"pub",
appl,
);
}
if self.prev_token.is_ident_named(sym::public) && self.token.can_begin_item() {
err.span_suggestion_short(
self.prev_token.span,
"write `pub` instead of `public` to make the item public",
"pub",
appl,
);
}

// Add suggestion for a missing closing angle bracket if '>' is included in expected_tokens
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_span/src/symbol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,7 @@ symbols! {
ptr_offset_from_unsigned,
pub_macro_rules,
pub_restricted,
public,
pure,
pushpop_unsafe,
qreg,
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/parser/public-instead-of-pub-1.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Checks what happens when `public` is used instead of the correct, `pub`
// run-rustfix

pub enum Test {
//~^ ERROR expected one of `!` or `::`, found keyword `enum`
//~^^ HELP write `pub` instead of `public` to make the item public
A,
B,
}

fn main() { }
11 changes: 11 additions & 0 deletions src/test/ui/parser/public-instead-of-pub-1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Checks what happens when `public` is used instead of the correct, `pub`
// run-rustfix

public enum Test {
//~^ ERROR expected one of `!` or `::`, found keyword `enum`
//~^^ HELP write `pub` instead of `public` to make the item public
A,
B,
}

fn main() { }
13 changes: 13 additions & 0 deletions src/test/ui/parser/public-instead-of-pub-1.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: expected one of `!` or `::`, found keyword `enum`
--> $DIR/public-instead-of-pub-1.rs:4:8
|
LL | public enum Test {
| ^^^^ expected one of `!` or `::`
|
help: write `pub` instead of `public` to make the item public
|
LL | pub enum Test {
| ~~~

error: aborting due to previous error

7 changes: 7 additions & 0 deletions src/test/ui/parser/public-instead-of-pub-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Checks what happens when `public` is used instead of the correct, `pub`
// Won't give help message for this case

public let x = 1;
//~^ ERROR expected one of `!` or `::`, found keyword `let`

fn main() { }
8 changes: 8 additions & 0 deletions src/test/ui/parser/public-instead-of-pub-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
error: expected one of `!` or `::`, found keyword `let`
--> $DIR/public-instead-of-pub-2.rs:4:8
|
LL | public let x = 1;
| ^^^ expected one of `!` or `::`

error: aborting due to previous error

0 comments on commit fbb575b

Please sign in to comment.