mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: continue after heredoc error
* parse.y: continue parsing the rest of the here-document starting line, after the terminator was not found.
This commit is contained in:
parent
cb520e7623
commit
4a31c1e45d
2 changed files with 16 additions and 2 deletions
12
parse.y
12
parse.y
|
@ -6016,12 +6016,17 @@ nextline(struct parser_params *p)
|
|||
return -1;
|
||||
|
||||
if (!p->lex.input || NIL_P(v = lex_getline(p))) {
|
||||
end_of_input:
|
||||
p->eofp = 1;
|
||||
lex_goto_eol(p);
|
||||
return -1;
|
||||
}
|
||||
p->cr_seen = FALSE;
|
||||
}
|
||||
else if (NIL_P(v)) {
|
||||
/* after here-document without terminator */
|
||||
goto end_of_input;
|
||||
}
|
||||
add_delayed_token(p, p->lex.ptok, p->lex.pend);
|
||||
if (p->heredoc_end > 0) {
|
||||
p->ruby_sourceline = p->heredoc_end;
|
||||
|
@ -6056,7 +6061,7 @@ nextc(struct parser_params *p)
|
|||
{
|
||||
int c;
|
||||
|
||||
if (UNLIKELY((p->lex.pcur == p->lex.pend) || p->eofp || p->lex.nextline)) {
|
||||
if (UNLIKELY((p->lex.pcur == p->lex.pend) || p->eofp || RTEST(p->lex.nextline))) {
|
||||
if (nextline(p)) return -1;
|
||||
}
|
||||
c = (unsigned char)*p->lex.pcur++;
|
||||
|
@ -7003,6 +7008,8 @@ heredoc_restore(struct parser_params *p, rb_strterm_heredoc_t *here)
|
|||
p->heredoc_end = p->ruby_sourceline;
|
||||
p->ruby_sourceline = (int)here->sourceline;
|
||||
token_flush(p);
|
||||
if (p->eofp) p->lex.nextline = Qnil;
|
||||
p->eofp = 0;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -7260,7 +7267,8 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here)
|
|||
restore:
|
||||
heredoc_restore(p, &p->lex.strterm->u.heredoc);
|
||||
p->lex.strterm = 0;
|
||||
return 0;
|
||||
SET_LEX_STATE(EXPR_END);
|
||||
return tSTRING_END;
|
||||
}
|
||||
bol = was_bol(p);
|
||||
if (!bol) {
|
||||
|
|
|
@ -901,6 +901,12 @@ eom
|
|||
assert_syntax_error("puts <<""EOS\n""ng\n""EOS\r""NO\n", /can't find string "EOS" anywhere before EOF/)
|
||||
end
|
||||
|
||||
def test_heredoc_no_terminator
|
||||
assert_syntax_error("puts <<""A\n", /can't find string "A" anywhere before EOF/)
|
||||
assert_syntax_error("puts <<""A + <<""B\n", /can't find string "A" anywhere before EOF/)
|
||||
assert_syntax_error("puts <<""A + <<""B\n", /can't find string "B" anywhere before EOF/)
|
||||
end
|
||||
|
||||
def test_unterminated_heredoc
|
||||
assert_syntax_error("<<\"EOS\n\nEOS\n", /unterminated/)
|
||||
assert_syntax_error("<<\"EOS\n\"\nEOS\n", /unterminated/)
|
||||
|
|
Loading…
Reference in a new issue