diff options
Diffstat (limited to 'gdb/parse.c')
-rw-r--r-- | gdb/parse.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/gdb/parse.c b/gdb/parse.c index 984c0d2..8e558e3 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -88,6 +88,13 @@ int parse_completion; '->'. This is set when parsing and is only used when completing a field name. It is -1 if no dereference operation was found. */ static int expout_last_struct = -1; + +/* If we are completing a tagged type name, this will be nonzero. */ +static enum type_code expout_tag_completion_type = TYPE_CODE_UNDEF; + +/* The token for tagged type name completion. */ +static char *expout_completion_name; + static unsigned int expressiondebug = 0; static void @@ -578,9 +585,32 @@ write_exp_msymbol (struct minimal_symbol *msymbol) void mark_struct_expression (void) { + gdb_assert (parse_completion + && expout_tag_completion_type == TYPE_CODE_UNDEF); expout_last_struct = expout_ptr; } +/* 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. */ + +void +mark_completion_tag (enum type_code tag, const char *ptr, int length) +{ + gdb_assert (parse_completion + && expout_tag_completion_type == TYPE_CODE_UNDEF + && expout_completion_name == NULL + && expout_last_struct == -1); + gdb_assert (tag == TYPE_CODE_UNION + || tag == TYPE_CODE_STRUCT + || tag == TYPE_CODE_CLASS + || tag == TYPE_CODE_ENUM); + expout_tag_completion_type = tag; + expout_completion_name = xmalloc (length + 1); + memcpy (expout_completion_name, ptr, length); + expout_completion_name[length] = '\0'; +} + /* Recognize tokens that start with '$'. These include: @@ -1124,6 +1154,9 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, const struct block *block, paren_depth = 0; type_stack.depth = 0; expout_last_struct = -1; + expout_tag_completion_type = TYPE_CODE_UNDEF; + xfree (expout_completion_name); + expout_completion_name = NULL; comma_terminates = comma; @@ -1244,7 +1277,8 @@ parse_expression (char *string) *NAME must be freed by the caller. */ struct type * -parse_expression_for_completion (char *string, char **name) +parse_expression_for_completion (char *string, char **name, + enum type_code *code) { struct expression *exp = NULL; struct value *val; @@ -1259,6 +1293,15 @@ parse_expression_for_completion (char *string, char **name) parse_completion = 0; if (except.reason < 0 || ! exp) return NULL; + + if (expout_tag_completion_type != TYPE_CODE_UNDEF) + { + *code = expout_tag_completion_type; + *name = expout_completion_name; + expout_completion_name = NULL; + return NULL; + } + if (expout_last_struct == -1) { xfree (exp); |