ruby-changes:58560
From: Nobuyoshi <ko1@a...>
Date: Mon, 4 Nov 2019 23:20:42 +0900 (JST)
Subject: [ruby-changes:58560] 26316cc350 (master): Warn `if` and `elsif` at EOL [EXPERIMENTAL]
https://git.ruby-lang.org/ruby.git/commit/?id=26316cc350 From 26316cc350109ba71d42f944f3b976985627c042 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Mon, 4 Nov 2019 21:23:11 +0900 Subject: Warn `if` and `elsif` at EOL [EXPERIMENTAL] It is unnatural and probably a typo. diff --git a/parse.y b/parse.y index e1fe38e..e957c06 100644 --- a/parse.y +++ b/parse.y @@ -952,6 +952,12 @@ static void token_info_setup(token_info *ptinfo, const char *ptr, const rb_code_ https://github.com/ruby/ruby/blob/trunk/parse.y#L952 static void token_info_push(struct parser_params*, const char *token, const rb_code_location_t *loc); static void token_info_pop(struct parser_params*, const char *token, const rb_code_location_t *loc); static void token_info_warn(struct parser_params *p, const char *token, token_info *ptinfo_beg, int same, const rb_code_location_t *loc); + +#define WARN_EOL(tok) \ + (looking_at_eol_p(p) ? \ + rb_warning0("`" tok "' at the end of line without an expression") : \ + (void)0) +static int looking_at_eol_p(struct parser_params *p); %} %expect 0 @@ -3070,6 +3076,7 @@ k_begin : keyword_begin https://github.com/ruby/ruby/blob/trunk/parse.y#L3076 k_if : keyword_if { + WARN_EOL("if"); token_info_push(p, "if", &@$); if (p->token_info && p->token_info->nonspc && p->token_info->next && !strcmp(p->token_info->next->token, "else")) { @@ -3179,6 +3186,7 @@ k_else : keyword_else https://github.com/ruby/ruby/blob/trunk/parse.y#L3186 k_elsif : keyword_elsif { + WARN_EOL("elisif"); token_info_warn(p, "elsif", p->token_info, 1, &@$); } ; @@ -6272,6 +6280,20 @@ pushback(struct parser_params *p, int c) https://github.com/ruby/ruby/blob/trunk/parse.y#L6280 #define tok(p) (p)->tokenbuf #define toklen(p) (p)->tokidx +static int +looking_at_eol_p(struct parser_params *p) +{ + int c; + while ((c = nextc(p)) != -1) { + int eol = (c == '\n' || c == '#'); + if (eol || !ISSPACE(c)) { + pushback(p, c); + return eol; + } + } + return TRUE; +} + static char* newtok(struct parser_params *p) { -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/