Avoid double-collection for expression nonterminals
This commit is contained in:
@@ -128,22 +128,7 @@ impl<'a> Parser<'a> {
|
||||
})?)
|
||||
}
|
||||
|
||||
// If there are attributes present, then `parse_expr` will end up collecting tokens,
|
||||
// turning the outer `collect_tokens_no_attrs` into a no-op due to the already present
|
||||
// tokens. If there are *not* attributes present, then the outer
|
||||
// `collect_tokens_no_attrs` will ensure that we will end up collecting tokens for the
|
||||
// expressions.
|
||||
//
|
||||
// This is less efficient than it could be, since the outer `collect_tokens_no_attrs`
|
||||
// still needs to snapshot the `TokenCursor` before calling `parse_expr`, even when
|
||||
// `parse_expr` will end up collecting tokens. Ideally, this would work more like
|
||||
// `parse_item`, and take in a `ForceCollect` parameter. However, this would require
|
||||
// adding a `ForceCollect` parameter in a bunch of places in expression parsing
|
||||
// for little gain. If the perf impact from this turns out to be noticeable, we should
|
||||
// revisit this apporach.
|
||||
NonterminalKind::Expr => {
|
||||
token::NtExpr(self.collect_tokens_no_attrs(|this| this.parse_expr())?)
|
||||
}
|
||||
NonterminalKind::Expr => token::NtExpr(self.parse_expr_force_collect()?),
|
||||
NonterminalKind::Literal => {
|
||||
// The `:literal` matcher does not support attributes
|
||||
token::NtLiteral(
|
||||
|
||||
Reference in New Issue
Block a user