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
This commit is contained in:
parent
3462dd3609
commit
7c7d74365d
38
parse.y
38
parse.y
@ -5036,42 +5036,38 @@ parser_yyerror(struct parser_params *parser, const char *msg)
|
|||||||
#ifndef RIPPER
|
#ifndef RIPPER
|
||||||
const int max_line_margin = 30;
|
const int max_line_margin = 30;
|
||||||
const char *p, *pe;
|
const char *p, *pe;
|
||||||
const char *pre = "", *post = "";
|
const char *pre = "", *post = "", *pend;
|
||||||
const char *code = "", *caret = "", *newline = "";
|
const char *code = "", *caret = "", *newline = "";
|
||||||
const char *lim;
|
const char *lim;
|
||||||
char *buf;
|
char *buf;
|
||||||
long len;
|
long len;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
p = parser->tokp;
|
p = lex_p;
|
||||||
lim = p - lex_pbeg > max_line_margin ? p - max_line_margin : lex_pbeg;
|
lim = p - lex_pbeg > max_line_margin ? p - max_line_margin : lex_pbeg;
|
||||||
while (lim < p) {
|
while ((lim < p) && (*(p-1) != '\n')) p--;
|
||||||
if (*(p-1) == '\n') break;
|
|
||||||
p--;
|
|
||||||
}
|
|
||||||
|
|
||||||
pe = lex_p;
|
pend = lex_pend;
|
||||||
lim = lex_pend - pe > max_line_margin ? pe + max_line_margin : lex_pend;
|
if (pend > lex_pbeg && pend[-1] == '\n') {
|
||||||
while (pe < lim) {
|
if (--pend > lex_pbeg && pend[-1] == '\r') --pend;
|
||||||
if (*pe == '\n') break;
|
|
||||||
pe++;
|
|
||||||
}
|
}
|
||||||
|
pe = lex_p;
|
||||||
|
lim = pend - pe > max_line_margin ? pe + max_line_margin : pend;
|
||||||
|
while ((pe < lim) && (*pe != '\n')) pe++;
|
||||||
|
|
||||||
len = pe - p;
|
len = pe - p;
|
||||||
if (len > 4) {
|
if (len > 4) {
|
||||||
char *p2;
|
char *p2;
|
||||||
|
|
||||||
if (len > max_line_margin * 2 + 10) {
|
if (p > lex_pbeg) {
|
||||||
if (lex_p - p > max_line_margin) {
|
p = rb_enc_prev_char(lex_pbeg, p, lex_p, rb_enc_get(lex_lastline));
|
||||||
p = rb_enc_prev_char(p, lex_p - max_line_margin, pe, rb_enc_get(lex_lastline));
|
if (p > lex_pbeg) pre = "...";
|
||||||
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 (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);
|
i = (int)(lex_p - p);
|
||||||
buf = ALLOCA_N(char, i+2);
|
buf = ALLOCA_N(char, i+2);
|
||||||
code = p;
|
code = p;
|
||||||
|
@ -1013,6 +1013,15 @@ x = __ENCODING__
|
|||||||
end
|
end
|
||||||
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
|
=begin
|
||||||
def test_past_scope_variable
|
def test_past_scope_variable
|
||||||
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}
|
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user