[ruby/yarp] fix: %W list spanning a heredoc
Primarily this fix is to accept a string node and concatenate it onto an interpolated string. https://github.com/ruby/yarp/commit/6df729fe72
This commit is contained in:
parent
77e971b6ec
commit
74812df496
@ -29,3 +29,10 @@ pp <<-A, %w[j\
|
|||||||
i
|
i
|
||||||
A
|
A
|
||||||
j]
|
j]
|
||||||
|
|
||||||
|
# ripper can't parse this successfully, though ruby runs it correctly
|
||||||
|
# TODO: yarp does not include the "\n" in "l\nl" in the AST like ruby does
|
||||||
|
pp <<-A, %W[l\
|
||||||
|
k
|
||||||
|
A
|
||||||
|
l]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
ProgramNode(164...541)(
|
ProgramNode(164...709)(
|
||||||
[],
|
[],
|
||||||
StatementsNode(164...541)(
|
StatementsNode(164...709)(
|
||||||
[CallNode(164...192)(
|
[CallNode(164...192)(
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
@ -133,6 +133,33 @@ ProgramNode(164...541)(
|
|||||||
nil,
|
nil,
|
||||||
0,
|
0,
|
||||||
"pp"
|
"pp"
|
||||||
|
),
|
||||||
|
CallNode(688...709)(
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
(688...690),
|
||||||
|
nil,
|
||||||
|
ArgumentsNode(691...709)(
|
||||||
|
[InterpolatedStringNode(691...695)(
|
||||||
|
(691...695),
|
||||||
|
[StringNode(703...705)(nil, (703...705), nil, "k\n")],
|
||||||
|
(705...707)
|
||||||
|
),
|
||||||
|
ArrayNode(697...709)(
|
||||||
|
[InterpolatedStringNode(700...708)(
|
||||||
|
nil,
|
||||||
|
[StringNode(700...703)(nil, (700...703), nil, "l"),
|
||||||
|
StringNode(707...708)(nil, (707...708), nil, "l")],
|
||||||
|
nil
|
||||||
|
)],
|
||||||
|
(697...700),
|
||||||
|
(708...709)
|
||||||
|
)]
|
||||||
|
),
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
0,
|
||||||
|
"pp"
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
13
yarp/yarp.c
13
yarp/yarp.c
@ -12160,6 +12160,19 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
|
|||||||
// to the list of child nodes.
|
// to the list of child nodes.
|
||||||
yp_node_t *part = parse_string_part(parser);
|
yp_node_t *part = parse_string_part(parser);
|
||||||
yp_interpolated_string_node_append((yp_interpolated_string_node_t *) current, part);
|
yp_interpolated_string_node_append((yp_interpolated_string_node_t *) current, part);
|
||||||
|
} else if (YP_NODE_TYPE_P(current, YP_NODE_STRING_NODE)) {
|
||||||
|
// If we hit string content and the current node is a string node,
|
||||||
|
// then we need to convert the current node into an interpolated
|
||||||
|
// string and add the string content to the list of child nodes.
|
||||||
|
yp_token_t opening = not_provided(parser);
|
||||||
|
yp_token_t closing = not_provided(parser);
|
||||||
|
yp_interpolated_string_node_t *interpolated =
|
||||||
|
yp_interpolated_string_node_create(parser, &opening, NULL, &closing);
|
||||||
|
yp_interpolated_string_node_append(interpolated, current);
|
||||||
|
|
||||||
|
yp_node_t *part = parse_string_part(parser);
|
||||||
|
yp_interpolated_string_node_append(interpolated, part);
|
||||||
|
current = (yp_node_t *) interpolated;
|
||||||
} else {
|
} else {
|
||||||
assert(false && "unreachable");
|
assert(false && "unreachable");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user