parent
311fa1f14d
commit
7190bc3097
9 changed files with 206 additions and 54 deletions
|
@ -4,9 +4,10 @@ use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
|
|||
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::token::{self, Token, TokenKind};
|
||||
use rustc_ast::{self as ast, BareFnTy, FnRetTy, GenericParam, Lifetime, MutTy, Ty, TyKind};
|
||||
use rustc_ast::{GenericBound, GenericBounds, MacCall, Mutability};
|
||||
use rustc_ast::{PolyTraitRef, TraitBoundModifier, TraitObjectSyntax};
|
||||
use rustc_ast::{
|
||||
self as ast, BareFnTy, FnRetTy, GenericBound, GenericBounds, GenericParam, Generics, Lifetime,
|
||||
MacCall, MutTy, Mutability, PolyTraitRef, TraitBoundModifier, TraitObjectSyntax, Ty, TyKind,
|
||||
};
|
||||
use rustc_errors::{pluralize, struct_span_err, Applicability, PResult};
|
||||
use rustc_span::source_map::Span;
|
||||
use rustc_span::symbol::{kw, sym};
|
||||
|
@ -98,6 +99,20 @@ impl<'a> Parser<'a> {
|
|||
AllowCVariadic::No,
|
||||
RecoverQPath::Yes,
|
||||
RecoverReturnSign::Yes,
|
||||
None,
|
||||
)
|
||||
}
|
||||
|
||||
pub(super) fn parse_ty_with_generics_recovery(
|
||||
&mut self,
|
||||
ty_params: &Generics,
|
||||
) -> PResult<'a, P<Ty>> {
|
||||
self.parse_ty_common(
|
||||
AllowPlus::Yes,
|
||||
AllowCVariadic::No,
|
||||
RecoverQPath::Yes,
|
||||
RecoverReturnSign::Yes,
|
||||
Some(ty_params),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -110,6 +125,7 @@ impl<'a> Parser<'a> {
|
|||
AllowCVariadic::Yes,
|
||||
RecoverQPath::Yes,
|
||||
RecoverReturnSign::Yes,
|
||||
None,
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -125,6 +141,7 @@ impl<'a> Parser<'a> {
|
|||
AllowCVariadic::No,
|
||||
RecoverQPath::Yes,
|
||||
RecoverReturnSign::Yes,
|
||||
None,
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -135,6 +152,7 @@ impl<'a> Parser<'a> {
|
|||
AllowCVariadic::Yes,
|
||||
RecoverQPath::Yes,
|
||||
RecoverReturnSign::OnlyFatArrow,
|
||||
None,
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -152,6 +170,7 @@ impl<'a> Parser<'a> {
|
|||
AllowCVariadic::No,
|
||||
recover_qpath,
|
||||
recover_return_sign,
|
||||
None,
|
||||
)?;
|
||||
FnRetTy::Ty(ty)
|
||||
} else if recover_return_sign.can_recover(&self.token.kind) {
|
||||
|
@ -171,6 +190,7 @@ impl<'a> Parser<'a> {
|
|||
AllowCVariadic::No,
|
||||
recover_qpath,
|
||||
recover_return_sign,
|
||||
None,
|
||||
)?;
|
||||
FnRetTy::Ty(ty)
|
||||
} else {
|
||||
|
@ -184,6 +204,7 @@ impl<'a> Parser<'a> {
|
|||
allow_c_variadic: AllowCVariadic,
|
||||
recover_qpath: RecoverQPath,
|
||||
recover_return_sign: RecoverReturnSign,
|
||||
ty_generics: Option<&Generics>,
|
||||
) -> PResult<'a, P<Ty>> {
|
||||
let allow_qpath_recovery = recover_qpath == RecoverQPath::Yes;
|
||||
maybe_recover_from_interpolated_ty_qpath!(self, allow_qpath_recovery);
|
||||
|
@ -233,7 +254,7 @@ impl<'a> Parser<'a> {
|
|||
let (qself, path) = self.parse_qpath(PathStyle::Type)?;
|
||||
TyKind::Path(Some(qself), path)
|
||||
} else if self.check_path() {
|
||||
self.parse_path_start_ty(lo, allow_plus)?
|
||||
self.parse_path_start_ty(lo, allow_plus, ty_generics)?
|
||||
} else if self.can_begin_bound() {
|
||||
self.parse_bare_trait_object(lo, allow_plus)?
|
||||
} else if self.eat(&token::DotDotDot) {
|
||||
|
@ -512,9 +533,14 @@ impl<'a> Parser<'a> {
|
|||
/// 1. a type macro, `mac!(...)`,
|
||||
/// 2. a bare trait object, `B0 + ... + Bn`,
|
||||
/// 3. or a path, `path::to::MyType`.
|
||||
fn parse_path_start_ty(&mut self, lo: Span, allow_plus: AllowPlus) -> PResult<'a, TyKind> {
|
||||
fn parse_path_start_ty(
|
||||
&mut self,
|
||||
lo: Span,
|
||||
allow_plus: AllowPlus,
|
||||
ty_generics: Option<&Generics>,
|
||||
) -> PResult<'a, TyKind> {
|
||||
// Simple path
|
||||
let path = self.parse_path(PathStyle::Type)?;
|
||||
let path = self.parse_path_inner(PathStyle::Type, ty_generics)?;
|
||||
if self.eat(&token::Not) {
|
||||
// Macro invocation in type position
|
||||
Ok(TyKind::MacCall(MacCall {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue