@@ -61,13 +61,62 @@ mod mut_visit {
6161}
6262
6363bitflags:: bitflags! {
64+ /// Restrictions applied while parsing.
65+ ///
66+ /// The parser maintains a bitset of restrictions it will honor while
67+ /// parsing. This is essentially used as a way of tracking state of what
68+ /// is being parsed and to change behavior based on that.
6469 #[ derive( Clone , Copy , Debug ) ]
6570 struct Restrictions : u8 {
71+ /// Restricts expressions for use in statement position.
72+ ///
73+ /// When expressions are used in various places, like statements or
74+ /// match arms, this is used to stop parsing once certain tokens are
75+ /// reached.
76+ ///
77+ /// For example, `if true {} & 1` with `STMT_EXPR` in effect is parsed
78+ /// as two separate expression statements (`if` and a reference to 1).
79+ /// Otherwise it is parsed as a bitwise AND where `if` is on the left
80+ /// and 1 is on the right.
6681 const STMT_EXPR = 1 << 0 ;
82+ /// Do not allow struct literals.
83+ ///
84+ /// There are several places in the grammar where we don't want to
85+ /// allow struct literals because they can require lookahead, or
86+ /// otherwise could be ambiguous or cause confusion. For example,
87+ /// `if Foo {} {}` isn't clear if it is `Foo{}` struct literal, or
88+ /// just `Foo` is the condition, followed by a consequent block,
89+ /// followed by an empty block.
90+ ///
91+ /// See [RFC 92](https://rust-lang.github.io/rfcs/0092-struct-grammar.html).
6792 const NO_STRUCT_LITERAL = 1 << 1 ;
93+ /// Used to provide better error messages for const generic arguments.
94+ ///
95+ /// An un-braced const generic argument is limited to a very small
96+ /// subset of expressions. This is used to detect the situation where
97+ /// an expression outside of that subset is used, and to suggest to
98+ /// wrap the expression in braces.
6899 const CONST_EXPR = 1 << 2 ;
100+ /// Allows `let` expressions.
101+ ///
102+ /// `let pattern = scrutinee` is parsed as an expression, but it is
103+ /// only allowed in let chains (`if` and `while` conditions).
104+ /// Otherwise it is not an expression (note that `let` in statement
105+ /// positions is treated as a `StmtKind::Let` statement, which has a
106+ /// slightly different grammar).
69107 const ALLOW_LET = 1 << 3 ;
108+ /// Used to detect a missing `=>` in a match guard.
109+ ///
110+ /// This is used for error handling in a match guard to give a better
111+ /// error message if the `=>` is missing. It is set when parsing the
112+ /// guard expression.
70113 const IN_IF_GUARD = 1 << 4 ;
114+ /// Used to detect the incorrect use of expressions in patterns.
115+ ///
116+ /// This is used for error handling while parsing a pattern. During
117+ /// error recovery, this will be set to try to parse the pattern as an
118+ /// expression, but halts parsing the expression when reaching certain
119+ /// tokens like `=`.
71120 const IS_PAT = 1 << 5 ;
72121 }
73122}
0 commit comments