From 7b72493b6def8761cef5322bc55426c919ce32b1 Mon Sep 17 00:00:00 2001 From: HParker Date: Thu, 17 Aug 2023 09:41:14 -0700 Subject: [PATCH] handle missing HEREDOC endline at start of heredoc --- src/yarp.c | 24 +++++++--- .../heredoc_with_escaped_newline_at_start.txt | 7 +++ .../heredoc_with_escaped_newline_at_start.txt | 45 +++++++++++++++++++ 3 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 test/fixtures/heredoc_with_escaped_newline_at_start.txt create mode 100644 test/snapshots/heredoc_with_escaped_newline_at_start.txt diff --git a/src/yarp.c b/src/yarp.c index 17a61a40f3f..5926b1cf887 100644 --- a/src/yarp.c +++ b/src/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 { diff --git a/test/fixtures/heredoc_with_escaped_newline_at_start.txt b/test/fixtures/heredoc_with_escaped_newline_at_start.txt new file mode 100644 index 00000000000..81f314e0b3c --- /dev/null +++ b/test/fixtures/heredoc_with_escaped_newline_at_start.txt @@ -0,0 +1,7 @@ +<<-TARGET.gsub /^\s{/, ''\ +TARGET + + +<<-TARGET.gsub /^\s{/, ''\ +TARGET + 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 00000000000..43fa751526d --- /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" + )] + ) +)