diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-08-28 09:29:24 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-08-28 09:29:24 +0900 |
commit | ace2eee544378eb03ea95b95c89434508325e8c8 (patch) | |
tree | c669df863a6a1f2af18c3c0b61dab68bdd436271 | |
parent | 111b69e8a009f469356a723183b651626dbaa8c4 (diff) |
[Bug #18963] Separate string contents by here document terminator
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6292
-rw-r--r-- | parse.y | 13 | ||||
-rw-r--r-- | test/ripper/test_lexer.rb | 10 |
2 files changed, 23 insertions, 0 deletions
@@ -7196,6 +7196,10 @@ tokadd_string(struct parser_params *p, { int c; bool erred = false; +#ifdef RIPPER + const int heredoc_end = (p->heredoc_end ? p->heredoc_end + 1 : 0); + int top_of_line = FALSE; +#endif #define mixed_error(enc1, enc2) \ (void)(erred || (parser_mixed_error(p, enc1, enc2), erred = true)) @@ -7206,6 +7210,12 @@ tokadd_string(struct parser_params *p, if (p->heredoc_indent > 0) { parser_update_heredoc_indent(p, c); } +#ifdef RIPPER + if (top_of_line && heredoc_end == p->ruby_sourceline) { + pushback(p, c); + break; + } +#endif if (paren && c == paren) { ++*nest; @@ -7332,6 +7342,9 @@ tokadd_string(struct parser_params *p, } } tokadd(p, c); +#ifdef RIPPER + top_of_line = (c == '\n'); +#endif } terminate: if (*enc) *encp = *enc; diff --git a/test/ripper/test_lexer.rb b/test/ripper/test_lexer.rb index 4f3f4657ef..27e0007023 100644 --- a/test/ripper/test_lexer.rb +++ b/test/ripper/test_lexer.rb @@ -242,4 +242,14 @@ class TestRipper::Lexer < Test::Unit::TestCase EOF assert_equal([[5, 0], :on_heredoc_end, "EOS\n", state(:EXPR_BEG)], Ripper.lex(s).last, bug) end + + def test_tokenize_with_here_document + bug = '[Bug #18963]' + code = %[ +<<A + "hello +A +world" +] + assert_equal(code, Ripper.tokenize(code).join(""), bug) + end end |