[ruby/yarp] handle missing HEREDOC endline at start of heredoc

https://github.com/ruby/yarp/commit/7b72493b6d
This commit is contained in:
HParker 2023-08-17 09:41:14 -07:00 коммит произвёл git
Родитель 744bc4d5d0
Коммит db076d8e84
2 изменённых файлов: 62 добавлений и 7 удалений

Просмотреть файл

@ -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"
)]
)
)

Просмотреть файл

@ -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 {