aboutsummaryrefslogtreecommitdiff
path: root/gdb/parse.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-03-08 07:27:57 -0700
committerTom Tromey <tom@tromey.com>2021-03-08 07:28:37 -0700
commit4933522da0d59823d2bfef3706e2252203365e9c (patch)
tree6d388690c17f9c42a69005c8a59d5dcb7bf23516 /gdb/parse.c
parent413403fc34156cf695b09553fca91e0990520787 (diff)
downloadgdb-4933522da0d59823d2bfef3706e2252203365e9c.zip
gdb-4933522da0d59823d2bfef3706e2252203365e9c.tar.gz
gdb-4933522da0d59823d2bfef3706e2252203365e9c.tar.bz2
Add completion for operations
This patch adds the necessary support for field name completion for expressions using class operation. This patch takes an approach similar to what is done today. It might be good, in the future, to change completion to be a method on the base class, to enable context-sensitive completion in more areas. gdb/ChangeLog 2021-03-08 Tom Tromey <tom@tromey.com> * parser-defs.h (struct expr_completion_state) <expout_last_op>: New member. (struct parser_state) <mark_struct_expression>: New method. * parse.c (parser_state::mark_struct_expression): Update assert. (parser_state::mark_struct_expression): New method. (parser_state::mark_completion_tag): Update assert. (parse_expression_for_completion): Handle expout_last_op.
Diffstat (limited to 'gdb/parse.c')
-rw-r--r--gdb/parse.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/gdb/parse.c b/gdb/parse.c
index 68386f1..79b1ca1 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -507,10 +507,23 @@ parser_state::mark_struct_expression ()
{
gdb_assert (parse_completion
&& (m_completion_state.expout_tag_completion_type
- == TYPE_CODE_UNDEF));
+ == TYPE_CODE_UNDEF)
+ && m_completion_state.expout_last_op == nullptr);
m_completion_state.expout_last_struct = expout_ptr;
}
+/* See parser-defs.h. */
+
+void
+parser_state::mark_struct_expression (expr::structop_base_operation *op)
+{
+ gdb_assert (parse_completion
+ && (m_completion_state.expout_tag_completion_type
+ == TYPE_CODE_UNDEF)
+ && m_completion_state.expout_last_struct == -1);
+ m_completion_state.expout_last_op = op;
+}
+
/* Indicate that the current parser invocation is completing a tag.
TAG is the type code of the tag, and PTR and LENGTH represent the
start of the tag name. */
@@ -523,7 +536,8 @@ parser_state::mark_completion_tag (enum type_code tag, const char *ptr,
&& (m_completion_state.expout_tag_completion_type
== TYPE_CODE_UNDEF)
&& m_completion_state.expout_completion_name == NULL
- && m_completion_state.expout_last_struct == -1);
+ && m_completion_state.expout_last_struct == -1
+ && m_completion_state.expout_last_op == nullptr);
gdb_assert (tag == TYPE_CODE_UNION
|| tag == TYPE_CODE_STRUCT
|| tag == TYPE_CODE_ENUM);
@@ -1262,6 +1276,14 @@ parse_expression_for_completion (const char *string,
return NULL;
}
+ if (cstate.expout_last_op != nullptr)
+ {
+ expr::structop_base_operation *op = cstate.expout_last_op;
+ const std::string &fld = op->get_string ();
+ *name = make_unique_xstrdup (fld.c_str ());
+ return value_type (op->evaluate_lhs (exp.get ()));
+ }
+
if (cstate.expout_last_struct == -1)
return NULL;