aboutsummaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-11-04 21:23:11 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-11-04 21:39:54 +0900
commitba35c14325ebbf1da8f200df83c45ee9937ff8a1 (patch)
tree7b51593d4201082a5541be2bb123e64f731cbdd3 /parse.y
parentcf377c5556cb03f180a8bbc200fab0f04a540edb (diff)
downloadruby-ba35c14325ebbf1da8f200df83c45ee9937ff8a1.tar.gz
Warn `if` and `elsif` at EOL [EXPERIMENTAL]
It is unnatural and probably a typo.
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y22
1 files changed, 22 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index e1fe38e0d7..8fd2b058ba 100644
--- a/parse.y
+++ b/parse.y
@@ -395,6 +395,12 @@ set_line_body(NODE *body, int line)
#define yyparse ruby_yyparse
+#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);
+
static NODE* cond(struct parser_params *p, NODE *node, const YYLTYPE *loc);
static NODE* method_cond(struct parser_params *p, NODE *node, const YYLTYPE *loc);
#define new_nil(loc) NEW_NIL(loc)
@@ -3070,6 +3076,7 @@ k_begin : keyword_begin
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
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)
#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)
{