This adds a field in the symbol struct for the position of the end of the symbol and code to parse.c to fill this in for the various symbol types when parsing. Signed-off-by: Rob Taylor <rob.taylor@xxxxxxxxxxxxxxx> --- parse.c | 21 ++++++++++++++++++++- symbol.c | 1 + symbol.h | 1 + 3 files changed, 22 insertions(+), 1 deletions(-) diff --git a/parse.c b/parse.c index cb9f87a..ae14642 100644 --- a/parse.c +++ b/parse.c @@ -505,6 +505,7 @@ static struct token *struct_union_enum_specifier(enum type type, // Mark the structure as needing re-examination sym->examined = 0; + sym->endpos = token->pos; } return token; } @@ -519,7 +520,10 @@ static struct token *struct_union_enum_specifier(enum type type, sym = alloc_symbol(token->pos, type); token = parse(token->next, sym); ctype->base_type = sym; - return expect(token, '}', "at end of specifier"); + token = expect(token, '}', "at end of specifier"); + sym->endpos = token->pos; + + return token; } static struct token *parse_struct_declaration(struct token *token, struct symbol *sym) @@ -712,6 +716,9 @@ static struct token *parse_enum_declaration(struct token *token, struct symbol * lower_boundary(&lower, &v); } token = next; + + sym->endpos = token->pos; + if (!match_op(token, ',')) break; token = token->next; @@ -775,6 +782,7 @@ static struct token *typeof_specifier(struct token *token, struct ctype *ctype) token = parse_expression(token->next, &typeof_sym->initializer); ctype->modifiers = 0; + typeof_sym->endpos = token->pos; ctype->base_type = typeof_sym; } return expect(token, ')', "after typeof"); @@ -1193,12 +1201,14 @@ static struct token *direct_declarator(struct token *token, struct symbol *decl, sym = alloc_indirect_symbol(token->pos, ctype, SYM_FN); token = parameter_type_list(next, sym, p); token = expect(token, ')', "in function declarator"); + sym->endpos = token->pos; continue; } if (token->special == '[') { struct symbol *array = alloc_indirect_symbol(token->pos, ctype, SYM_ARRAY); token = abstract_array_declarator(token->next, array); token = expect(token, ']', "in abstract_array_declarator"); + array->endpos = token->pos; ctype = &array->ctype; continue; } @@ -1232,6 +1242,7 @@ static struct token *pointer(struct token *token, struct ctype *ctype) token = declaration_specifiers(token->next, ctype, 1); modifiers = ctype->modifiers; + ctype->base_type->endpos = token->pos; } return token; } @@ -1286,6 +1297,7 @@ static struct token *handle_bitfield(struct token *token, struct symbol *decl) } } bitfield->bit_size = width; + bitfield->endpos = token->pos; return token; } @@ -1306,6 +1318,7 @@ static struct token *declaration_list(struct token *token, struct symbol_list ** } apply_modifiers(token->pos, &decl->ctype); add_symbol(list, decl); + decl->endpos = token->pos; if (!match_op(token, ',')) break; token = token->next; @@ -1340,6 +1353,7 @@ static struct token *parameter_declaration(struct token *token, struct symbol ** token = declarator(token, sym, &ident); sym->ident = ident; apply_modifiers(token->pos, &sym->ctype); + sym->endpos = token->pos; return token; } @@ -1350,6 +1364,7 @@ struct token *typename(struct token *token, struct symbol **p) token = declaration_specifiers(token, &sym->ctype, 0); token = declarator(token, sym, NULL); apply_modifiers(token->pos, &sym->ctype); + sym->endpos = token->pos; return token; } @@ -1818,6 +1833,7 @@ static struct token *parameter_type_list(struct token *token, struct symbol *fn, warning(token->pos, "void parameter"); } add_symbol(list, sym); + sym->endpos = token->pos; if (!match_op(token, ',')) break; token = token->next; @@ -2104,6 +2120,8 @@ struct token *external_declaration(struct token *token, struct symbol_list **lis token = declarator(token, decl, &ident); apply_modifiers(token->pos, &decl->ctype); + decl->endpos = token->pos; + /* Just a type declaration? */ if (!ident) return expect(token, ';', "end of type declaration"); @@ -2164,6 +2182,7 @@ struct token *external_declaration(struct token *token, struct symbol_list **lis token = declaration_specifiers(token, &decl->ctype, 1); token = declarator(token, decl, &ident); apply_modifiers(token->pos, &decl->ctype); + decl->endpos = token->pos; if (!ident) { sparse_error(token->pos, "expected identifier name in type definition"); return token; diff --git a/symbol.c b/symbol.c index 329fed9..7585978 100644 --- a/symbol.c +++ b/symbol.c @@ -62,6 +62,7 @@ struct symbol *alloc_symbol(struct position pos, int type) struct symbol *sym = __alloc_symbol(0); sym->type = type; sym->pos = pos; + sym->endpos.type = 0; return sym; } diff --git a/symbol.h b/symbol.h index 2bde84d..be5e6b1 100644 --- a/symbol.h +++ b/symbol.h @@ -111,6 +111,7 @@ struct symbol { enum namespace namespace:9; unsigned char used:1, attr:2, enum_member:1; struct position pos; /* Where this symbol was declared */ + struct position endpos; /* Where this symbol ends*/ struct ident *ident; /* What identifier this symbol is associated with */ struct symbol *next_id; /* Next semantic symbol that shares this identifier */ struct symbol **id_list; /* Back pointer to symbol list head */ -- 1.5.2-rc3.GIT --------------040700010305000000020101 Content-Type: text/x-patch; name="0002-add-sparse_keep_tokens-api-to-lib.h.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="0002-add-sparse_keep_tokens-api-to-lib.h.patch"