Rollup merge of #100188 - chenyukang:fix-issue-100165, r=estebank

Parser will not suggest invalid expression when use public

Fixes #100165
This commit is contained in:
Yuki Okushi 2022-08-25 08:50:56 +09:00 committed by GitHub
commit ed8cfc86a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 65 additions and 10 deletions

View file

@ -22,7 +22,7 @@
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};
@ -977,15 +977,6 @@ fn is_ident_eq_keyword(found: &TokenKind, expected: &TokenType) -> bool {
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 ["def", "fun", "func", "function"].contains(&symbol.as_str()) {
err.span_suggestion_short(
self.prev_token.span,
@ -996,6 +987,19 @@ fn is_ident_eq_keyword(found: &TokenKind, expected: &TokenType) -> bool {
}
}
// `pub` may be used for an item or `pub(crate)`
if self.prev_token.is_ident_named(sym::public)
&& (self.token.can_begin_item()
|| self.token.kind == TokenKind::OpenDelim(Delimiter::Parenthesis))
{
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
// there are unclosed angle brackets
if self.unmatched_angle_bracket_count > 0

View file

@ -1119,6 +1119,7 @@
ptr_offset_from_unsigned,
pub_macro_rules,
pub_restricted,
public,
pure,
pushpop_unsafe,
qreg,

View file

@ -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() { }

View file

@ -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() { }

View file

@ -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

View file

@ -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() { }

View file

@ -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