1
Fork 0

Rollup merge of #60751 - Centril:general-cleanup, r=petrochenkov

Assorted cleanup in parser & AST validation

r? @petrochenkov

Extracted out of a larger PR.
This commit is contained in:
Mazdak Farrokhzad 2019-05-12 21:14:10 +02:00 committed by GitHub
commit c0aeaa1bfd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 60 deletions

View file

@ -54,21 +54,21 @@ struct AstValidator<'a> {
has_proc_macro_decls: bool, has_proc_macro_decls: bool,
has_global_allocator: bool, has_global_allocator: bool,
// Used to ban nested `impl Trait`, e.g., `impl Into<impl Debug>`. /// Used to ban nested `impl Trait`, e.g., `impl Into<impl Debug>`.
// Nested `impl Trait` _is_ allowed in associated type position, /// Nested `impl Trait` _is_ allowed in associated type position,
// e.g `impl Iterator<Item=impl Debug>` /// e.g `impl Iterator<Item=impl Debug>`
outer_impl_trait: Option<OuterImplTrait>, outer_impl_trait: Option<OuterImplTrait>,
// Used to ban `impl Trait` in path projections like `<impl Iterator>::Item` /// Used to ban `impl Trait` in path projections like `<impl Iterator>::Item`
// or `Foo::Bar<impl Trait>` /// or `Foo::Bar<impl Trait>`
is_impl_trait_banned: bool, is_impl_trait_banned: bool,
// rust-lang/rust#57979: the ban of nested `impl Trait` was buggy /// rust-lang/rust#57979: the ban of nested `impl Trait` was buggy
// until PRs #57730 and #57981 landed: it would jump directly to /// until PRs #57730 and #57981 landed: it would jump directly to
// walk_ty rather than visit_ty (or skip recurring entirely for /// walk_ty rather than visit_ty (or skip recurring entirely for
// impl trait in projections), and thus miss some cases. We track /// impl trait in projections), and thus miss some cases. We track
// whether we should downgrade to a warning for short-term via /// whether we should downgrade to a warning for short-term via
// these booleans. /// these booleans.
warning_period_57979_didnt_record_next_impl_trait: bool, warning_period_57979_didnt_record_next_impl_trait: bool,
warning_period_57979_impl_trait_in_proj: bool, warning_period_57979_impl_trait_in_proj: bool,
} }

View file

