diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-12 14:25:31 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-01-12 14:25:31 +0000 |
commit | 21f03063f607892ae6e34710d611b9f8fd5e5d1b (patch) | |
tree | 2be912193286c5fa770d7ef4a41d00d25b51c306 /parse.y | |
parent | ccf3a0d698ab1b86537c9d0c470732b4e97720a2 (diff) |
parse.y (token_info_push, token_info_pop): Refactoring
* remove unused argument len
* factor out initialization code of token_info
* make the condition of "mismatched indentations" warning easy to understand
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61796 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 74 |
1 files changed, 33 insertions, 41 deletions
@@ -921,10 +921,10 @@ PRINTF_ARGS(static void parser_compile_error(struct parser_params*, const char * #endif #endif -static void token_info_push_gen(struct parser_params*, const char *token, size_t len, const rb_code_location_t *loc); -static void token_info_pop_gen(struct parser_params*, const char *token, size_t len, const rb_code_location_t *loc); -#define token_info_push(token, loc) token_info_push_gen(parser, (token), rb_strlen_lit(token), (loc)) -#define token_info_pop(token, loc) token_info_pop_gen(parser, (token), rb_strlen_lit(token), (loc)) +static void token_info_push_gen(struct parser_params*, const char *token, const rb_code_location_t *loc); +static void token_info_pop_gen(struct parser_params*, const char *token, const rb_code_location_t *loc); +#define token_info_push(token, loc) token_info_push_gen(parser, (token), (loc)) +#define token_info_pop(token, loc) token_info_pop_gen(parser, (token), (loc)) %} %pure-parser @@ -5042,66 +5042,58 @@ ripper_dispatch_delayed_token(struct parser_params *parser, int t) #define parser_isascii() ISASCII(*(lex_p-1)) -static int -token_info_get_column(const char *p, int len) +static void +setup_token_info(token_info *ptinfo, const char *p, const rb_code_location_t *loc) { - int column = 1, i; - for (i = 0; i < len; i++, p++) { + int column = 1, nonspc = 0, i; + for (i = 0; i < loc->beg_pos.column; i++, p++) { if (*p == '\t') { column = (((column - 1) / TAB_WIDTH) + 1) * TAB_WIDTH; } column++; - } - return column; -} - -static int -token_info_has_nonspaces(const char *p, int len) -{ - int i; - for (i = 0; i < len; i++, p++) { if (*p != ' ' && *p != '\t') { - return 1; + nonspc = 1; } } - return 0; + + ptinfo->linenum = loc->beg_pos.lineno; + ptinfo->column = column; + ptinfo->nonspc = nonspc; } static void -token_info_push_gen(struct parser_params *parser, const char *token, size_t len, const rb_code_location_t *loc) +token_info_push_gen(struct parser_params *parser, const char *token, const rb_code_location_t *loc) { token_info *ptinfo; if (!parser->token_info_enabled) return; ptinfo = ALLOC(token_info); ptinfo->token = token; - ptinfo->linenum = loc->beg_pos.lineno; - ptinfo->column = token_info_get_column(lex_pbeg, loc->beg_pos.column); - ptinfo->nonspc = token_info_has_nonspaces(lex_pbeg, loc->beg_pos.column); ptinfo->next = parser->token_info; + setup_token_info(ptinfo, lex_pbeg, loc); parser->token_info = ptinfo; } static void -token_info_pop_gen(struct parser_params *parser, const char *token, size_t len, const rb_code_location_t *loc) -{ - int linenum; - token_info *ptinfo = parser->token_info; - - if (!ptinfo) return; - parser->token_info = ptinfo->next; - linenum = loc->beg_pos.lineno; - if (parser->token_info_enabled && - linenum != ptinfo->linenum && !ptinfo->nonspc && - !token_info_has_nonspaces(lex_pbeg, loc->beg_pos.column) && - token_info_get_column(lex_pbeg, loc->beg_pos.column) != ptinfo->column) { - rb_warn3L(linenum, - "mismatched indentations at '%s' with '%s' at %d", - WARN_S(token), WARN_S(ptinfo->token), WARN_I(ptinfo->linenum)); - } - - xfree(ptinfo); +token_info_pop_gen(struct parser_params *parser, const char *token, const rb_code_location_t *loc) +{ + token_info *ptinfo_beg = parser->token_info, ptinfo_end_body, *ptinfo_end = &ptinfo_end_body; + setup_token_info(ptinfo_end, lex_pbeg, loc); + + if (!ptinfo_beg) return; + parser->token_info = ptinfo_beg->next; + + /* indentation check of matched keywords (begin..end, if..end, etc.) */ + if (!parser->token_info_enabled) goto ok; /* the check is off */ + if (ptinfo_beg->linenum == ptinfo_end->linenum) goto ok; /* ignore one-line block */ + if (ptinfo_beg->nonspc || ptinfo_end->nonspc) goto ok; /* ignore keyword in the middle of a line */ + if (ptinfo_beg->column == ptinfo_end->column) goto ok; /* the indents are matched */ + rb_warn3L(ptinfo_end->linenum, + "mismatched indentations at '%s' with '%s' at %d", + WARN_S(token), WARN_S(ptinfo_beg->token), WARN_I(ptinfo_beg->linenum)); +ok: + xfree(ptinfo_beg); } static int |