From e4741116c27a0a9edf7370860510514ddd9eb572 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 28 Jun 2017 05:38:27 +0000 Subject: parse.y: add ellipsis * parse.y (parser_yyerror): add ellipsis properly when error line is truncated. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59194 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- parse.y | 38 +++++++++++++++++--------------------- test/ruby/test_parse.rb | 9 +++++++++ 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/parse.y b/parse.y index cb494cc937..ce8a1e5d1c 100644 --- a/parse.y +++ b/parse.y @@ -5036,42 +5036,38 @@ parser_yyerror(struct parser_params *parser, const char *msg) #ifndef RIPPER const int max_line_margin = 30; const char *p, *pe; - const char *pre = "", *post = ""; + const char *pre = "", *post = "", *pend; const char *code = "", *caret = "", *newline = ""; const char *lim; char *buf; long len; int i; - p = parser->tokp; + p = lex_p; lim = p - lex_pbeg > max_line_margin ? p - max_line_margin : lex_pbeg; - while (lim < p) { - if (*(p-1) == '\n') break; - p--; - } + while ((lim < p) && (*(p-1) != '\n')) p--; - pe = lex_p; - lim = lex_pend - pe > max_line_margin ? pe + max_line_margin : lex_pend; - while (pe < lim) { - if (*pe == '\n') break; - pe++; + pend = lex_pend; + if (pend > lex_pbeg && pend[-1] == '\n') { + if (--pend > lex_pbeg && pend[-1] == '\r') --pend; } + pe = lex_p; + lim = pend - pe > max_line_margin ? pe + max_line_margin : pend; + while ((pe < lim) && (*pe != '\n')) pe++; len = pe - p; if (len > 4) { char *p2; - if (len > max_line_margin * 2 + 10) { - if (lex_p - p > max_line_margin) { - p = rb_enc_prev_char(p, lex_p - max_line_margin, pe, rb_enc_get(lex_lastline)); - pre = "..."; - } - if (pe - lex_p > max_line_margin) { - pe = rb_enc_prev_char(lex_p, lex_p + max_line_margin, pe, rb_enc_get(lex_lastline)); - post = "..."; - } - len = pe - p; + if (p > lex_pbeg) { + p = rb_enc_prev_char(lex_pbeg, p, lex_p, rb_enc_get(lex_lastline)); + if (p > lex_pbeg) pre = "..."; + } + if (pe < pend) { + pe = rb_enc_prev_char(lex_p, pe, pend, rb_enc_get(lex_lastline)); + if (pe < pend) post = "..."; } + len = pe - p; i = (int)(lex_p - p); buf = ALLOCA_N(char, i+2); code = p; diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index d869fbd7ab..a604d3b193 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -1013,6 +1013,15 @@ x = __ENCODING__ end end + def test_truncated_source_line + e = assert_raise_with_message(SyntaxError, /unexpected tIDENTIFIER/) do + eval("'0123456789012345678901234567890123456789' abcdefghijklmnopqrstuvwxyz0123456789 0123456789012345678901234567890123456789") + end + line = e.message.lines[1] + assert_operator(line, :start_with?, "...") + assert_operator(line, :end_with?, "...\n") + end + =begin def test_past_scope_variable assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}} -- cgit v1.2.3