@ -1877,7 +1877,7 @@ impl<'a> Parser<'a> {
Ok(MutTy { ty: t, mutbl: mutbl }) Ok(MutTy { ty: t, mutbl: mutbl })
} }
fn is_named_argument(&mut self) -> bool { fn is_named_argument(&self) -> bool {
let offset = match self.token { let offset = match self.token {
token::Interpolated(ref nt) => match **nt { token::Interpolated(ref nt) => match **nt {
token::NtPat(..) => return self.look_ahead(1, |t| t == &token::Colon), token::NtPat(..) => return self.look_ahead(1, |t| t == &token::Colon),
@ -2469,27 +2469,27 @@ impl<'a> Parser<'a> {
}) })
} }
fn mk_expr(&mut self, span: Span, node: ExprKind, attrs: ThinVec<Attribute>) -> P<Expr> { fn mk_expr(&self, span: Span, node: ExprKind, attrs: ThinVec<Attribute>) -> P<Expr> {
P(Expr { node, span, attrs, id: ast::DUMMY_NODE_ID }) P(Expr { node, span, attrs, id: ast::DUMMY_NODE_ID })
} }
fn mk_unary(&mut self, unop: ast::UnOp, expr: P<Expr>) -> ast::ExprKind { fn mk_unary(&self, unop: ast::UnOp, expr: P<Expr>) -> ast::ExprKind {
ExprKind::Unary(unop, expr) ExprKind::Unary(unop, expr)
} }
fn mk_binary(&mut self, binop: ast::BinOp, lhs: P<Expr>, rhs: P<Expr>) -> ast::ExprKind { fn mk_binary(&self, binop: ast::BinOp, lhs: P<Expr>, rhs: P<Expr>) -> ast::ExprKind {
ExprKind::Binary(binop, lhs, rhs) ExprKind::Binary(binop, lhs, rhs)
} }
fn mk_call(&mut self, f: P<Expr>, args: Vec<P<Expr>>) -> ast::ExprKind { fn mk_call(&self, f: P<Expr>, args: Vec<P<Expr>>) -> ast::ExprKind {
ExprKind::Call(f, args) ExprKind::Call(f, args)
} }
fn mk_index(&mut self, expr: P<Expr>, idx: P<Expr>) -> ast::ExprKind { fn mk_index(&self, expr: P<Expr>, idx: P<Expr>) -> ast::ExprKind {
ExprKind::Index(expr, idx) ExprKind::Index(expr, idx)
} }
fn mk_range(&mut self, fn mk_range(&self,
start: Option<P<Expr>>, start: Option<P<Expr>>,
end: Option<P<Expr>>, end: Option<P<Expr>>,
limits: RangeLimits) limits: RangeLimits)
@ -2501,7 +2501,7 @@ impl<'a> Parser<'a> {
} }
} }
fn mk_assign_op(&mut self, binop: ast::BinOp, fn mk_assign_op(&self, binop: ast::BinOp,
lhs: P<Expr>, rhs: P<Expr>) -> ast::ExprKind { lhs: P<Expr>, rhs: P<Expr>) -> ast::ExprKind {
ExprKind::AssignOp(binop, lhs, rhs) ExprKind::AssignOp(binop, lhs, rhs)
} }
@ -2641,13 +2641,12 @@ impl<'a> Parser<'a> {
hi = path.span; hi = path.span;
return Ok(self.mk_expr(lo.to(hi), ExprKind::Path(Some(qself), path), attrs)); return Ok(self.mk_expr(lo.to(hi), ExprKind::Path(Some(qself), path), attrs));
} }
if self.span.rust_2018() && self.check_keyword(keywords::Async) if self.span.rust_2018() && self.check_keyword(keywords::Async) {
{ return if self.is_async_block() { // check for `async {` and `async move {`
if self.is_async_block() { // check for `async {` and `async move {` self.parse_async_block(attrs)
return self.parse_async_block(attrs);
} else { } else {
return self.parse_lambda_expr(attrs); self.parse_lambda_expr(attrs)
} };
} }
if self.check_keyword(keywords::Move) || self.check_keyword(keywords::Static) { if self.check_keyword(keywords::Move) || self.check_keyword(keywords::Static) {
return self.parse_lambda_expr(attrs); return self.parse_lambda_expr(attrs);
@ -3572,7 +3571,8 @@ impl<'a> Parser<'a> {
} else { } else {
self.restrictions self.restrictions
}; };
if op.precedence() < min_prec { let prec = op.precedence();
if prec < min_prec {
break; break;
} }
// Check for deprecated `...` syntax // Check for deprecated `...` syntax
@ -3613,8 +3613,7 @@ impl<'a> Parser<'a> {
// We have 2 alternatives here: `x..y`/`x..=y` and `x..`/`x..=` The other // We have 2 alternatives here: `x..y`/`x..=y` and `x..`/`x..=` The other
// two variants are handled with `parse_prefix_range_expr` call above. // two variants are handled with `parse_prefix_range_expr` call above.
let rhs = if self.is_at_start_of_range_notation_rhs() { let rhs = if self.is_at_start_of_range_notation_rhs() {
Some(self.parse_assoc_expr_with(op.precedence() + 1, Some(self.parse_assoc_expr_with(prec + 1, LhsExpr::NotYetParsed)?)
LhsExpr::NotYetParsed)?)
} else { } else {
None None
}; };
@ -3634,28 +3633,18 @@ impl<'a> Parser<'a> {
break break
} }
let rhs = match op.fixity() { let fixity = op.fixity();
Fixity::Right => self.with_res( let prec_adjustment = match fixity {
restrictions - Restrictions::STMT_EXPR, Fixity::Right => 0,
|this| { Fixity::Left => 1,
this.parse_assoc_expr_with(op.precedence(),
LhsExpr::NotYetParsed)
}),
Fixity::Left => self.with_res(
restrictions - Restrictions::STMT_EXPR,
|this| {
this.parse_assoc_expr_with(op.precedence() + 1,
LhsExpr::NotYetParsed)
}),
// We currently have no non-associative operators that are not handled above by // We currently have no non-associative operators that are not handled above by
// the special cases. The code is here only for future convenience. // the special cases. The code is here only for future convenience.
Fixity::None => self.with_res( Fixity::None => 1,
restrictions - Restrictions::STMT_EXPR, };
|this| { let rhs = self.with_res(
this.parse_assoc_expr_with(op.precedence() + 1, restrictions - Restrictions::STMT_EXPR,
LhsExpr::NotYetParsed) |this| this.parse_assoc_expr_with(prec + prec_adjustment, LhsExpr::NotYetParsed)
}), )?;
}?;
// Make sure that the span of the parent node is larger than the span of lhs and rhs, // Make sure that the span of the parent node is larger than the span of lhs and rhs,
// including the attributes. // including the attributes.
@ -3701,7 +3690,7 @@ impl<'a> Parser<'a> {
} }
}; };
if op.fixity() == Fixity::None { break } if let Fixity::None = fixity { break }
} }
Ok(lhs) Ok(lhs)
} }
@ -3838,7 +3827,7 @@ impl<'a> Parser<'a> {
/// Produce an error if comparison operators are chained (RFC #558). /// Produce an error if comparison operators are chained (RFC #558).
/// We only need to check lhs, not rhs, because all comparison ops /// We only need to check lhs, not rhs, because all comparison ops
/// have same precedence and are left-associative /// have same precedence and are left-associative
fn check_no_chained_comparison(&mut self, lhs: &Expr, outer_op: &AssocOp) { fn check_no_chained_comparison(&self, lhs: &Expr, outer_op: &AssocOp) {
debug_assert!(outer_op.is_comparison(), debug_assert!(outer_op.is_comparison(),
"check_no_chained_comparison: {:?} is not comparison", "check_no_chained_comparison: {:?} is not comparison",
outer_op); outer_op);
@ -5133,7 +5122,7 @@ impl<'a> Parser<'a> {
}) })
} }
fn is_async_block(&mut self) -> bool { fn is_async_block(&self) -> bool {
self.token.is_keyword(keywords::Async) && self.token.is_keyword(keywords::Async) &&
( (
( // `async move {` ( // `async move {`
@ -5145,19 +5134,19 @@ impl<'a> Parser<'a> {
) )
} }
fn is_async_fn(&mut self) -> bool { fn is_async_fn(&self) -> bool {
self.token.is_keyword(keywords::Async) && self.token.is_keyword(keywords::Async) &&
self.look_ahead(1, |t| t.is_keyword(keywords::Fn)) self.look_ahead(1, |t| t.is_keyword(keywords::Fn))
} }
fn is_do_catch_block(&mut self) -> bool { fn is_do_catch_block(&self) -> bool {
self.token.is_keyword(keywords::Do) && self.token.is_keyword(keywords::Do) &&
self.look_ahead(1, |t| t.is_keyword(keywords::Catch)) && self.look_ahead(1, |t| t.is_keyword(keywords::Catch)) &&
self.look_ahead(2, |t| *t == token::OpenDelim(token::Brace)) && self.look_ahead(2, |t| *t == token::OpenDelim(token::Brace)) &&
!self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL) !self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL)
} }
fn is_try_block(&mut self) -> bool { fn is_try_block(&self) -> bool {
self.token.is_keyword(keywords::Try) && self.token.is_keyword(keywords::Try) &&
self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace)) && self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace)) &&
self.span.rust_2018() && self.span.rust_2018() &&
@ -5179,7 +5168,7 @@ impl<'a> Parser<'a> {
self.look_ahead(1, |t| t.is_keyword(keywords::Type)) self.look_ahead(1, |t| t.is_keyword(keywords::Type))
} }
fn is_auto_trait_item(&mut self) -> bool { fn is_auto_trait_item(&self) -> bool {
// auto trait // auto trait
(self.token.is_keyword(keywords::Auto) (self.token.is_keyword(keywords::Auto)
&& self.look_ahead(1, |t| t.is_keyword(keywords::Trait))) && self.look_ahead(1, |t| t.is_keyword(keywords::Trait)))
@ -5441,7 +5430,7 @@ impl<'a> Parser<'a> {
} }
/// Checks if this expression is a successfully parsed statement. /// Checks if this expression is a successfully parsed statement.
fn expr_is_complete(&mut self, e: &Expr) -> bool { fn expr_is_complete(&self, e: &Expr) -> bool {
self.restrictions.contains(Restrictions::STMT_EXPR) && self.restrictions.contains(Restrictions::STMT_EXPR) &&
!classify::expr_requires_semi_to_be_stmt(e) !classify::expr_requires_semi_to_be_stmt(e)
} }
@ -6509,7 +6498,7 @@ impl<'a> Parser<'a> {
Ok((id, generics)) Ok((id, generics))
} }
fn mk_item(&mut self, span: Span, ident: Ident, node: ItemKind, vis: Visibility, fn mk_item(&self, span: Span, ident: Ident, node: ItemKind, vis: Visibility,
attrs: Vec<Attribute>) -> P<Item> { attrs: Vec<Attribute>) -> P<Item> {
P(Item { P(Item {
ident, ident,
@ -6541,7 +6530,7 @@ impl<'a> Parser<'a> {
/// Returns `true` if we are looking at `const ID` /// Returns `true` if we are looking at `const ID`
/// (returns `false` for things like `const fn`, etc.). /// (returns `false` for things like `const fn`, etc.).
fn is_const_item(&mut self) -> bool { fn is_const_item(&self) -> bool {
self.token.is_keyword(keywords::Const) && self.token.is_keyword(keywords::Const) &&
!self.look_ahead(1, |t| t.is_keyword(keywords::Fn)) && !self.look_ahead(1, |t| t.is_keyword(keywords::Fn)) &&
!self.look_ahead(1, |t| t.is_keyword(keywords::Unsafe)) !self.look_ahead(1, |t| t.is_keyword(keywords::Unsafe))
@ -6649,7 +6638,7 @@ impl<'a> Parser<'a> {
}) })
} }
fn complain_if_pub_macro(&mut self, vis: &VisibilityKind, sp: Span) { fn complain_if_pub_macro(&self, vis: &VisibilityKind, sp: Span) {
match *vis { match *vis {
VisibilityKind::Inherited => {} VisibilityKind::Inherited => {}
_ => { _ => {
@ -6678,7 +6667,7 @@ impl<'a> Parser<'a> {
} }
} }
fn missing_assoc_item_kind_err(&mut self, item_type: &str, prev_span: Span) fn missing_assoc_item_kind_err(&self, item_type: &str, prev_span: Span)
-> DiagnosticBuilder<'a> -> DiagnosticBuilder<'a>
{ {
let expected_kinds = if item_type == "extern" { let expected_kinds = if item_type == "extern" {