Jelajahi Sumber

Rename `StateStackEntry` to `State` (#5256)

Also clean up `State` -> `StateKind` in the toolchain docs, which was
missed in #5249.
Geoff Romer 1 tahun lalu
induk
melakukan
87f0e9723f

+ 13 - 13
toolchain/docs/parse.md

@@ -462,9 +462,9 @@ switches to the expression-statement state.
 Depending on the introducer, different actions can be taken. The most common
 Depending on the introducer, different actions can be taken. The most common
 case is to:
 case is to:
 
 
--   Call `context.PushState(State::___);` to mark the beginning of the statement
-    or declaration and indicate the state that will handle the tokens after the
-    introducer.
+-   Call `context.PushState(StateKind::___);` to mark the beginning of the
+    statement or declaration and indicate the state that will handle the tokens
+    after the introducer.
 
 
 -   Call `context.AddLeafNode(NodeKind::___, context.Consume());` to output a
 -   Call `context.AddLeafNode(NodeKind::___, context.Consume());` to output a
     bracketing node for this introducer.
     bracketing node for this introducer.
@@ -513,8 +513,8 @@ declaration or statement.
 
 
 -   **Step 1**: Save the current value of `context.tree().size()`. This could be
 -   **Step 1**: Save the current value of `context.tree().size()`. This could be
     accomplished by calling `context.PushState()`, which saves that value in the
     accomplished by calling `context.PushState()`, which saves that value in the
-    `subtree_start` field of `Context::StateStackEntry`; or by constructing a
-    `Context::StateStackEntry` value directly, as is done in
+    `subtree_start` field of `Context::State`; or by constructing a
+    `Context::State` value directly, as is done in
     [parse/handle_decl_scope_loop.cpp](/toolchain/parse/handle_decl_scope_loop.cpp).
     [parse/handle_decl_scope_loop.cpp](/toolchain/parse/handle_decl_scope_loop.cpp).
     This marks the position of the placeholder node we are going to replace, as
     This marks the position of the placeholder node we are going to replace, as
     well as the beginning of the subtree we are eventually going to emit for
     well as the beginning of the subtree we are eventually going to emit for
@@ -701,10 +701,10 @@ This is handled by the `ExpectAsOrTypeExpression` code from
 if (context.PositionIs(Lex::TokenKind::As)) {
 if (context.PositionIs(Lex::TokenKind::As)) {
   // as <expression> ...
   // as <expression> ...
   context.AddLeafNode(NodeKind::DefaultSelfImplAs, context.Consume());
   context.AddLeafNode(NodeKind::DefaultSelfImplAs, context.Consume());
-  context.PushState(State::Expr);
+  context.PushState(StateKind::Expr);
 } else {
 } else {
   // <expression> as <expression>...
   // <expression> as <expression>...
-  context.PushState(State::ImplBeforeAs);
+  context.PushState(StateKind::ImplBeforeAs);
   context.PushStateForExpr(PrecedenceGroup::ForImplAs());
   context.PushStateForExpr(PrecedenceGroup::ForImplAs());
 }
 }
 ```
 ```
@@ -716,7 +716,7 @@ auto state = context.PopState();
 if (auto as = context.ConsumeIf(Lex::TokenKind::As)) {
 if (auto as = context.ConsumeIf(Lex::TokenKind::As)) {
   context.AddNode(NodeKind::TypeImplAs, *as, state.subtree_start,
   context.AddNode(NodeKind::TypeImplAs, *as, state.subtree_start,
                   state.has_error);
                   state.has_error);
-  context.PushState(State::Expr);
+  context.PushState(StateKind::Expr);
 } else {
 } else {
   if (!state.has_error) {
   if (!state.has_error) {
     CARBON_DIAGNOSTIC(ImplExpectedAs, Error,
     CARBON_DIAGNOSTIC(ImplExpectedAs, Error,
@@ -728,9 +728,9 @@ if (auto as = context.ConsumeIf(Lex::TokenKind::As)) {
 ```
 ```
 
 
 Note (1) that the `state.subtree_start` value comes from the
 Note (1) that the `state.subtree_start` value comes from the
-`context.PushState(State::ImplBeforeAs);` before parsing the type expression,
-and that is how that type expression ends up as the child of the created
-`TypeImplAs` node. Unlike
+`context.PushState(StateKind::ImplBeforeAs);` before parsing the type
+expression, and that is how that type expression ends up as the child of the
+created `TypeImplAs` node. Unlike
 [the previous case 1](#case-1-introducer-to-optional-clause-is-used-as-parent-node),
 [the previous case 1](#case-1-introducer-to-optional-clause-is-used-as-parent-node),
 though, the parent node uses the token after the optional expression, rather
 though, the parent node uses the token after the optional expression, rather
 than an introducer token for the optional clause.
 than an introducer token for the optional clause.
@@ -784,10 +784,10 @@ This is handled by the `ExpectAsOrTypeExpression` code from
 if (context.PositionIs(Lex::TokenKind::As)) {
 if (context.PositionIs(Lex::TokenKind::As)) {
   // as <expression> ...
   // as <expression> ...
   context.AddLeafNode(NodeKind::ImplAs, context.Consume());
   context.AddLeafNode(NodeKind::ImplAs, context.Consume());
-  context.PushState(State::Expr);
+  context.PushState(StateKind::Expr);
 } else {
 } else {
   // <expression> as <expression>...
   // <expression> as <expression>...
-  context.PushState(State::ImplBeforeAs);
+  context.PushState(StateKind::ImplBeforeAs);
   context.PushStateForExpr(PrecedenceGroup::ForImplAs());
   context.PushStateForExpr(PrecedenceGroup::ForImplAs());
 }
 }
 ```
 ```

+ 4 - 5
toolchain/parse/context.cpp

@@ -68,8 +68,8 @@ auto Context::ConsumeAndAddOpenParen(Lex::TokenIndex default_token,
 }
 }
 
 
 auto Context::ConsumeAndAddCloseSymbol(Lex::TokenIndex expected_open,
 auto Context::ConsumeAndAddCloseSymbol(Lex::TokenIndex expected_open,
-                                       StateStackEntry state,
-                                       NodeKind close_kind) -> void {
+                                       State state, NodeKind close_kind)
+    -> void {
   Lex::TokenKind open_token_kind = tokens().GetKind(expected_open);
   Lex::TokenKind open_token_kind = tokens().GetKind(expected_open);
 
 
   if (!open_token_kind.is_opening_symbol()) {
   if (!open_token_kind.is_opening_symbol()) {
@@ -346,8 +346,7 @@ auto Context::ConsumeListToken(NodeKind comma_kind, Lex::TokenKind close_kind,
   }
   }
 }
 }
 
 
-auto Context::AddNodeExpectingDeclSemi(StateStackEntry state,
-                                       NodeKind node_kind,
+auto Context::AddNodeExpectingDeclSemi(State state, NodeKind node_kind,
                                        Lex::TokenKind decl_kind,
                                        Lex::TokenKind decl_kind,
                                        bool is_def_allowed) -> void {
                                        bool is_def_allowed) -> void {
   // TODO: This could better handle things like:
   // TODO: This could better handle things like:
@@ -373,7 +372,7 @@ auto Context::AddNodeExpectingDeclSemi(StateStackEntry state,
   }
   }
 }
 }
 
 
-auto Context::RecoverFromDeclError(StateStackEntry state, NodeKind node_kind,
+auto Context::RecoverFromDeclError(State state, NodeKind node_kind,
                                    bool skip_past_likely_end) -> void {
                                    bool skip_past_likely_end) -> void {
   auto token = state.token;
   auto token = state.token;
   if (skip_past_likely_end) {
   if (skip_past_likely_end) {

+ 15 - 20
toolchain/parse/context.h

@@ -75,8 +75,7 @@ class Context {
   };
   };
 
 
   // Used to track state on state_stack_.
   // Used to track state on state_stack_.
-  // TODO: Rename to `State`.
-  struct StateStackEntry : public Printable<StateStackEntry> {
+  struct State : public Printable<State> {
     // Prints state information for verbose output.
     // Prints state information for verbose output.
     auto Print(llvm::raw_ostream& output) const -> void {
     auto Print(llvm::raw_ostream& output) const -> void {
       output << kind << " @" << token << " subtree_start=" << subtree_start
       output << kind << " @" << token << " subtree_start=" << subtree_start
@@ -111,7 +110,7 @@ class Context {
     int32_t subtree_start;
     int32_t subtree_start;
   };
   };
 
 
-  // We expect StateStackEntry to fit into 12 bytes:
+  // We expect State to fit into 12 bytes:
   //   state = 1 byte
   //   state = 1 byte
   //   has_error and in_var_pattern = 1 byte
   //   has_error and in_var_pattern = 1 byte
   //   ambient_precedence = 1 byte
   //   ambient_precedence = 1 byte
@@ -120,8 +119,7 @@ class Context {
   //   subtree_start = 4 bytes
   //   subtree_start = 4 bytes
   // If it becomes bigger, it'd be worth examining better packing; it should be
   // If it becomes bigger, it'd be worth examining better packing; it should be
   // feasible to pack the 1-byte entries more tightly.
   // feasible to pack the 1-byte entries more tightly.
-  static_assert(sizeof(StateStackEntry) == 12,
-                "StateStackEntry has unexpected size!");
+  static_assert(sizeof(State) == 12, "State has unexpected size!");
 
 
   explicit Context(Tree* tree, Lex::TokenizedBuffer* tokens,
   explicit Context(Tree* tree, Lex::TokenizedBuffer* tokens,
                    Diagnostics::Consumer* consumer,
                    Diagnostics::Consumer* consumer,
@@ -192,9 +190,8 @@ class Context {
   // Creates a parse node of the specified close kind. If `expected_open` is not
   // Creates a parse node of the specified close kind. If `expected_open` is not
   // an opening symbol, the parse node will be associated with `state.token`,
   // an opening symbol, the parse node will be associated with `state.token`,
   // no input will be consumed, and no diagnostic will be emitted.
   // no input will be consumed, and no diagnostic will be emitted.
-  auto ConsumeAndAddCloseSymbol(Lex::TokenIndex expected_open,
-                                StateStackEntry state, NodeKind close_kind)
-      -> void;
+  auto ConsumeAndAddCloseSymbol(Lex::TokenIndex expected_open, State state,
+                                NodeKind close_kind) -> void;
 
 
   // Composes `ConsumeIf` and `AddLeafNode`, returning false when ConsumeIf
   // Composes `ConsumeIf` and `AddLeafNode`, returning false when ConsumeIf
   // fails.
   // fails.
@@ -281,7 +278,7 @@ class Context {
   }
   }
 
 
   // Pops the state and keeps the value for inspection.
   // Pops the state and keeps the value for inspection.
-  auto PopState() -> StateStackEntry {
+  auto PopState() -> State {
     auto back = state_stack_.pop_back_val();
     auto back = state_stack_.pop_back_val();
     CARBON_VLOG("Pop {0}: {1}\n", state_stack_.size(), back);
     CARBON_VLOG("Pop {0}: {1}\n", state_stack_.size(), back);
     return back;
     return back;
@@ -331,7 +328,7 @@ class Context {
   }
   }
 
 
   // Pushes a constructed state onto the stack.
   // Pushes a constructed state onto the stack.
-  auto PushState(StateStackEntry state) -> void {
+  auto PushState(State state) -> void {
     CARBON_VLOG("Push {0}: {1}\n", state_stack_.size(), state);
     CARBON_VLOG("Push {0}: {1}\n", state_stack_.size(), state);
     state_stack_.push_back(state);
     state_stack_.push_back(state);
     CARBON_CHECK(state_stack_.size() < (1 << 20),
     CARBON_CHECK(state_stack_.size() < (1 << 20),
@@ -339,9 +336,9 @@ class Context {
   }
   }
 
 
   // Pushes a constructed state onto the stack, with a different kind.
   // Pushes a constructed state onto the stack, with a different kind.
-  auto PushState(StateStackEntry state_entry, StateKind kind) -> void {
-    state_entry.kind = kind;
-    PushState(state_entry);
+  auto PushState(State state, StateKind kind) -> void {
+    state.kind = kind;
+    PushState(state);
   }
   }
 
 
   // Propagates an error up the state stack, to the parent state.
   // Propagates an error up the state stack, to the parent state.
@@ -350,7 +347,7 @@ class Context {
   // Adds a node for a declaration's semicolon. Includes error recovery when the
   // Adds a node for a declaration's semicolon. Includes error recovery when the
   // token is not a semicolon, using `decl_kind` and `is_def_allowed` to inform
   // token is not a semicolon, using `decl_kind` and `is_def_allowed` to inform
   // diagnostics.
   // diagnostics.
-  auto AddNodeExpectingDeclSemi(StateStackEntry state, NodeKind node_kind,
+  auto AddNodeExpectingDeclSemi(State state, NodeKind node_kind,
                                 Lex::TokenKind decl_kind, bool is_def_allowed)
                                 Lex::TokenKind decl_kind, bool is_def_allowed)
       -> void;
       -> void;
 
 
@@ -365,7 +362,7 @@ class Context {
   // definition has started (although one could be present). Recover to a
   // definition has started (although one could be present). Recover to a
   // semicolon when it makes sense as a possible end, otherwise use the
   // semicolon when it makes sense as a possible end, otherwise use the
   // introducer token for the error.
   // introducer token for the error.
-  auto RecoverFromDeclError(StateStackEntry state, NodeKind node_kind,
+  auto RecoverFromDeclError(State state, NodeKind node_kind,
                             bool skip_past_likely_end) -> void;
                             bool skip_past_likely_end) -> void;
 
 
   // Handles parsing of the library name. Returns the name's ID on success,
   // Handles parsing of the library name. Returns the name's ID on success,
@@ -414,11 +411,9 @@ class Context {
   auto position() -> Lex::TokenIterator& { return position_; }
   auto position() -> Lex::TokenIterator& { return position_; }
   auto position() const -> Lex::TokenIterator { return position_; }
   auto position() const -> Lex::TokenIterator { return position_; }
 
 
-  auto state_stack() -> llvm::SmallVector<StateStackEntry>& {
-    return state_stack_;
-  }
+  auto state_stack() -> llvm::SmallVector<State>& { return state_stack_; }
 
 
-  auto state_stack() const -> const llvm::SmallVector<StateStackEntry>& {
+  auto state_stack() const -> const llvm::SmallVector<State>& {
     return state_stack_;
     return state_stack_;
   }
   }
 
 
@@ -453,7 +448,7 @@ class Context {
   // The FileEnd token.
   // The FileEnd token.
   Lex::TokenIterator end_;
   Lex::TokenIterator end_;
 
 
-  llvm::SmallVector<StateStackEntry> state_stack_;
+  llvm::SmallVector<State> state_stack_;
 
 
   // The deferred definition indexes of functions whose definitions have begun
   // The deferred definition indexes of functions whose definitions have begun
   // but not yet finished.
   // but not yet finished.

+ 1 - 2
toolchain/parse/handle_brace_expr.cpp

@@ -20,8 +20,7 @@ auto HandleBraceExpr(Context& context) -> void {
 }
 }
 
 
 // Prints a diagnostic for brace expression syntax errors.
 // Prints a diagnostic for brace expression syntax errors.
-static auto HandleBraceExprParamError(Context& context,
-                                      Context::StateStackEntry state,
+static auto HandleBraceExprParamError(Context& context, Context::State state,
                                       StateKind param_finish_state_kind)
                                       StateKind param_finish_state_kind)
     -> void {
     -> void {
   Diagnostics::IntAsSelect mode(0);
   Diagnostics::IntAsSelect mode(0);

+ 1 - 1
toolchain/parse/handle_decl_name_and_params.cpp

@@ -10,7 +10,7 @@ namespace Carbon::Parse {
 
 
 // Adds a leaf node for the name, and updates the state stack for parameter
 // Adds a leaf node for the name, and updates the state stack for parameter
 // handling.
 // handling.
-static auto HandleName(Context& context, Context::StateStackEntry state,
+static auto HandleName(Context& context, Context::State state,
                        Lex::TokenIndex name_token,
                        Lex::TokenIndex name_token,
                        NodeKind not_before_params_kind,
                        NodeKind not_before_params_kind,
                        NodeKind not_before_params_qualifier_kind,
                        NodeKind not_before_params_qualifier_kind,

+ 2 - 2
toolchain/parse/handle_decl_scope_loop.cpp

@@ -32,7 +32,7 @@ static auto HandleUnrecognizedDecl(Context& context, int32_t subtree_start)
 
 
 // Replaces the introducer placeholder node, and pushes the introducer state for
 // Replaces the introducer placeholder node, and pushes the introducer state for
 // processing.
 // processing.
-static auto ApplyIntroducer(Context& context, Context::StateStackEntry state,
+static auto ApplyIntroducer(Context& context, Context::State state,
                             NodeKind introducer_kind, StateKind next_state_kind)
                             NodeKind introducer_kind, StateKind next_state_kind)
     -> void {
     -> void {
   context.ReplacePlaceholderNode(state.subtree_start, introducer_kind,
   context.ReplacePlaceholderNode(state.subtree_start, introducer_kind,
@@ -118,7 +118,7 @@ static constexpr auto DeclIntroducers = [] {
 // Returns true if the current position is a declaration. If we see a
 // Returns true if the current position is a declaration. If we see a
 // declaration introducer keyword token, replace the placeholder node and switch
 // declaration introducer keyword token, replace the placeholder node and switch
 // to a state to parse the rest of the declaration.
 // to a state to parse the rest of the declaration.
-static auto TryHandleAsDecl(Context& context, Context::StateStackEntry state,
+static auto TryHandleAsDecl(Context& context, Context::State state,
                             bool saw_modifier) -> bool {
                             bool saw_modifier) -> bool {
   const auto& info = DeclIntroducers[context.PositionKind().AsInt()];
   const auto& info = DeclIntroducers[context.PositionKind().AsInt()];
 
 

+ 1 - 2
toolchain/parse/handle_expr.cpp

@@ -374,8 +374,7 @@ auto HandleExprLoop(Context& context) -> void {
 }
 }
 
 
 // Adds the operator node and returns the main expression loop.
 // Adds the operator node and returns the main expression loop.
-static auto HandleExprLoopForOperator(Context& context,
-                                      Context::StateStackEntry state,
+static auto HandleExprLoopForOperator(Context& context, Context::State state,
                                       NodeKind node_kind) -> void {
                                       NodeKind node_kind) -> void {
   context.AddNode(node_kind, state.token, state.has_error);
   context.AddNode(node_kind, state.token, state.has_error);
   state.has_error = false;
   state.has_error = false;

+ 5 - 5
toolchain/parse/handle_import_and_package.cpp

@@ -13,7 +13,7 @@
 namespace Carbon::Parse {
 namespace Carbon::Parse {
 
 
 // Provides common error exiting logic that skips to the semi, if present.
 // Provides common error exiting logic that skips to the semi, if present.
-static auto OnParseError(Context& context, Context::StateStackEntry state,
+static auto OnParseError(Context& context, Context::State state,
                          NodeKind declaration) -> void {
                          NodeKind declaration) -> void {
   context.AddNode(declaration, context.SkipPastLikelyEnd(state.token),
   context.AddNode(declaration, context.SkipPastLikelyEnd(state.token),
                   /*has_error=*/true);
                   /*has_error=*/true);
@@ -23,7 +23,7 @@ static auto OnParseError(Context& context, Context::StateStackEntry state,
 // the given declaration.
 // the given declaration.
 // TODO: Restructure how we handle packaging declarations to avoid the need to
 // TODO: Restructure how we handle packaging declarations to avoid the need to
 // do this.
 // do this.
-static auto HasModifier(Context& context, Context::StateStackEntry state,
+static auto HasModifier(Context& context, Context::State state,
                         Lex::TokenKind modifier) -> bool {
                         Lex::TokenKind modifier) -> bool {
   for (Lex::TokenIterator it(state.token); it != context.position(); ++it) {
   for (Lex::TokenIterator it(state.token); it != context.position(); ++it) {
     if (context.tokens().GetKind(*it) == modifier) {
     if (context.tokens().GetKind(*it) == modifier) {
@@ -35,7 +35,7 @@ static auto HasModifier(Context& context, Context::StateStackEntry state,
 
 
 // Handles everything after the declaration's introducer.
 // Handles everything after the declaration's introducer.
 template <const Parse::NodeKind& DeclKind>
 template <const Parse::NodeKind& DeclKind>
-static auto HandleDeclContent(Context& context, Context::StateStackEntry state,
+static auto HandleDeclContent(Context& context, Context::State state,
                               bool is_export, bool is_impl,
                               bool is_export, bool is_impl,
                               llvm::function_ref<auto()->void> on_parse_error)
                               llvm::function_ref<auto()->void> on_parse_error)
     -> void {
     -> void {
@@ -163,8 +163,8 @@ static auto VerifyInImports(Context& context, Lex::TokenIndex intro_token)
 }
 }
 
 
 // Diagnoses if `export` is used in an `impl` file.
 // Diagnoses if `export` is used in an `impl` file.
-static auto RestrictExportToApi(Context& context,
-                                Context::StateStackEntry& state) -> void {
+static auto RestrictExportToApi(Context& context, Context::State& state)
+    -> void {
   // Error for both Main//default and every implementation file.
   // Error for both Main//default and every implementation file.
   auto packaging = context.tree().packaging_decl();
   auto packaging = context.tree().packaging_decl();
   if (!packaging || packaging->is_impl) {
   if (!packaging || packaging->is_impl) {

+ 2 - 2
toolchain/parse/handle_paren_expr.cpp

@@ -19,8 +19,8 @@ auto HandleOnlyParenExpr(Context& context) -> void {
   context.PushState(StateKind::Expr);
   context.PushState(StateKind::Expr);
 }
 }
 
 
-static auto FinishParenExpr(Context& context,
-                            const Context::StateStackEntry& state) -> void {
+static auto FinishParenExpr(Context& context, const Context::State& state)
+    -> void {
   context.AddNode(NodeKind::ParenExpr, context.Consume(), state.has_error);
   context.AddNode(NodeKind::ParenExpr, context.Consume(), state.has_error);
 }
 }
 
 

+ 1 - 1
toolchain/parse/state.def

@@ -54,7 +54,7 @@
   CARBON_PARSE_STATE_VARIANT(Kind, Variant1)                             \
   CARBON_PARSE_STATE_VARIANT(Kind, Variant1)                             \
   CARBON_PARSE_STATE_VARIANTS3(Kind, Variant2, Variant3, Variant4)
   CARBON_PARSE_STATE_VARIANTS3(Kind, Variant2, Variant3, Variant4)
 
 
-// Used as a default for StateStackEntry initialization in some cases. Should
+// Used as a default for State initialization in some cases. Should
 // not be put on the state stack.
 // not be put on the state stack.
 CARBON_PARSE_STATE(Invalid)
 CARBON_PARSE_STATE(Invalid)