mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 02:33:55 +00:00
Recover wrong cased keywords starting functions
This commit is contained in:
parent
3694429d09
commit
38b0865248
@ -618,6 +618,15 @@ impl Token {
|
|||||||
self.is_non_raw_ident_where(|id| id.name == kw)
|
self.is_non_raw_ident_where(|id| id.name == kw)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if the token is a given keyword, `kw` or if `case_insensitive` is true and this token is an identifier equal to `kw` ignoring the case.
|
||||||
|
pub fn is_keyword_case(&self, kw: Symbol, case_insensitive: bool) -> bool {
|
||||||
|
self.is_keyword(kw)
|
||||||
|
|| (case_insensitive
|
||||||
|
&& self.is_non_raw_ident_where(|id| {
|
||||||
|
id.name.as_str().to_lowercase() == kw.as_str().to_lowercase()
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_path_segment_keyword(&self) -> bool {
|
pub fn is_path_segment_keyword(&self) -> bool {
|
||||||
self.is_non_raw_ident_where(Ident::is_path_segment_keyword)
|
self.is_non_raw_ident_where(Ident::is_path_segment_keyword)
|
||||||
}
|
}
|
||||||
|
@ -2024,7 +2024,7 @@ impl<'a> Parser<'a> {
|
|||||||
if self.eat_keyword(kw::Static) { Movability::Static } else { Movability::Movable };
|
if self.eat_keyword(kw::Static) { Movability::Static } else { Movability::Movable };
|
||||||
|
|
||||||
let asyncness = if self.token.uninterpolated_span().rust_2018() {
|
let asyncness = if self.token.uninterpolated_span().rust_2018() {
|
||||||
self.parse_asyncness()
|
self.parse_asyncness(false)
|
||||||
} else {
|
} else {
|
||||||
Async::No
|
Async::No
|
||||||
};
|
};
|
||||||
|
@ -34,7 +34,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
/// Parses a `mod <foo> { ... }` or `mod <foo>;` item.
|
/// Parses a `mod <foo> { ... }` or `mod <foo>;` item.
|
||||||
fn parse_item_mod(&mut self, attrs: &mut AttrVec) -> PResult<'a, ItemInfo> {
|
fn parse_item_mod(&mut self, attrs: &mut AttrVec) -> PResult<'a, ItemInfo> {
|
||||||
let unsafety = self.parse_unsafety();
|
let unsafety = self.parse_unsafety(false);
|
||||||
self.expect_keyword(kw::Mod)?;
|
self.expect_keyword(kw::Mod)?;
|
||||||
let id = self.parse_ident()?;
|
let id = self.parse_ident()?;
|
||||||
let mod_kind = if self.eat(&token::Semi) {
|
let mod_kind = if self.eat(&token::Semi) {
|
||||||
@ -215,14 +215,14 @@ impl<'a> Parser<'a> {
|
|||||||
kw_case_insensitive: bool,
|
kw_case_insensitive: bool,
|
||||||
) -> PResult<'a, Option<ItemInfo>> {
|
) -> PResult<'a, Option<ItemInfo>> {
|
||||||
let def_final = def == &Defaultness::Final;
|
let def_final = def == &Defaultness::Final;
|
||||||
let mut def = || mem::replace(def, Defaultness::Final);
|
let mut def_ = || mem::replace(def, Defaultness::Final);
|
||||||
|
|
||||||
let info = if self.eat_keyword_case(kw::Use, kw_case_insensitive) {
|
let info = if self.eat_keyword_case(kw::Use, kw_case_insensitive) {
|
||||||
self.parse_use_item()?
|
self.parse_use_item()?
|
||||||
} else if self.check_fn_front_matter(def_final) {
|
} else if self.check_fn_front_matter(def_final, kw_case_insensitive) {
|
||||||
// FUNCTION ITEM
|
// FUNCTION ITEM
|
||||||
let (ident, sig, generics, body) = self.parse_fn(attrs, fn_parse_mode, lo, vis)?;
|
let (ident, sig, generics, body) = self.parse_fn(attrs, fn_parse_mode, lo, vis)?;
|
||||||
(ident, ItemKind::Fn(Box::new(Fn { defaultness: def(), sig, generics, body })))
|
(ident, ItemKind::Fn(Box::new(Fn { defaultness: def_(), sig, generics, body })))
|
||||||
} else if self.eat_keyword(kw::Extern) {
|
} else if self.eat_keyword(kw::Extern) {
|
||||||
if self.eat_keyword(kw::Crate) {
|
if self.eat_keyword(kw::Crate) {
|
||||||
// EXTERN CRATE
|
// EXTERN CRATE
|
||||||
@ -233,7 +233,7 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
} else if self.is_unsafe_foreign_mod() {
|
} else if self.is_unsafe_foreign_mod() {
|
||||||
// EXTERN BLOCK
|
// EXTERN BLOCK
|
||||||
let unsafety = self.parse_unsafety();
|
let unsafety = self.parse_unsafety(false);
|
||||||
self.expect_keyword(kw::Extern)?;
|
self.expect_keyword(kw::Extern)?;
|
||||||
self.parse_item_foreign_mod(attrs, unsafety)?
|
self.parse_item_foreign_mod(attrs, unsafety)?
|
||||||
} else if self.is_static_global() {
|
} else if self.is_static_global() {
|
||||||
@ -242,15 +242,15 @@ impl<'a> Parser<'a> {
|
|||||||
let m = self.parse_mutability();
|
let m = self.parse_mutability();
|
||||||
let (ident, ty, expr) = self.parse_item_global(Some(m))?;
|
let (ident, ty, expr) = self.parse_item_global(Some(m))?;
|
||||||
(ident, ItemKind::Static(ty, m, expr))
|
(ident, ItemKind::Static(ty, m, expr))
|
||||||
} else if let Const::Yes(const_span) = self.parse_constness() {
|
} else if let Const::Yes(const_span) = self.parse_constness(false) {
|
||||||
// CONST ITEM
|
// CONST ITEM
|
||||||
if self.token.is_keyword(kw::Impl) {
|
if self.token.is_keyword(kw::Impl) {
|
||||||
// recover from `const impl`, suggest `impl const`
|
// recover from `const impl`, suggest `impl const`
|
||||||
self.recover_const_impl(const_span, attrs, def())?
|
self.recover_const_impl(const_span, attrs, def_())?
|
||||||
} else {
|
} else {
|
||||||
self.recover_const_mut(const_span);
|
self.recover_const_mut(const_span);
|
||||||
let (ident, ty, expr) = self.parse_item_global(None)?;
|
let (ident, ty, expr) = self.parse_item_global(None)?;
|
||||||
(ident, ItemKind::Const(def(), ty, expr))
|
(ident, ItemKind::Const(def_(), ty, expr))
|
||||||
}
|
}
|
||||||
} else if self.check_keyword(kw::Trait) || self.check_auto_or_unsafe_trait_item() {
|
} else if self.check_keyword(kw::Trait) || self.check_auto_or_unsafe_trait_item() {
|
||||||
// TRAIT ITEM
|
// TRAIT ITEM
|
||||||
@ -259,7 +259,7 @@ impl<'a> Parser<'a> {
|
|||||||
|| self.check_keyword(kw::Unsafe) && self.is_keyword_ahead(1, &[kw::Impl])
|
|| self.check_keyword(kw::Unsafe) && self.is_keyword_ahead(1, &[kw::Impl])
|
||||||
{
|
{
|
||||||
// IMPL ITEM
|
// IMPL ITEM
|
||||||
self.parse_item_impl(attrs, def())?
|
self.parse_item_impl(attrs, def_())?
|
||||||
} else if self.check_keyword(kw::Mod)
|
} else if self.check_keyword(kw::Mod)
|
||||||
|| self.check_keyword(kw::Unsafe) && self.is_keyword_ahead(1, &[kw::Mod])
|
|| self.check_keyword(kw::Unsafe) && self.is_keyword_ahead(1, &[kw::Mod])
|
||||||
{
|
{
|
||||||
@ -267,7 +267,7 @@ impl<'a> Parser<'a> {
|
|||||||
self.parse_item_mod(attrs)?
|
self.parse_item_mod(attrs)?
|
||||||
} else if self.eat_keyword(kw::Type) {
|
} else if self.eat_keyword(kw::Type) {
|
||||||
// TYPE ITEM
|
// TYPE ITEM
|
||||||
self.parse_type_alias(def())?
|
self.parse_type_alias(def_())?
|
||||||
} else if self.eat_keyword(kw::Enum) {
|
} else if self.eat_keyword(kw::Enum) {
|
||||||
// ENUM ITEM
|
// ENUM ITEM
|
||||||
self.parse_item_enum()?
|
self.parse_item_enum()?
|
||||||
@ -295,16 +295,10 @@ impl<'a> Parser<'a> {
|
|||||||
self.recover_missing_kw_before_item()?;
|
self.recover_missing_kw_before_item()?;
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
} else if self.isnt_macro_invocation() && !kw_case_insensitive {
|
} else if self.isnt_macro_invocation() && !kw_case_insensitive {
|
||||||
|
_ = def_;
|
||||||
|
|
||||||
// Recover wrong cased keywords
|
// Recover wrong cased keywords
|
||||||
return self.parse_item_kind(
|
return self.parse_item_kind(attrs, macros_allowed, lo, vis, def, fn_parse_mode, true);
|
||||||
attrs,
|
|
||||||
macros_allowed,
|
|
||||||
lo,
|
|
||||||
vis,
|
|
||||||
&mut def(),
|
|
||||||
fn_parse_mode,
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
} else if macros_allowed && self.check_path() {
|
} else if macros_allowed && self.check_path() {
|
||||||
// MACRO INVOCATION ITEM
|
// MACRO INVOCATION ITEM
|
||||||
(Ident::empty(), ItemKind::MacCall(P(self.parse_item_macro(vis)?)))
|
(Ident::empty(), ItemKind::MacCall(P(self.parse_item_macro(vis)?)))
|
||||||
@ -557,7 +551,7 @@ impl<'a> Parser<'a> {
|
|||||||
attrs: &mut AttrVec,
|
attrs: &mut AttrVec,
|
||||||
defaultness: Defaultness,
|
defaultness: Defaultness,
|
||||||
) -> PResult<'a, ItemInfo> {
|
) -> PResult<'a, ItemInfo> {
|
||||||
let unsafety = self.parse_unsafety();
|
let unsafety = self.parse_unsafety(false);
|
||||||
self.expect_keyword(kw::Impl)?;
|
self.expect_keyword(kw::Impl)?;
|
||||||
|
|
||||||
// First, parse generic parameters if necessary.
|
// First, parse generic parameters if necessary.
|
||||||
@ -571,7 +565,7 @@ impl<'a> Parser<'a> {
|
|||||||
generics
|
generics
|
||||||
};
|
};
|
||||||
|
|
||||||
let constness = self.parse_constness();
|
let constness = self.parse_constness(false);
|
||||||
if let Const::Yes(span) = constness {
|
if let Const::Yes(span) = constness {
|
||||||
self.sess.gated_spans.gate(sym::const_trait_impl, span);
|
self.sess.gated_spans.gate(sym::const_trait_impl, span);
|
||||||
}
|
}
|
||||||
@ -815,7 +809,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
/// Parses `unsafe? auto? trait Foo { ... }` or `trait Foo = Bar;`.
|
/// Parses `unsafe? auto? trait Foo { ... }` or `trait Foo = Bar;`.
|
||||||
fn parse_item_trait(&mut self, attrs: &mut AttrVec, lo: Span) -> PResult<'a, ItemInfo> {
|
fn parse_item_trait(&mut self, attrs: &mut AttrVec, lo: Span) -> PResult<'a, ItemInfo> {
|
||||||
let unsafety = self.parse_unsafety();
|
let unsafety = self.parse_unsafety(false);
|
||||||
// Parse optional `auto` prefix.
|
// Parse optional `auto` prefix.
|
||||||
let is_auto = if self.eat_keyword(kw::Auto) { IsAuto::Yes } else { IsAuto::No };
|
let is_auto = if self.eat_keyword(kw::Auto) { IsAuto::Yes } else { IsAuto::No };
|
||||||
|
|
||||||
@ -1764,7 +1758,7 @@ impl<'a> Parser<'a> {
|
|||||||
let (ident, is_raw) = self.ident_or_err()?;
|
let (ident, is_raw) = self.ident_or_err()?;
|
||||||
if !is_raw && ident.is_reserved() {
|
if !is_raw && ident.is_reserved() {
|
||||||
let snapshot = self.create_snapshot_for_diagnostic();
|
let snapshot = self.create_snapshot_for_diagnostic();
|
||||||
let err = if self.check_fn_front_matter(false) {
|
let err = if self.check_fn_front_matter(false, false) {
|
||||||
let inherited_vis = Visibility {
|
let inherited_vis = Visibility {
|
||||||
span: rustc_span::DUMMY_SP,
|
span: rustc_span::DUMMY_SP,
|
||||||
kind: VisibilityKind::Inherited,
|
kind: VisibilityKind::Inherited,
|
||||||
@ -2153,7 +2147,11 @@ impl<'a> Parser<'a> {
|
|||||||
///
|
///
|
||||||
/// `check_pub` adds additional `pub` to the checks in case users place it
|
/// `check_pub` adds additional `pub` to the checks in case users place it
|
||||||
/// wrongly, can be used to ensure `pub` never comes after `default`.
|
/// wrongly, can be used to ensure `pub` never comes after `default`.
|
||||||
pub(super) fn check_fn_front_matter(&mut self, check_pub: bool) -> bool {
|
pub(super) fn check_fn_front_matter(
|
||||||
|
&mut self,
|
||||||
|
check_pub: bool,
|
||||||
|
kw_case_insensitive: bool,
|
||||||
|
) -> bool {
|
||||||
// We use an over-approximation here.
|
// We use an over-approximation here.
|
||||||
// `const const`, `fn const` won't parse, but we're not stepping over other syntax either.
|
// `const const`, `fn const` won't parse, but we're not stepping over other syntax either.
|
||||||
// `pub` is added in case users got confused with the ordering like `async pub fn`,
|
// `pub` is added in case users got confused with the ordering like `async pub fn`,
|
||||||
@ -2163,23 +2161,30 @@ impl<'a> Parser<'a> {
|
|||||||
} else {
|
} else {
|
||||||
&[kw::Const, kw::Async, kw::Unsafe, kw::Extern]
|
&[kw::Const, kw::Async, kw::Unsafe, kw::Extern]
|
||||||
};
|
};
|
||||||
self.check_keyword(kw::Fn) // Definitely an `fn`.
|
self.check_keyword_case(kw::Fn, kw_case_insensitive) // Definitely an `fn`.
|
||||||
// `$qual fn` or `$qual $qual`:
|
// `$qual fn` or `$qual $qual`:
|
||||||
|| quals.iter().any(|&kw| self.check_keyword(kw))
|
|| quals.iter().any(|&kw| self.check_keyword_case(kw, kw_case_insensitive))
|
||||||
&& self.look_ahead(1, |t| {
|
&& self.look_ahead(1, |t| {
|
||||||
// `$qual fn`, e.g. `const fn` or `async fn`.
|
// `$qual fn`, e.g. `const fn` or `async fn`.
|
||||||
t.is_keyword(kw::Fn)
|
t.is_keyword_case(kw::Fn, kw_case_insensitive)
|
||||||
// Two qualifiers `$qual $qual` is enough, e.g. `async unsafe`.
|
// Two qualifiers `$qual $qual` is enough, e.g. `async unsafe`.
|
||||||
|| t.is_non_raw_ident_where(|i| quals.contains(&i.name)
|
|| (
|
||||||
// Rule out 2015 `const async: T = val`.
|
(
|
||||||
&& i.is_reserved()
|
t.is_non_raw_ident_where(|i|
|
||||||
|
quals.contains(&i.name)
|
||||||
|
// Rule out 2015 `const async: T = val`.
|
||||||
|
&& i.is_reserved()
|
||||||
|
)
|
||||||
|
|| kw_case_insensitive
|
||||||
|
&& t.is_non_raw_ident_where(|i| quals.iter().any(|qual| qual.as_str() == i.name.as_str().to_lowercase()))
|
||||||
|
)
|
||||||
// Rule out unsafe extern block.
|
// Rule out unsafe extern block.
|
||||||
&& !self.is_unsafe_foreign_mod())
|
&& !self.is_unsafe_foreign_mod())
|
||||||
})
|
})
|
||||||
// `extern ABI fn`
|
// `extern ABI fn`
|
||||||
|| self.check_keyword(kw::Extern)
|
|| self.check_keyword_case(kw::Extern, kw_case_insensitive)
|
||||||
&& self.look_ahead(1, |t| t.can_begin_literal_maybe_minus())
|
&& self.look_ahead(1, |t| t.can_begin_literal_maybe_minus())
|
||||||
&& self.look_ahead(2, |t| t.is_keyword(kw::Fn))
|
&& self.look_ahead(2, |t| t.is_keyword_case(kw::Fn, kw_case_insensitive))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses all the "front matter" (or "qualifiers") for a `fn` declaration,
|
/// Parses all the "front matter" (or "qualifiers") for a `fn` declaration,
|
||||||
@ -2195,22 +2200,22 @@ impl<'a> Parser<'a> {
|
|||||||
/// `Visibility::Inherited` when no visibility is known.
|
/// `Visibility::Inherited` when no visibility is known.
|
||||||
pub(super) fn parse_fn_front_matter(&mut self, orig_vis: &Visibility) -> PResult<'a, FnHeader> {
|
pub(super) fn parse_fn_front_matter(&mut self, orig_vis: &Visibility) -> PResult<'a, FnHeader> {
|
||||||
let sp_start = self.token.span;
|
let sp_start = self.token.span;
|
||||||
let constness = self.parse_constness();
|
let constness = self.parse_constness(true);
|
||||||
|
|
||||||
let async_start_sp = self.token.span;
|
let async_start_sp = self.token.span;
|
||||||
let asyncness = self.parse_asyncness();
|
let asyncness = self.parse_asyncness(true);
|
||||||
|
|
||||||
let unsafe_start_sp = self.token.span;
|
let unsafe_start_sp = self.token.span;
|
||||||
let unsafety = self.parse_unsafety();
|
let unsafety = self.parse_unsafety(true);
|
||||||
|
|
||||||
let ext_start_sp = self.token.span;
|
let ext_start_sp = self.token.span;
|
||||||
let ext = self.parse_extern();
|
let ext = self.parse_extern(true);
|
||||||
|
|
||||||
if let Async::Yes { span, .. } = asyncness {
|
if let Async::Yes { span, .. } = asyncness {
|
||||||
self.ban_async_in_2015(span);
|
self.ban_async_in_2015(span);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.eat_keyword(kw::Fn) {
|
if !self.eat_keyword_case(kw::Fn, true) {
|
||||||
// It is possible for `expect_one_of` to recover given the contents of
|
// It is possible for `expect_one_of` to recover given the contents of
|
||||||
// `self.expected_tokens`, therefore, do not use `self.unexpected()` which doesn't
|
// `self.expected_tokens`, therefore, do not use `self.unexpected()` which doesn't
|
||||||
// account for this.
|
// account for this.
|
||||||
|
@ -604,6 +604,20 @@ impl<'a> Parser<'a> {
|
|||||||
self.token.is_keyword(kw)
|
self.token.is_keyword(kw)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn check_keyword_case(&mut self, kw: Symbol, case_insensitive: bool) -> bool {
|
||||||
|
if self.check_keyword(kw) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if case_insensitive
|
||||||
|
&& let Some((ident, /* is_raw */ false)) = self.token.ident()
|
||||||
|
&& ident.as_str().to_lowercase() == kw.as_str().to_lowercase() {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// If the next token is the given keyword, eats it and returns `true`.
|
/// If the next token is the given keyword, eats it and returns `true`.
|
||||||
/// Otherwise, returns `false`. An expectation is also added for diagnostics purposes.
|
/// Otherwise, returns `false`. An expectation is also added for diagnostics purposes.
|
||||||
// Public for rustfmt usage.
|
// Public for rustfmt usage.
|
||||||
@ -1122,8 +1136,8 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parses asyncness: `async` or nothing.
|
/// Parses asyncness: `async` or nothing.
|
||||||
fn parse_asyncness(&mut self) -> Async {
|
fn parse_asyncness(&mut self, case_insensitive: bool) -> Async {
|
||||||
if self.eat_keyword(kw::Async) {
|
if self.eat_keyword_case(kw::Async, case_insensitive) {
|
||||||
let span = self.prev_token.uninterpolated_span();
|
let span = self.prev_token.uninterpolated_span();
|
||||||
Async::Yes { span, closure_id: DUMMY_NODE_ID, return_impl_trait_id: DUMMY_NODE_ID }
|
Async::Yes { span, closure_id: DUMMY_NODE_ID, return_impl_trait_id: DUMMY_NODE_ID }
|
||||||
} else {
|
} else {
|
||||||
@ -1132,8 +1146,8 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parses unsafety: `unsafe` or nothing.
|
/// Parses unsafety: `unsafe` or nothing.
|
||||||
fn parse_unsafety(&mut self) -> Unsafe {
|
fn parse_unsafety(&mut self, case_insensitive: bool) -> Unsafe {
|
||||||
if self.eat_keyword(kw::Unsafe) {
|
if self.eat_keyword_case(kw::Unsafe, case_insensitive) {
|
||||||
Unsafe::Yes(self.prev_token.uninterpolated_span())
|
Unsafe::Yes(self.prev_token.uninterpolated_span())
|
||||||
} else {
|
} else {
|
||||||
Unsafe::No
|
Unsafe::No
|
||||||
@ -1141,10 +1155,10 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parses constness: `const` or nothing.
|
/// Parses constness: `const` or nothing.
|
||||||
fn parse_constness(&mut self) -> Const {
|
fn parse_constness(&mut self, case_insensitive: bool) -> Const {
|
||||||
// Avoid const blocks to be parsed as const items
|
// Avoid const blocks to be parsed as const items
|
||||||
if self.look_ahead(1, |t| t != &token::OpenDelim(Delimiter::Brace))
|
if self.look_ahead(1, |t| t != &token::OpenDelim(Delimiter::Brace))
|
||||||
&& self.eat_keyword(kw::Const)
|
&& self.eat_keyword_case(kw::Const, case_insensitive)
|
||||||
{
|
{
|
||||||
Const::Yes(self.prev_token.uninterpolated_span())
|
Const::Yes(self.prev_token.uninterpolated_span())
|
||||||
} else {
|
} else {
|
||||||
@ -1399,8 +1413,8 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Parses `extern string_literal?`.
|
/// Parses `extern string_literal?`.
|
||||||
fn parse_extern(&mut self) -> Extern {
|
fn parse_extern(&mut self, case_insensitive: bool) -> Extern {
|
||||||
if self.eat_keyword(kw::Extern) {
|
if self.eat_keyword_case(kw::Extern, case_insensitive) {
|
||||||
let mut extern_span = self.prev_token.span;
|
let mut extern_span = self.prev_token.span;
|
||||||
let abi = self.parse_abi();
|
let abi = self.parse_abi();
|
||||||
if let Some(abi) = abi {
|
if let Some(abi) = abi {
|
||||||
|
@ -267,7 +267,7 @@ impl<'a> Parser<'a> {
|
|||||||
} else if self.eat_keyword(kw::Underscore) {
|
} else if self.eat_keyword(kw::Underscore) {
|
||||||
// A type to be inferred `_`
|
// A type to be inferred `_`
|
||||||
TyKind::Infer
|
TyKind::Infer
|
||||||
} else if self.check_fn_front_matter(false) {
|
} else if self.check_fn_front_matter(false, false) {
|
||||||
// Function pointer type
|
// Function pointer type
|
||||||
self.parse_ty_bare_fn(lo, Vec::new(), recover_return_sign)?
|
self.parse_ty_bare_fn(lo, Vec::new(), recover_return_sign)?
|
||||||
} else if self.check_keyword(kw::For) {
|
} else if self.check_keyword(kw::For) {
|
||||||
@ -275,7 +275,7 @@ impl<'a> Parser<'a> {
|
|||||||
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
|
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
|
||||||
// `for<'lt> Trait1<'lt> + Trait2 + 'a`
|
// `for<'lt> Trait1<'lt> + Trait2 + 'a`
|
||||||
let lifetime_defs = self.parse_late_bound_lifetime_defs()?;
|
let lifetime_defs = self.parse_late_bound_lifetime_defs()?;
|
||||||
if self.check_fn_front_matter(false) {
|
if self.check_fn_front_matter(false, false) {
|
||||||
self.parse_ty_bare_fn(lo, lifetime_defs, recover_return_sign)?
|
self.parse_ty_bare_fn(lo, lifetime_defs, recover_return_sign)?
|
||||||
} else {
|
} else {
|
||||||
let path = self.parse_path(PathStyle::Type)?;
|
let path = self.parse_path(PathStyle::Type)?;
|
||||||
|
@ -1,7 +1,34 @@
|
|||||||
// run-rustfix
|
// run-rustfix
|
||||||
|
// edition:2018
|
||||||
#![allow(unused_imports)]
|
#![allow(unused_imports)]
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
use std::ptr::read; //~ ERROR keyword `use` is written in a wrong case
|
use std::ptr::read; //~ ERROR keyword `use` is written in a wrong case
|
||||||
use std::ptr::write; //~ ERROR keyword `use` is written in a wrong case
|
use std::ptr::write; //~ ERROR keyword `use` is written in a wrong case
|
||||||
|
|
||||||
|
async fn _a() {}
|
||||||
|
//~^ ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
fn _b() {}
|
||||||
|
//~^ ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
async fn _c() {}
|
||||||
|
//~^ ERROR keyword `async` is written in a wrong case
|
||||||
|
//~| ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
async fn _d() {}
|
||||||
|
//~^ ERROR keyword `async` is written in a wrong case
|
||||||
|
|
||||||
|
const unsafe fn _e() {}
|
||||||
|
//~^ ERROR keyword `const` is written in a wrong case
|
||||||
|
//~| ERROR keyword `unsafe` is written in a wrong case
|
||||||
|
//~| ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
unsafe extern fn _f() {}
|
||||||
|
//~^ ERROR keyword `unsafe` is written in a wrong case
|
||||||
|
//~| ERROR keyword `extern` is written in a wrong case
|
||||||
|
|
||||||
|
extern "C" fn _g() {}
|
||||||
|
//~^ ERROR keyword `extern` is written in a wrong case
|
||||||
|
//~| ERROR keyword `fn` is written in a wrong case
|
||||||
|
@ -1,7 +1,34 @@
|
|||||||
// run-rustfix
|
// run-rustfix
|
||||||
|
// edition:2018
|
||||||
#![allow(unused_imports)]
|
#![allow(unused_imports)]
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
||||||
Use std::ptr::read; //~ ERROR keyword `use` is written in a wrong case
|
Use std::ptr::read; //~ ERROR keyword `use` is written in a wrong case
|
||||||
USE std::ptr::write; //~ ERROR keyword `use` is written in a wrong case
|
USE std::ptr::write; //~ ERROR keyword `use` is written in a wrong case
|
||||||
|
|
||||||
|
async Fn _a() {}
|
||||||
|
//~^ ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
Fn _b() {}
|
||||||
|
//~^ ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
aSYNC fN _c() {}
|
||||||
|
//~^ ERROR keyword `async` is written in a wrong case
|
||||||
|
//~| ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
Async fn _d() {}
|
||||||
|
//~^ ERROR keyword `async` is written in a wrong case
|
||||||
|
|
||||||
|
CONST UNSAFE FN _e() {}
|
||||||
|
//~^ ERROR keyword `const` is written in a wrong case
|
||||||
|
//~| ERROR keyword `unsafe` is written in a wrong case
|
||||||
|
//~| ERROR keyword `fn` is written in a wrong case
|
||||||
|
|
||||||
|
unSAFE EXTern fn _f() {}
|
||||||
|
//~^ ERROR keyword `unsafe` is written in a wrong case
|
||||||
|
//~| ERROR keyword `extern` is written in a wrong case
|
||||||
|
|
||||||
|
EXTERN "C" FN _g() {}
|
||||||
|
//~^ ERROR keyword `extern` is written in a wrong case
|
||||||
|
//~| ERROR keyword `fn` is written in a wrong case
|
||||||
|
@ -1,14 +1,86 @@
|
|||||||
error: keyword `use` is written in a wrong case
|
error: keyword `use` is written in a wrong case
|
||||||
--> $DIR/item-kw-case-mismatch.rs:6:1
|
--> $DIR/item-kw-case-mismatch.rs:7:1
|
||||||
|
|
|
|
||||||
LL | Use std::ptr::read;
|
LL | Use std::ptr::read;
|
||||||
| ^^^ help: write it in the correct case (notice the capitalization): `use`
|
| ^^^ help: write it in the correct case (notice the capitalization): `use`
|
||||||
|
|
||||||
error: keyword `use` is written in a wrong case
|
error: keyword `use` is written in a wrong case
|
||||||
--> $DIR/item-kw-case-mismatch.rs:7:1
|
--> $DIR/item-kw-case-mismatch.rs:8:1
|
||||||
|
|
|
|
||||||
LL | USE std::ptr::write;
|
LL | USE std::ptr::write;
|
||||||
| ^^^ help: write it in the correct case: `use`
|
| ^^^ help: write it in the correct case: `use`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: keyword `fn` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:10:7
|
||||||
|
|
|
||||||
|
LL | async Fn _a() {}
|
||||||
|
| ^^ help: write it in the correct case (notice the capitalization): `fn`
|
||||||
|
|
||||||
|
error: keyword `fn` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:13:1
|
||||||
|
|
|
||||||
|
LL | Fn _b() {}
|
||||||
|
| ^^ help: write it in the correct case (notice the capitalization): `fn`
|
||||||
|
|
||||||
|
error: keyword `async` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:16:1
|
||||||
|
|
|
||||||
|
LL | aSYNC fN _c() {}
|
||||||
|
| ^^^^^ help: write it in the correct case: `async`
|
||||||
|
|
||||||
|
error: keyword `fn` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:16:7
|
||||||
|
|
|
||||||
|
LL | aSYNC fN _c() {}
|
||||||
|
| ^^ help: write it in the correct case: `fn`
|
||||||
|
|
||||||
|
error: keyword `async` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:20:1
|
||||||
|
|
|
||||||
|
LL | Async fn _d() {}
|
||||||
|
| ^^^^^ help: write it in the correct case: `async`
|
||||||
|
|
||||||
|
error: keyword `const` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:23:1
|
||||||
|
|
|
||||||
|
LL | CONST UNSAFE FN _e() {}
|
||||||
|
| ^^^^^ help: write it in the correct case: `const`
|
||||||
|
|
||||||
|
error: keyword `unsafe` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:23:7
|
||||||
|
|
|
||||||
|
LL | CONST UNSAFE FN _e() {}
|
||||||
|
| ^^^^^^ help: write it in the correct case: `unsafe`
|
||||||
|
|
||||||
|
error: keyword `fn` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:23:14
|
||||||
|
|
|
||||||
|
LL | CONST UNSAFE FN _e() {}
|
||||||
|
| ^^ help: write it in the correct case: `fn`
|
||||||
|
|
||||||
|
error: keyword `unsafe` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:28:1
|
||||||
|
|
|
||||||
|
LL | unSAFE EXTern fn _f() {}
|
||||||
|
| ^^^^^^ help: write it in the correct case: `unsafe`
|
||||||
|
|
||||||
|
error: keyword `extern` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:28:8
|
||||||
|
|
|
||||||
|
LL | unSAFE EXTern fn _f() {}
|
||||||
|
| ^^^^^^ help: write it in the correct case: `extern`
|
||||||
|
|
||||||
|
error: keyword `extern` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:32:1
|
||||||
|
|
|
||||||
|
LL | EXTERN "C" FN _g() {}
|
||||||
|
| ^^^^^^ help: write it in the correct case: `extern`
|
||||||
|
|
||||||
|
error: keyword `fn` is written in a wrong case
|
||||||
|
--> $DIR/item-kw-case-mismatch.rs:32:12
|
||||||
|
|
|
||||||
|
LL | EXTERN "C" FN _g() {}
|
||||||
|
| ^^ help: write it in the correct case: `fn`
|
||||||
|
|
||||||
|
error: aborting due to 14 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user