diff options
| author | HParker <HParker@github.com> | 2023-08-17 09:41:14 -0700 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2023-08-18 18:05:09 +0000 |
| commit | db076d8e84d6b2d03fb280aee3835e1f88150c00 (patch) | |
| tree | cb9a47b7ee127f2bdc1fb368403ffd34e011c3da | |
| parent | 744bc4d5d0df32056d5352ed49ae504f6a031e78 (diff) | |
[ruby/yarp] handle missing HEREDOC endline at start of heredoc
https://github.com/ruby/yarp/commit/7b72493b6d
| -rw-r--r-- | test/snapshots/heredoc_with_escaped_newline_at_start.txt | 45 | ||||
| -rw-r--r-- | yarp/yarp.c | 24 |
2 files changed, 62 insertions, 7 deletions
diff --git a/test/snapshots/heredoc_with_escaped_newline_at_start.txt b/test/snapshots/heredoc_with_escaped_newline_at_start.txt new file mode 100644 index 0000000000..43fa751526 --- /dev/null +++ b/test/snapshots/heredoc_with_escaped_newline_at_start.txt @@ -0,0 +1,45 @@ +ProgramNode(0...62)( + [], + StatementsNode(0...62)( + [CallNode(0...25)( + InterpolatedStringNode(0...9)((0...9), [], (27...34)), + (9...10), + (10...14), + nil, + ArgumentsNode(15...25)( + [RegularExpressionNode(15...21)( + (15...16), + (16...20), + (20...21), + "^ {", + 0 + ), + StringNode(23...25)((23...24), (24...24), (24...25), "")] + ), + nil, + nil, + 0, + "gsub" + ), + CallNode(37...62)( + InterpolatedStringNode(37...46)((37...46), [], (65...73)), + (46...47), + (47...51), + nil, + ArgumentsNode(52...62)( + [RegularExpressionNode(52...58)( + (52...53), + (53...57), + (57...58), + "^ {", + 0 + ), + StringNode(60...62)((60...61), (61...61), (61...62), "")] + ), + nil, + nil, + 0, + "gsub" + )] + ) +) diff --git a/yarp/yarp.c b/yarp/yarp.c index ed777a4520..715c281949 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -5653,13 +5653,23 @@ parser_lex(yp_parser_t *parser) { break; case '\\': if (peek_at(parser, 1) == '\n') { - yp_newline_list_append(&parser->newline_list, parser->current.end + 1); - parser->current.end += 2; - space_seen = true; - } else if (parser->current.end + 2 < parser->end && peek_at(parser, 1) == '\r' && peek_at(parser, 2) == '\n') { - yp_newline_list_append(&parser->newline_list, parser->current.end + 2); - parser->current.end += 3; - space_seen = true; + if (parser->heredoc_end) { + parser->current.end = parser->heredoc_end; + parser->heredoc_end = NULL; + } else { + yp_newline_list_append(&parser->newline_list, parser->current.end + 1); + parser->current.end += 2; + space_seen = true; + } + } else if (peek_at(parser, 1) == '\r' && peek_at(parser, 2) == '\n') { + if (parser->heredoc_end) { + parser->current.end = parser->heredoc_end; + parser->heredoc_end = NULL; + } else { + yp_newline_list_append(&parser->newline_list, parser->current.end + 2); + parser->current.end += 3; + space_seen = true; + } } else if (yp_char_is_inline_whitespace(*parser->current.end)) { parser->current.end += 2; } else { |
