[ruby/yarp] Track block opening and closing locations

https://github.com/ruby/yarp/commit/7984e4ddc7
This commit is contained in:
Kevin Newton 2023-08-21 21:12:52 -04:00 committed by git
parent b9a2c96747
commit a31b069a8a
39 changed files with 159 additions and 14 deletions

View File

@ -581,6 +581,8 @@ class ErrorsTest < Test::Unit::TestCase
expected = LambdaNode(
[:a, :b],
Location(),
Location(),
Location(),
BlockParametersNode(
ParametersNode([RequiredParameterNode(:a), RequiredParameterNode(:b)], [], [], nil, [], nil, nil),
[],
@ -924,6 +926,8 @@ class ErrorsTest < Test::Unit::TestCase
expected = LambdaNode(
[:"..."],
Location(),
Location(),
Location(),
BlockParametersNode(ParametersNode([], [], [], nil, [], ForwardingParameterNode(), nil), [], Location(), Location()),
nil
)

View File

@ -4,6 +4,8 @@ ProgramNode(0...92)(
[LambdaNode(0...14)(
[:foo],
(0...2),
(12...13),
(13...14),
BlockParametersNode(2...11)(
ParametersNode(6...9)(
[RequiredParameterNode(6...9)(:foo)],
@ -23,6 +25,8 @@ ProgramNode(0...92)(
LambdaNode(16...34)(
[:x],
(16...18),
(31...32),
(33...34),
BlockParametersNode(18...30)(
ParametersNode(19...29)(
[],
@ -66,6 +70,8 @@ ProgramNode(0...92)(
LambdaNode(36...51)(
[:a],
(36...38),
(49...50),
(50...51),
BlockParametersNode(38...48)(
ParametersNode(39...47)(
[],

View File

@ -323,6 +323,8 @@ ProgramNode(0...3743)(
LambdaNode(343...353)(
[],
(343...345),
(346...347),
(352...353),
nil,
StatementsNode(348...351)([LocalVariableReadNode(348...351)(:bar, 1)])
),
@ -868,6 +870,8 @@ ProgramNode(0...3743)(
LambdaNode(916...926)(
[],
(916...918),
(919...920),
(925...926),
nil,
StatementsNode(921...924)(
[LocalVariableReadNode(921...924)(:bar, 1)]
@ -876,6 +880,8 @@ ProgramNode(0...3743)(
LambdaNode(930...940)(
[],
(930...932),
(933...934),
(939...940),
nil,
StatementsNode(935...938)(
[LocalVariableReadNode(935...938)(:bar, 1)]
@ -2268,6 +2274,8 @@ ProgramNode(0...3743)(
LambdaNode(1991...2001)(
[],
(1991...1993),
(1994...1995),
(2000...2001),
nil,
StatementsNode(1996...1999)(
[LocalVariableReadNode(1996...1999)(:bar, 1)]
@ -2898,6 +2906,8 @@ ProgramNode(0...3743)(
LambdaNode(2727...2737)(
[],
(2727...2729),
(2730...2731),
(2736...2737),
nil,
StatementsNode(2732...2735)(
[LocalVariableReadNode(2732...2735)(:bar, 1)]
@ -3727,6 +3737,8 @@ ProgramNode(0...3743)(
[LambdaNode(3647...3657)(
[],
(3647...3649),
(3650...3651),
(3656...3657),
nil,
StatementsNode(3652...3655)(
[LocalVariableReadNode(3652...3655)(:bar, 1)]

View File

@ -4,6 +4,8 @@ ProgramNode(0...266)(
[LambdaNode(0...21)(
[:a, :b, :c, :d],
(0...2),
(16...17),
(20...21),
BlockParametersNode(3...15)(
ParametersNode(4...5)(
[RequiredParameterNode(4...5)(:a)],
@ -23,6 +25,8 @@ ProgramNode(0...266)(
LambdaNode(23...39)(
[],
(23...25),
(26...28),
(36...39),
nil,
BeginNode(29...39)(
nil,
@ -36,6 +40,8 @@ ProgramNode(0...266)(
LambdaNode(41...69)(
[],
(41...43),
(44...46),
(66...69),
nil,
BeginNode(47...69)(
nil,
@ -49,6 +55,8 @@ ProgramNode(0...266)(
LambdaNode(71...81)(
[],
(71...73),
(74...75),
(80...81),
nil,
StatementsNode(76...79)(
[CallNode(76...79)(nil, nil, (76...79), nil, nil, nil, nil, 2, "foo")]
@ -57,6 +65,8 @@ ProgramNode(0...266)(
LambdaNode(83...98)(
[],
(83...85),
(86...88),
(95...98),
nil,
StatementsNode(90...93)(
[CallNode(90...93)(nil, nil, (90...93), nil, nil, nil, nil, 2, "foo")]
@ -65,6 +75,8 @@ ProgramNode(0...266)(
LambdaNode(100...129)(
[:a, :b, :c, :d, :e],
(100...102),
(124...125),
(128...129),
BlockParametersNode(103...123)(
ParametersNode(103...123)(
[RequiredParameterNode(103...104)(:a)],
@ -90,6 +102,8 @@ ProgramNode(0...266)(
LambdaNode(131...171)(
[:a, :b, :c, :d, :e, :f, :g],
(131...133),
(166...167),
(170...171),
BlockParametersNode(134...165)(
ParametersNode(135...164)(
[RequiredParameterNode(135...136)(:a)],
@ -115,6 +129,8 @@ ProgramNode(0...266)(
LambdaNode(173...218)(
[:a, :b, :c, :d, :e, :f, :g],
(173...175),
(208...210),
(215...218),
BlockParametersNode(176...207)(
ParametersNode(177...206)(
[RequiredParameterNode(177...178)(:a)],
@ -140,6 +156,8 @@ ProgramNode(0...266)(
LambdaNode(220...245)(
[:a],
(220...222),
(227...228),
(244...245),
BlockParametersNode(223...226)(
ParametersNode(224...225)(
[RequiredParameterNode(224...225)(:a)],
@ -158,6 +176,8 @@ ProgramNode(0...266)(
[LambdaNode(229...243)(
[:b],
(229...231),
(234...235),
(242...243),
BlockParametersNode(232...233)(
ParametersNode(232...233)(
[RequiredParameterNode(232...233)(:b)],
@ -193,6 +213,8 @@ ProgramNode(0...266)(
LambdaNode(247...266)(
[:a, :b, :c],
(247...249),
(263...264),
(265...266),
BlockParametersNode(250...262)(
ParametersNode(251...261)(
[RequiredDestructuredParameterNode(251...257)(

View File

@ -11,6 +11,8 @@ ProgramNode(0...18)(
[LambdaNode(3...10)(
[],
(3...5),
(8...9),
(9...10),
BlockParametersNode(5...7)(nil, [], (5...6), (6...7)),
nil
)],

View File

@ -10,6 +10,8 @@ ProgramNode(0...22)(
[LambdaNode(2...13)(
[],
(2...4),
(5...7),
(10...13),
nil,
StatementsNode(8...9)([IntegerNode(8...9)()])
)]

View File

@ -10,6 +10,8 @@ ProgramNode(0...19)(
[LambdaNode(2...10)(
[],
(2...4),
(5...6),
(9...10),
nil,
StatementsNode(7...8)([IntegerNode(7...8)()])
)]

View File

@ -313,6 +313,8 @@ ProgramNode(0...747)(
[LambdaNode(446...460)(
[:b],
(446...448),
(452...453),
(459...460),
BlockParametersNode(448...451)(
ParametersNode(449...450)(
[RequiredParameterNode(449...450)(:b)],

View File

@ -10,6 +10,8 @@ ProgramNode(0...19)(
[LambdaNode(2...19)(
[],
(2...4),
(7...8),
(18...19),
BlockParametersNode(4...6)(nil, [], (4...5), (5...6)),
StatementsNode(9...17)(
[CallNode(9...17)(

View File

@ -4,6 +4,8 @@ ProgramNode(0...25)(
[LambdaNode(0...25)(
[:a, :b],
(0...2),
(13...14),
(24...25),
BlockParametersNode(2...12)(
ParametersNode(3...11)(
[RequiredParameterNode(3...4)(:a)],

View File

@ -4,6 +4,8 @@ ProgramNode(0...11)(
[LambdaNode(0...11)(
[],
(0...2),
(5...7),
(8...11),
BlockParametersNode(2...4)(nil, [], (2...3), (3...4)),
nil
)]

View File

@ -6,7 +6,9 @@ ProgramNode(0...46)(
nil,
(0...1),
nil,
ArgumentsNode(2...11)([LambdaNode(2...11)([], (2...4), nil, nil)]),
ArgumentsNode(2...11)(
[LambdaNode(2...11)([], (2...4), (5...7), (8...11), nil, nil)]
),
nil,
nil,
0,
@ -17,7 +19,9 @@ ProgramNode(0...46)(
nil,
(13...14),
nil,
ArgumentsNode(15...20)([LambdaNode(15...20)([], (15...17), nil, nil)]),
ArgumentsNode(15...20)(
[LambdaNode(15...20)([], (15...17), (18...19), (19...20), nil, nil)]
),
nil,
nil,
0,
@ -32,6 +36,8 @@ ProgramNode(0...46)(
[LambdaNode(24...35)(
[],
(24...26),
(29...31),
(32...35),
BlockParametersNode(26...28)(nil, [], (26...27), (27...28)),
nil
)]
@ -50,6 +56,8 @@ ProgramNode(0...46)(
[LambdaNode(39...46)(
[],
(39...41),
(44...45),
(45...46),
BlockParametersNode(41...43)(nil, [], (41...42), (42...43)),
nil
)]

View File

@ -4,6 +4,8 @@ ProgramNode(0...5)(
[LambdaNode(0...5)(
[:a],
(0...2),
(3...4),
(4...5),
BlockParametersNode(2...3)(
ParametersNode(2...3)(
[RequiredParameterNode(2...3)(:a)],

View File

@ -4,6 +4,8 @@ ProgramNode(0...23)(
[LambdaNode(0...23)(
[:b, :c, :d, :e, :f],
(0...2),
(21...22),
(22...23),
BlockParametersNode(2...21)(
ParametersNode(3...20)(
[RequiredParameterNode(3...4)(:b)],

View File

@ -10,6 +10,8 @@ ProgramNode(0...25)(
[LambdaNode(2...25)(
[],
(2...4),
(8...10),
(22...25),
BlockParametersNode(5...7)(nil, [], (5...6), (6...7)),
StatementsNode(11...21)(
[CallNode(11...21)(

View File

@ -10,6 +10,8 @@ ProgramNode(0...26)(
[LambdaNode(2...26)(
[],
(2...4),
(8...10),
(23...26),
BlockParametersNode(5...7)(nil, [], (5...6), (6...7)),
StatementsNode(11...22)(
[CallNode(11...22)(

View File

@ -4,6 +4,8 @@ ProgramNode(0...13)(
[LambdaNode(0...13)(
[:k],
(0...2),
(10...11),
(12...13),
BlockParametersNode(3...9)(
ParametersNode(4...8)(
[],

View File

@ -4,6 +4,8 @@ ProgramNode(0...11)(
[LambdaNode(0...11)(
[:k],
(0...2),
(8...9),
(10...11),
BlockParametersNode(3...7)(
ParametersNode(4...6)(
[],

View File

@ -4,6 +4,8 @@ ProgramNode(0...11)(
[LambdaNode(0...11)(
[:a, :b],
(0...2),
(9...10),
(10...11),
BlockParametersNode(2...8)(
ParametersNode(3...4)(
[RequiredParameterNode(3...4)(:a)],

View File

@ -46,12 +46,16 @@ ProgramNode(0...80)(
LambdaNode(33...41)(
[],
(33...35),
(38...39),
(40...41),
BlockParametersNode(35...37)(nil, [], (35...36), (36...37)),
nil
),
LambdaNode(42...51)(
[:a],
(42...44),
(48...49),
(50...51),
BlockParametersNode(44...47)(
ParametersNode(45...46)(
[RequiredParameterNode(45...46)(:a)],
@ -71,6 +75,8 @@ ProgramNode(0...80)(
LambdaNode(52...64)(
[:a, :b],
(52...54),
(61...62),
(63...64),
BlockParametersNode(54...60)(
ParametersNode(55...59)(
[RequiredParameterNode(55...56)(:a),
@ -91,6 +97,8 @@ ProgramNode(0...80)(
LambdaNode(65...80)(
[:a, :b, :c],
(65...67),
(77...78),
(79...80),
BlockParametersNode(67...76)(
ParametersNode(68...72)(
[RequiredParameterNode(68...69)(:a),

View File

@ -4,6 +4,8 @@ ProgramNode(0...22)(
[LambdaNode(0...16)(
[],
(0...2),
(3...4),
(15...16),
nil,
StatementsNode(7...14)(
[CallNode(7...14)(

View File

@ -9,6 +9,8 @@ ProgramNode(0...14)(
[LambdaNode(3...12)(
[:foo],
(3...5),
(10...11),
(11...12),
BlockParametersNode(6...9)(
ParametersNode(6...9)(
[RequiredParameterNode(6...9)(:foo)],

View File

@ -55,6 +55,8 @@ ProgramNode(0...56)(
LambdaNode(35...56)(
[],
(35...37),
(38...40),
(53...56),
nil,
StatementsNode(41...52)(
[CallNode(41...52)(

View File

@ -4,6 +4,8 @@ ProgramNode(0...19)(
[LambdaNode(0...12)(
[:scope],
(0...2),
(10...11),
(11...12),
BlockParametersNode(2...9)(
ParametersNode(3...8)(
[RequiredParameterNode(3...8)(:scope)],

View File

@ -4,6 +4,8 @@ ProgramNode(0...46)(
[LambdaNode(0...12)(
[],
(0...2),
(10...11),
(11...12),
BlockParametersNode(2...9)(
ParametersNode(3...8)(
[],

View File

@ -4,6 +4,8 @@ ProgramNode(0...65)(
[LambdaNode(0...17)(
[],
(0...2),
(3...5),
(14...17),
nil,
StatementsNode(6...13)(
[CallNode(6...13)(
@ -34,6 +36,8 @@ ProgramNode(0...65)(
LambdaNode(19...32)(
[],
(19...21),
(22...23),
(31...32),
nil,
StatementsNode(24...31)(
[CallNode(24...31)(

View File

@ -7,6 +7,8 @@ ProgramNode(0...19)(
LambdaNode(4...19)(
[:args],
(4...6),
(13...15),
(16...19),
BlockParametersNode(7...12)(
ParametersNode(7...12)(
[],

View File

@ -4,6 +4,8 @@ ProgramNode(0...14)(
[LambdaNode(0...14)(
[:arg],
(0...2),
(12...13),
(13...14),
BlockParametersNode(3...11)(
ParametersNode(4...10)(
[],

View File

@ -4,6 +4,8 @@ ProgramNode(0...17)(
[LambdaNode(0...17)(
[],
(0...2),
(3...5),
(14...17),
nil,
BeginNode(6...17)(
nil,

View File

@ -10,6 +10,8 @@ ProgramNode(0...24)(
[LambdaNode(2...24)(
[],
(2...4),
(7...9),
(21...24),
BlockParametersNode(4...6)(nil, [], (4...5), (5...6)),
StatementsNode(10...20)(
[CallNode(10...20)(

View File

@ -10,6 +10,8 @@ ProgramNode(0...28)(
[LambdaNode(2...15)(
[],
(2...4),
(5...6),
(14...15),
nil,
StatementsNode(7...13)(
[SymbolNode(7...13)((7...8), (8...13), nil, "hello")]

View File

@ -10,6 +10,8 @@ ProgramNode(0...41)(
[LambdaNode(2...20)(
[:a],
(2...4),
(17...18),
(19...20),
BlockParametersNode(4...16)(
ParametersNode(5...15)(
[],
@ -20,6 +22,8 @@ ProgramNode(0...41)(
LambdaNode(9...15)(
[],
(9...11),
(11...12),
(14...15),
nil,
StatementsNode(12...14)(
[CallNode(12...14)(
@ -63,6 +67,8 @@ ProgramNode(0...41)(
[LambdaNode(24...41)(
[:a],
(24...26),
(38...39),
(40...41),
BlockParametersNode(26...37)(
ParametersNode(27...36)(
[],
@ -74,6 +80,8 @@ ProgramNode(0...41)(
LambdaNode(30...36)(
[],
(30...32),
(32...33),
(35...36),
nil,
StatementsNode(33...35)(
[CallNode(33...35)(

View File

@ -4,6 +4,8 @@ ProgramNode(0...26)(
[LambdaNode(0...8)(
[:*],
(0...2),
(5...6),
(7...8),
BlockParametersNode(3...4)(
ParametersNode(3...4)(
[],
@ -20,7 +22,7 @@ ProgramNode(0...26)(
),
nil
),
LambdaNode(10...19)([], (10...12), nil, nil),
LambdaNode(21...26)([], (21...23), nil, nil)]
LambdaNode(10...19)([], (10...12), (13...15), (16...19), nil, nil),
LambdaNode(21...26)([], (21...23), (23...24), (25...26), nil, nil)]
)
)

View File

@ -4,6 +4,8 @@ ProgramNode(0...21)(
[LambdaNode(0...10)(
[:a],
(0...2),
(7...8),
(9...10),
BlockParametersNode(3...6)(
ParametersNode(4...5)(
[RequiredParameterNode(4...5)(:a)],
@ -23,6 +25,8 @@ ProgramNode(0...21)(
LambdaNode(12...21)(
[:a],
(12...14),
(18...19),
(20...21),
BlockParametersNode(14...17)(
ParametersNode(15...16)(
[RequiredParameterNode(15...16)(:a)],

View File

@ -4,6 +4,8 @@ ProgramNode(0...22)(
[LambdaNode(0...11)(
[:a],
(0...2),
(8...9),
(10...11),
BlockParametersNode(3...7)(
ParametersNode(3...7)(
[],
@ -23,6 +25,8 @@ ProgramNode(0...22)(
LambdaNode(13...22)(
[:a],
(13...15),
(19...20),
(21...22),
BlockParametersNode(16...18)(
ParametersNode(16...18)(
[],

View File

@ -4,6 +4,8 @@ ProgramNode(0...19)(
[LambdaNode(0...19)(
[:a, :foo, :bar],
(0...2),
(16...17),
(18...19),
BlockParametersNode(2...15)(
ParametersNode(3...4)(
[RequiredParameterNode(3...4)(:a)],

View File

@ -1,4 +1,6 @@
ProgramNode(0...5)(
[],
StatementsNode(0...5)([LambdaNode(0...5)([], (0...2), nil, nil)])
StatementsNode(0...5)(
[LambdaNode(0...5)([], (0...2), (2...3), (4...5), nil, nil)]
)
)

View File

@ -1468,8 +1468,12 @@ nodes:
child_nodes:
- name: locals
type: constant[]
- name: operator_loc
type: location
- name: opening_loc
type: location
- name: closing_loc
type: location
- name: parameters
type: node?
kind: BlockParametersNode

View File

@ -2931,10 +2931,11 @@ static yp_lambda_node_t *
yp_lambda_node_create(
yp_parser_t *parser,
yp_constant_id_list_t *locals,
const yp_token_t *operator,
const yp_token_t *opening,
const yp_token_t *closing,
yp_block_parameters_node_t *parameters,
yp_node_t *body,
const yp_token_t *closing
yp_node_t *body
) {
yp_lambda_node_t *node = YP_ALLOC_NODE(parser, yp_lambda_node_t);
@ -2942,12 +2943,14 @@ yp_lambda_node_create(
{
.type = YP_NODE_LAMBDA_NODE,
.location = {
.start = opening->start,
.start = operator->start,
.end = closing->end
},
},
.locals = *locals,
.operator_loc = YP_LOCATION_TOKEN_VALUE(operator),
.opening_loc = YP_LOCATION_TOKEN_VALUE(opening),
.closing_loc = YP_LOCATION_TOKEN_VALUE(closing),
.parameters = parameters,
.body = body
};
@ -12424,25 +12427,25 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
yp_accepts_block_stack_push(parser, true);
parser_lex(parser);
yp_token_t opening = parser->previous;
yp_token_t operator = parser->previous;
yp_parser_scope_push(parser, false);
yp_block_parameters_node_t *params;
switch (parser->current.type) {
case YP_TOKEN_PARENTHESIS_LEFT: {
yp_token_t block_parameters_opening = parser->current;
yp_token_t opening = parser->current;
parser_lex(parser);
if (match_type_p(parser, YP_TOKEN_PARENTHESIS_RIGHT)) {
params = yp_block_parameters_node_create(parser, NULL, &block_parameters_opening);
params = yp_block_parameters_node_create(parser, NULL, &opening);
} else {
params = parse_block_parameters(parser, false, &block_parameters_opening, true);
params = parse_block_parameters(parser, false, &opening, true);
}
accept(parser, YP_TOKEN_NEWLINE);
expect(parser, YP_TOKEN_PARENTHESIS_RIGHT, "Expected ')' after left parenthesis.");
yp_block_parameters_node_closing_set(params, &parser->previous);
yp_block_parameters_node_closing_set(params, &parser->previous);
break;
}
case YP_CASE_PARAMETER: {
@ -12458,16 +12461,20 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
}
}
yp_token_t opening;
yp_node_t *body = NULL;
parser->lambda_enclosure_nesting = previous_lambda_enclosure_nesting;
if (accept(parser, YP_TOKEN_LAMBDA_BEGIN)) {
opening = parser->previous;
if (!accept(parser, YP_TOKEN_BRACE_RIGHT)) {
body = (yp_node_t *) parse_statements(parser, YP_CONTEXT_LAMBDA_BRACES);
expect(parser, YP_TOKEN_BRACE_RIGHT, "Expecting '}' to close lambda block.");
}
} else {
expect(parser, YP_TOKEN_KEYWORD_DO, "Expected a 'do' keyword or a '{' to open lambda block.");
opening = parser->previous;
if (!match_any_type_p(parser, 3, YP_TOKEN_KEYWORD_END, YP_TOKEN_KEYWORD_RESCUE, YP_TOKEN_KEYWORD_ENSURE)) {
body = (yp_node_t *) parse_statements(parser, YP_CONTEXT_LAMBDA_DO_END);
@ -12484,7 +12491,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
yp_constant_id_list_t locals = parser->current_scope->locals;
yp_parser_scope_pop(parser);
yp_accepts_block_stack_pop(parser);
return (yp_node_t *) yp_lambda_node_create(parser, &locals, &opening, params, body, &parser->previous);
return (yp_node_t *) yp_lambda_node_create(parser, &locals, &operator, &opening, &parser->previous, params, body);
}
case YP_TOKEN_UPLUS: {
parser_lex(parser);