[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]