From a31b069a8a0194ef589f0c81ff5da1b11374d7fd Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 21 Aug 2023 21:12:52 -0400 Subject: [PATCH] [ruby/yarp] Track block opening and closing locations https://github.com/ruby/yarp/commit/7984e4ddc7 --- test/yarp/errors_test.rb | 4 +++ test/yarp/snapshots/lambda.txt | 6 +++++ test/yarp/snapshots/patterns.txt | 12 +++++++++ test/yarp/snapshots/procs.txt | 22 ++++++++++++++++ .../call_array_lambda_block_call.txt | 2 ++ .../call_stabby_do_end_with_block.txt | 2 ++ .../call_stabby_with_braces_block.txt | 2 ++ test/yarp/snapshots/seattlerb/case_in.txt | 2 ++ .../yarp/snapshots/seattlerb/difficult3_5.txt | 2 ++ test/yarp/snapshots/seattlerb/difficult6_.txt | 2 ++ test/yarp/snapshots/seattlerb/do_lambda.txt | 2 ++ .../seattlerb/lambda_do_vs_brace.txt | 12 +++++++-- .../seattlerb/stabby_arg_no_paren.txt | 2 ++ .../stabby_arg_opt_splat_arg_block_omfg.txt | 2 ++ .../seattlerb/stabby_block_iter_call.txt | 2 ++ ...bby_block_iter_call_no_target_with_arg.txt | 2 ++ .../snapshots/seattlerb/stabby_block_kw.txt | 2 ++ .../seattlerb/stabby_block_kw__required.txt | 2 ++ .../snapshots/seattlerb/stabby_proc_scope.txt | 2 ++ .../unparser/corpus/literal/lambda.txt | 8 ++++++ .../unparser/corpus/literal/since/27.txt | 2 ++ test/yarp/snapshots/whitequark/bug_435.txt | 2 ++ test/yarp/snapshots/whitequark/bug_cmdarg.txt | 2 ++ .../whitequark/bug_lambda_leakage.txt | 2 ++ test/yarp/snapshots/whitequark/kwnilarg.txt | 2 ++ .../whitequark/numbered_args_after_27.txt | 4 +++ .../snapshots/whitequark/parser_bug_507.txt | 2 ++ .../snapshots/whitequark/parser_bug_645.txt | 2 ++ .../whitequark/rescue_in_lambda_block.txt | 2 ++ .../snapshots/whitequark/ruby_bug_11107.txt | 2 ++ .../snapshots/whitequark/ruby_bug_11380.txt | 2 ++ .../snapshots/whitequark/ruby_bug_15789.txt | 8 ++++++ .../yarp/snapshots/whitequark/send_lambda.txt | 6 +++-- .../snapshots/whitequark/send_lambda_args.txt | 4 +++ .../whitequark/send_lambda_args_noparen.txt | 4 +++ .../whitequark/send_lambda_args_shadow.txt | 2 ++ .../whitequark/send_lambda_legacy.txt | 4 ++- yarp/config.yml | 4 +++ yarp/yarp.c | 25 ++++++++++++------- 39 files changed, 159 insertions(+), 14 deletions(-) diff --git a/test/yarp/errors_test.rb b/test/yarp/errors_test.rb index d58fd27448..7b20ceadab 100644 --- a/test/yarp/errors_test.rb +++ b/test/yarp/errors_test.rb @@ -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 ) diff --git a/test/yarp/snapshots/lambda.txt b/test/yarp/snapshots/lambda.txt index 23c4ebc072..0832abf4e8 100644 --- a/test/yarp/snapshots/lambda.txt +++ b/test/yarp/snapshots/lambda.txt @@ -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)( [], diff --git a/test/yarp/snapshots/patterns.txt b/test/yarp/snapshots/patterns.txt index d5d37f8665..de5946a7cf 100644 --- a/test/yarp/snapshots/patterns.txt +++ b/test/yarp/snapshots/patterns.txt @@ -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)] diff --git a/test/yarp/snapshots/procs.txt b/test/yarp/snapshots/procs.txt index 3db8ec5b13..adfb063707 100644 --- a/test/yarp/snapshots/procs.txt +++ b/test/yarp/snapshots/procs.txt @@ -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)( diff --git a/test/yarp/snapshots/seattlerb/call_array_lambda_block_call.txt b/test/yarp/snapshots/seattlerb/call_array_lambda_block_call.txt index 1d8c2f1472..c83adb235f 100644 --- a/test/yarp/snapshots/seattlerb/call_array_lambda_block_call.txt +++ b/test/yarp/snapshots/seattlerb/call_array_lambda_block_call.txt @@ -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 )], diff --git a/test/yarp/snapshots/seattlerb/call_stabby_do_end_with_block.txt b/test/yarp/snapshots/seattlerb/call_stabby_do_end_with_block.txt index e48578da2a..f541c52985 100644 --- a/test/yarp/snapshots/seattlerb/call_stabby_do_end_with_block.txt +++ b/test/yarp/snapshots/seattlerb/call_stabby_do_end_with_block.txt @@ -10,6 +10,8 @@ ProgramNode(0...22)( [LambdaNode(2...13)( [], (2...4), + (5...7), + (10...13), nil, StatementsNode(8...9)([IntegerNode(8...9)()]) )] diff --git a/test/yarp/snapshots/seattlerb/call_stabby_with_braces_block.txt b/test/yarp/snapshots/seattlerb/call_stabby_with_braces_block.txt index 36fbd7fb1a..83c62571fd 100644 --- a/test/yarp/snapshots/seattlerb/call_stabby_with_braces_block.txt +++ b/test/yarp/snapshots/seattlerb/call_stabby_with_braces_block.txt @@ -10,6 +10,8 @@ ProgramNode(0...19)( [LambdaNode(2...10)( [], (2...4), + (5...6), + (9...10), nil, StatementsNode(7...8)([IntegerNode(7...8)()]) )] diff --git a/test/yarp/snapshots/seattlerb/case_in.txt b/test/yarp/snapshots/seattlerb/case_in.txt index b83e196ece..8a5fafdf74 100644 --- a/test/yarp/snapshots/seattlerb/case_in.txt +++ b/test/yarp/snapshots/seattlerb/case_in.txt @@ -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)], diff --git a/test/yarp/snapshots/seattlerb/difficult3_5.txt b/test/yarp/snapshots/seattlerb/difficult3_5.txt index e7aaafc87a..746786b8a5 100644 --- a/test/yarp/snapshots/seattlerb/difficult3_5.txt +++ b/test/yarp/snapshots/seattlerb/difficult3_5.txt @@ -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)( diff --git a/test/yarp/snapshots/seattlerb/difficult6_.txt b/test/yarp/snapshots/seattlerb/difficult6_.txt index 20e419bbc4..2d1677e108 100644 --- a/test/yarp/snapshots/seattlerb/difficult6_.txt +++ b/test/yarp/snapshots/seattlerb/difficult6_.txt @@ -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)], diff --git a/test/yarp/snapshots/seattlerb/do_lambda.txt b/test/yarp/snapshots/seattlerb/do_lambda.txt index 86b3548eb4..a7eb211623 100644 --- a/test/yarp/snapshots/seattlerb/do_lambda.txt +++ b/test/yarp/snapshots/seattlerb/do_lambda.txt @@ -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 )] diff --git a/test/yarp/snapshots/seattlerb/lambda_do_vs_brace.txt b/test/yarp/snapshots/seattlerb/lambda_do_vs_brace.txt index 1c9e2efc33..c7f83a9b51 100644 --- a/test/yarp/snapshots/seattlerb/lambda_do_vs_brace.txt +++ b/test/yarp/snapshots/seattlerb/lambda_do_vs_brace.txt @@ -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 )] diff --git a/test/yarp/snapshots/seattlerb/stabby_arg_no_paren.txt b/test/yarp/snapshots/seattlerb/stabby_arg_no_paren.txt index bbbd0a3fcf..d999e4ea47 100644 --- a/test/yarp/snapshots/seattlerb/stabby_arg_no_paren.txt +++ b/test/yarp/snapshots/seattlerb/stabby_arg_no_paren.txt @@ -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)], diff --git a/test/yarp/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt b/test/yarp/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt index 9475ba9c3f..0f64173a92 100644 --- a/test/yarp/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt +++ b/test/yarp/snapshots/seattlerb/stabby_arg_opt_splat_arg_block_omfg.txt @@ -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)], diff --git a/test/yarp/snapshots/seattlerb/stabby_block_iter_call.txt b/test/yarp/snapshots/seattlerb/stabby_block_iter_call.txt index f84e8227f9..719c895b99 100644 --- a/test/yarp/snapshots/seattlerb/stabby_block_iter_call.txt +++ b/test/yarp/snapshots/seattlerb/stabby_block_iter_call.txt @@ -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)( diff --git a/test/yarp/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt b/test/yarp/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt index c24b3c63c7..14b7a3eb98 100644 --- a/test/yarp/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt +++ b/test/yarp/snapshots/seattlerb/stabby_block_iter_call_no_target_with_arg.txt @@ -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)( diff --git a/test/yarp/snapshots/seattlerb/stabby_block_kw.txt b/test/yarp/snapshots/seattlerb/stabby_block_kw.txt index 9554c9d37a..8df95715c9 100644 --- a/test/yarp/snapshots/seattlerb/stabby_block_kw.txt +++ b/test/yarp/snapshots/seattlerb/stabby_block_kw.txt @@ -4,6 +4,8 @@ ProgramNode(0...13)( [LambdaNode(0...13)( [:k], (0...2), + (10...11), + (12...13), BlockParametersNode(3...9)( ParametersNode(4...8)( [], diff --git a/test/yarp/snapshots/seattlerb/stabby_block_kw__required.txt b/test/yarp/snapshots/seattlerb/stabby_block_kw__required.txt index e2bdaf8124..8d3e73af8b 100644 --- a/test/yarp/snapshots/seattlerb/stabby_block_kw__required.txt +++ b/test/yarp/snapshots/seattlerb/stabby_block_kw__required.txt @@ -4,6 +4,8 @@ ProgramNode(0...11)( [LambdaNode(0...11)( [:k], (0...2), + (8...9), + (10...11), BlockParametersNode(3...7)( ParametersNode(4...6)( [], diff --git a/test/yarp/snapshots/seattlerb/stabby_proc_scope.txt b/test/yarp/snapshots/seattlerb/stabby_proc_scope.txt index d8aef65941..c4594997eb 100644 --- a/test/yarp/snapshots/seattlerb/stabby_proc_scope.txt +++ b/test/yarp/snapshots/seattlerb/stabby_proc_scope.txt @@ -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)], diff --git a/test/yarp/snapshots/unparser/corpus/literal/lambda.txt b/test/yarp/snapshots/unparser/corpus/literal/lambda.txt index 66300fd726..13161f9c88 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/lambda.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/lambda.txt @@ -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), diff --git a/test/yarp/snapshots/unparser/corpus/literal/since/27.txt b/test/yarp/snapshots/unparser/corpus/literal/since/27.txt index cccfbc64b4..f8709ae21a 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/since/27.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/since/27.txt @@ -4,6 +4,8 @@ ProgramNode(0...22)( [LambdaNode(0...16)( [], (0...2), + (3...4), + (15...16), nil, StatementsNode(7...14)( [CallNode(7...14)( diff --git a/test/yarp/snapshots/whitequark/bug_435.txt b/test/yarp/snapshots/whitequark/bug_435.txt index ed5a985e3a..7d74c8c8a2 100644 --- a/test/yarp/snapshots/whitequark/bug_435.txt +++ b/test/yarp/snapshots/whitequark/bug_435.txt @@ -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)], diff --git a/test/yarp/snapshots/whitequark/bug_cmdarg.txt b/test/yarp/snapshots/whitequark/bug_cmdarg.txt index f953e56145..b3f79aafd4 100644 --- a/test/yarp/snapshots/whitequark/bug_cmdarg.txt +++ b/test/yarp/snapshots/whitequark/bug_cmdarg.txt @@ -55,6 +55,8 @@ ProgramNode(0...56)( LambdaNode(35...56)( [], (35...37), + (38...40), + (53...56), nil, StatementsNode(41...52)( [CallNode(41...52)( diff --git a/test/yarp/snapshots/whitequark/bug_lambda_leakage.txt b/test/yarp/snapshots/whitequark/bug_lambda_leakage.txt index c59109d0a9..7792fa495a 100644 --- a/test/yarp/snapshots/whitequark/bug_lambda_leakage.txt +++ b/test/yarp/snapshots/whitequark/bug_lambda_leakage.txt @@ -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)], diff --git a/test/yarp/snapshots/whitequark/kwnilarg.txt b/test/yarp/snapshots/whitequark/kwnilarg.txt index d7ca269299..0995a597c2 100644 --- a/test/yarp/snapshots/whitequark/kwnilarg.txt +++ b/test/yarp/snapshots/whitequark/kwnilarg.txt @@ -4,6 +4,8 @@ ProgramNode(0...46)( [LambdaNode(0...12)( [], (0...2), + (10...11), + (11...12), BlockParametersNode(2...9)( ParametersNode(3...8)( [], diff --git a/test/yarp/snapshots/whitequark/numbered_args_after_27.txt b/test/yarp/snapshots/whitequark/numbered_args_after_27.txt index 45decfc3b7..c2a67b4cc3 100644 --- a/test/yarp/snapshots/whitequark/numbered_args_after_27.txt +++ b/test/yarp/snapshots/whitequark/numbered_args_after_27.txt @@ -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)( diff --git a/test/yarp/snapshots/whitequark/parser_bug_507.txt b/test/yarp/snapshots/whitequark/parser_bug_507.txt index e0b69e4c8b..4d6d91a763 100644 --- a/test/yarp/snapshots/whitequark/parser_bug_507.txt +++ b/test/yarp/snapshots/whitequark/parser_bug_507.txt @@ -7,6 +7,8 @@ ProgramNode(0...19)( LambdaNode(4...19)( [:args], (4...6), + (13...15), + (16...19), BlockParametersNode(7...12)( ParametersNode(7...12)( [], diff --git a/test/yarp/snapshots/whitequark/parser_bug_645.txt b/test/yarp/snapshots/whitequark/parser_bug_645.txt index 22ae40a011..27680b00ae 100644 --- a/test/yarp/snapshots/whitequark/parser_bug_645.txt +++ b/test/yarp/snapshots/whitequark/parser_bug_645.txt @@ -4,6 +4,8 @@ ProgramNode(0...14)( [LambdaNode(0...14)( [:arg], (0...2), + (12...13), + (13...14), BlockParametersNode(3...11)( ParametersNode(4...10)( [], diff --git a/test/yarp/snapshots/whitequark/rescue_in_lambda_block.txt b/test/yarp/snapshots/whitequark/rescue_in_lambda_block.txt index 475b72dbe8..89825a7ac4 100644 --- a/test/yarp/snapshots/whitequark/rescue_in_lambda_block.txt +++ b/test/yarp/snapshots/whitequark/rescue_in_lambda_block.txt @@ -4,6 +4,8 @@ ProgramNode(0...17)( [LambdaNode(0...17)( [], (0...2), + (3...5), + (14...17), nil, BeginNode(6...17)( nil, diff --git a/test/yarp/snapshots/whitequark/ruby_bug_11107.txt b/test/yarp/snapshots/whitequark/ruby_bug_11107.txt index 0f5b129c5c..c61ee9ef80 100644 --- a/test/yarp/snapshots/whitequark/ruby_bug_11107.txt +++ b/test/yarp/snapshots/whitequark/ruby_bug_11107.txt @@ -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)( diff --git a/test/yarp/snapshots/whitequark/ruby_bug_11380.txt b/test/yarp/snapshots/whitequark/ruby_bug_11380.txt index 5962097a6a..9e89161e78 100644 --- a/test/yarp/snapshots/whitequark/ruby_bug_11380.txt +++ b/test/yarp/snapshots/whitequark/ruby_bug_11380.txt @@ -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")] diff --git a/test/yarp/snapshots/whitequark/ruby_bug_15789.txt b/test/yarp/snapshots/whitequark/ruby_bug_15789.txt index 331c1e5cd8..0621e71c8c 100644 --- a/test/yarp/snapshots/whitequark/ruby_bug_15789.txt +++ b/test/yarp/snapshots/whitequark/ruby_bug_15789.txt @@ -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)( diff --git a/test/yarp/snapshots/whitequark/send_lambda.txt b/test/yarp/snapshots/whitequark/send_lambda.txt index 3c9f4f56cb..c30ec09249 100644 --- a/test/yarp/snapshots/whitequark/send_lambda.txt +++ b/test/yarp/snapshots/whitequark/send_lambda.txt @@ -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)] ) ) diff --git a/test/yarp/snapshots/whitequark/send_lambda_args.txt b/test/yarp/snapshots/whitequark/send_lambda_args.txt index f904384781..ae41cfa463 100644 --- a/test/yarp/snapshots/whitequark/send_lambda_args.txt +++ b/test/yarp/snapshots/whitequark/send_lambda_args.txt @@ -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)], diff --git a/test/yarp/snapshots/whitequark/send_lambda_args_noparen.txt b/test/yarp/snapshots/whitequark/send_lambda_args_noparen.txt index 8767cf48fa..ebb6fb1065 100644 --- a/test/yarp/snapshots/whitequark/send_lambda_args_noparen.txt +++ b/test/yarp/snapshots/whitequark/send_lambda_args_noparen.txt @@ -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)( [], diff --git a/test/yarp/snapshots/whitequark/send_lambda_args_shadow.txt b/test/yarp/snapshots/whitequark/send_lambda_args_shadow.txt index a2e92a67dc..9a6c888a93 100644 --- a/test/yarp/snapshots/whitequark/send_lambda_args_shadow.txt +++ b/test/yarp/snapshots/whitequark/send_lambda_args_shadow.txt @@ -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)], diff --git a/test/yarp/snapshots/whitequark/send_lambda_legacy.txt b/test/yarp/snapshots/whitequark/send_lambda_legacy.txt index fdc30c30dc..57b827cb7e 100644 --- a/test/yarp/snapshots/whitequark/send_lambda_legacy.txt +++ b/test/yarp/snapshots/whitequark/send_lambda_legacy.txt @@ -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)] + ) ) diff --git a/yarp/config.yml b/yarp/config.yml index 62a3c2249c..c7fec6f846 100644 --- a/yarp/config.yml +++ b/yarp/config.yml @@ -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 diff --git a/yarp/yarp.c b/yarp/yarp.c index 46a57fe4e2..87d6a16cfa 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -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);