Change parameters to language_defn::post_parser
authorTom Tromey <tom@tromey.com>
Wed, 16 Dec 2020 22:49:40 +0000 (15:49 -0700)
committerTom Tromey <tom@tromey.com>
Thu, 17 Dec 2020 00:35:37 +0000 (17:35 -0700)
In the expression rewrite, Ada type resolution will be done at parse
time rather than in a post-parse pass.  At this point,
language_defn::post_parser will be removed.  However, for this to
work, the information available to post_parser must be made available
during the actual parse.

This patch refactors this code slightly to make this possible.  In
particular, "void_context_p" is passed to the parser_state
constructor, and the parser state is then passed to the post_parser
method.

gdb/ChangeLog
2020-12-16  Tom Tromey  <tom@tromey.com>

* rust-exp.y (rust_lex_tests): Update.
* parser-defs.h (parser_state): Add void_p parameter.
<void_context_p>: New member.
* parse.c (parse_exp_in_context): Update.
* language.h (language_defn::post_parser): Remove void_context_p,
completing, tracker parameters.  Add parser state.
* ada-lang.c (ada_language::post_parser): Update.

gdb/ChangeLog
gdb/ada-lang.c
gdb/language.h
gdb/parse.c
gdb/parser-defs.h
gdb/rust-exp.y

index 7b8e727b58cdcbd6c6d42b4011f6e1cb59a18aff..8066c76b9f0f3db91857b2b29b67c4aabaa1a4ba 100644 (file)
@@ -1,3 +1,13 @@
+2020-12-16  Tom Tromey  <tom@tromey.com>
+
+       * rust-exp.y (rust_lex_tests): Update.
+       * parser-defs.h (parser_state): Add void_p parameter.
+       <void_context_p>: New member.
+       * parse.c (parse_exp_in_context): Update.
+       * language.h (language_defn::post_parser): Remove void_context_p,
+       completing, tracker parameters.  Add parser state.
+       * ada-lang.c (ada_language::post_parser): Update.
+
 2020-12-16  Tom Tromey  <tom@tromey.com>
 
        * parse.c (parse_exp_1, parse_expression_for_completion): Update.
index 23d7a164609025ae4f3205bddda18c7f2b7b6e93..75ad33344f8e4b414aef63680a1874a422fbd0d5 100644 (file)
@@ -14124,16 +14124,17 @@ public:
      A null CONTEXT_TYPE indicates that a non-void return type is
      preferred.  May change (expand) *EXP.  */
 
-  void post_parser (expression_up *expp, bool void_context_p, int completing,
-                   innermost_block_tracker *tracker) const override
+  void post_parser (expression_up *expp, struct parser_state *ps)
+    const override
   {
     struct type *context_type = NULL;
     int pc = 0;
 
-    if (void_context_p)
+    if (ps->void_context_p)
       context_type = builtin_type ((*expp)->gdbarch)->builtin_void;
 
-    resolve_subexp (expp, &pc, 1, context_type, completing, tracker);
+    resolve_subexp (expp, &pc, 1, context_type, ps->parse_completion,
+                   ps->block_tracker);
   }
 
   /* See language.h.  */
index 5bc99d5f241a111effbf822c8437101ff773f455..73ddd24f2287000512b6970912432b65783dc7d7 100644 (file)
@@ -522,14 +522,10 @@ struct language_defn
   /* Given an expression *EXPP created by prefixifying the result of
      la_parser, perform any remaining processing necessary to complete its
      translation.  *EXPP may change; la_post_parser is responsible for
-     releasing its previous contents, if necessary.  If VOID_CONTEXT_P,
-     then no value is expected from the expression.  If COMPLETING is
-     non-zero, then the expression has been parsed for completion, not
-     evaluation.  */
-
-  virtual void post_parser (expression_up *expp, bool void_context_p,
-                           int completing,
-                           innermost_block_tracker *tracker) const
+     releasing its previous contents, if necessary.  */
+
+  virtual void post_parser (expression_up *expp, struct parser_state *ps)
+    const
   {
     /* By default the post-parser does nothing.  */
   }
index a27ae86c0010f6724b842fd609e1db36de792da4..80a67c6c707e0da8b587ae9cffdc0246d51655b4 100644 (file)
@@ -1113,7 +1113,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
 
   parser_state ps (lang, get_current_arch (), expression_context_block,
                   expression_context_pc, comma, *stringptr,
-                  cstate != nullptr, tracker);
+                  cstate != nullptr, tracker, void_context_p);
 
   scoped_restore_current_language lang_saver;
   set_language (lang->la_language);
@@ -1147,7 +1147,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
   if (out_subexp)
     *out_subexp = subexp;
 
-  lang->post_parser (&result, void_context_p, ps.parse_completion, tracker);
+  lang->post_parser (&result, &ps);
 
   if (expressiondebug)
     dump_prefix_expression (result.get (), gdb_stdlog);
index 17216057b18ce6e9388f7a95cf5570535ecf724b..56ac5edf627f83b71c26e5bd36e53e8411b0f637 100644 (file)
@@ -109,14 +109,16 @@ struct parser_state : public expr_builder
                int comma,
                const char *input,
                int completion,
-               innermost_block_tracker *tracker)
+               innermost_block_tracker *tracker,
+               bool void_p)
     : expr_builder (lang, gdbarch),
       expression_context_block (context_block),
       expression_context_pc (context_pc),
       comma_terminates (comma),
       lexptr (input),
       parse_completion (completion),
-      block_tracker (tracker)
+      block_tracker (tracker),
+      void_context_p (void_p)
   {
   }
 
@@ -192,6 +194,9 @@ struct parser_state : public expr_builder
   /* The innermost block tracker.  */
   innermost_block_tracker *block_tracker;
 
+  /* True if no value is expected from the expression.  */
+  bool void_context_p;
+
 private:
 
   /* Data structure for saving values of arglist_len for function calls whose
index 1207d1d6f42d91f1bd79f4ed9ef0440ab802d835..c354b7fbab2010aa1b9b553e9828310c464814cf 100644 (file)
@@ -2732,7 +2732,7 @@ rust_lex_tests (void)
 
   /* Set up dummy "parser", so that rust_type works.  */
   struct parser_state ps (language_def (language_rust), target_gdbarch (),
-                         nullptr, 0, 0, nullptr, 0, nullptr);
+                         nullptr, 0, 0, nullptr, 0, nullptr, false);
   rust_parser parser (&ps);
 
   rust_lex_test_one (&parser, "", 0);