From ec47fc9539d8b18bcd5857d60acc84030eb95f47 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Fri, 18 Aug 2023 15:09:38 -0400 Subject: [PATCH] [ruby/yarp] Consolidate OperatorAndWrite and OperatorOrWrite nodes https://github.com/ruby/yarp/commit/9e680a7598 --- test/yarp/location_test.rb | 69 +-- test/yarp/snapshots/boolean_operators.txt | 14 +- .../seattlerb/bug_op_asgn_rescue.txt | 7 +- .../seattlerb/const_2_op_asgn_or2.txt | 6 +- .../seattlerb/const_3_op_asgn_or.txt | 6 +- .../seattlerb/const_op_asgn_and2.txt | 6 +- .../snapshots/seattlerb/const_op_asgn_or.txt | 6 +- .../seattlerb/op_asgn_command_call.txt | 7 +- .../unparser/corpus/literal/assignment.txt | 16 +- .../unparser/corpus/literal/opasgn.txt | 28 +- .../unparser/corpus/literal/send.txt | 7 +- .../snapshots/whitequark/const_op_asgn.txt | 12 +- .../snapshots/whitequark/ruby_bug_12402.txt | 12 +- .../snapshots/whitequark/var_and_asgn.txt | 7 +- .../yarp/snapshots/whitequark/var_or_asgn.txt | 7 +- yarp/config.yml | 188 ++------ yarp/yarp.c | 441 +++--------------- 17 files changed, 171 insertions(+), 668 deletions(-) diff --git a/test/yarp/location_test.rb b/test/yarp/location_test.rb index 789bd49ec1..6db82e7da5 100644 --- a/test/yarp/location_test.rb +++ b/test/yarp/location_test.rb @@ -17,6 +17,16 @@ module YARP assert_location(AndNode, "foo && bar") end + def test_AndWriteNode + assert_location(AndWriteNode, "foo &&= bar") + assert_location(AndWriteNode, "foo = 1; foo &&= bar", 9...20) + assert_location(AndWriteNode, "@@foo &&= bar") + assert_location(AndWriteNode, "Parent::Child &&= bar") + assert_location(AndWriteNode, "Foo &&= bar") + assert_location(AndWriteNode, "$foo &&= bar") + assert_location(AndWriteNode, "@foo &&= bar") + end + def test_ArgumentsNode assert_location(ArgumentsNode, "foo(bar, baz, qux)", 4...17, &:arguments) end @@ -199,18 +209,10 @@ module YARP assert_location(ClassNode, "class Foo < Bar end") end - def test_ClassVariableOperatorAndWriteNode - assert_location(ClassVariableOperatorAndWriteNode, "@@foo &&= bar") - end - def test_ClassVariableOperatorWriteNode assert_location(ClassVariableOperatorWriteNode, "@@foo += bar") end - def test_ClassVariableOperatorOrWriteNode - assert_location(ClassVariableOperatorOrWriteNode, "@@foo ||= bar") - end - def test_ClassVariableReadNode assert_location(ClassVariableReadNode, "@@foo") end @@ -231,30 +233,14 @@ module YARP assert_location(ConstantPathWriteNode, "::Foo::Bar = baz") end - def test_ConstantPathOperatorAndWriteNode - assert_location(ConstantPathOperatorAndWriteNode, "Parent::Child &&= bar") - end - def test_ConstantPathOperatorWriteNode assert_location(ConstantPathOperatorWriteNode, "Parent::Child += bar") end - def test_ConstantPathOperatorOrWriteNode - assert_location(ConstantPathOperatorOrWriteNode, "Parent::Child ||= bar") - end - - def test_ConstantOperatorAndWriteNode - assert_location(ConstantOperatorAndWriteNode, "Foo &&= bar") - end - def test_ConstantOperatorWriteNode assert_location(ConstantOperatorWriteNode, "Foo += bar") end - def test_ConstantOperatorOrWriteNode - assert_location(ConstantOperatorOrWriteNode, "Foo ||= bar") - end - def test_ConstantReadNode assert_location(ConstantReadNode, "Foo") assert_location(ConstantReadNode, "Foo::Bar", 5...8, &:child) @@ -328,18 +314,10 @@ module YARP assert_location(ForwardingSuperNode, "super {}") end - def test_GlobalVariableOperatorAndWriteNode - assert_location(GlobalVariableOperatorAndWriteNode, "$foo &&= bar") - end - def test_GlobalVariableOperatorWriteNode assert_location(GlobalVariableOperatorWriteNode, "$foo += bar") end - def test_GlobalVariableOperatorOrWriteNode - assert_location(GlobalVariableOperatorOrWriteNode, "$foo ||= bar") - end - def test_GlobalVariableReadNode assert_location(GlobalVariableReadNode, "$foo") end @@ -374,18 +352,10 @@ module YARP end end - def test_InstanceVariableOperatorAndWriteNode - assert_location(InstanceVariableOperatorAndWriteNode, "@foo &&= bar") - end - def test_InstanceVariableOperatorWriteNode assert_location(InstanceVariableOperatorWriteNode, "@foo += bar") end - def test_InstanceVariableOperatorOrWriteNode - assert_location(InstanceVariableOperatorOrWriteNode, "@foo ||= bar") - end - def test_InstanceVariableReadNode assert_location(InstanceVariableReadNode, "@foo") end @@ -452,20 +422,11 @@ module YARP assert_location(LambdaNode, "-> do foo end") end - def test_LocalVariableOperatorAndWriteNode - assert_location(LocalVariableOperatorAndWriteNode, "foo &&= bar") - assert_location(LocalVariableOperatorAndWriteNode, "foo = 1; foo &&= bar", 9...20) - end - def test_LocalVariableOperatorWriteNode assert_location(LocalVariableOperatorWriteNode, "foo += bar") assert_location(LocalVariableOperatorWriteNode, "foo = 1; foo += bar", 9...19) end - def test_LocalVariableOperatorOrWriteNode - assert_location(LocalVariableOperatorOrWriteNode, "foo ||= bar") - assert_location(LocalVariableOperatorOrWriteNode, "foo = 1; foo ||= bar", 9...20) - end def test_LocalVariableReadNode assert_location(LocalVariableReadNode, "foo = 1; foo", 9...12) @@ -521,6 +482,16 @@ module YARP assert_location(OrNode, "foo or bar") end + def test_OrWriteNode + assert_location(OrWriteNode, "@@foo ||= bar") + assert_location(OrWriteNode, "Parent::Child ||= bar") + assert_location(OrWriteNode, "Foo ||= bar") + assert_location(OrWriteNode, "$foo ||= bar") + assert_location(OrWriteNode, "@foo ||= bar") + assert_location(OrWriteNode, "foo ||= bar") + assert_location(OrWriteNode, "foo = 1; foo ||= bar", 9...20) + end + def test_ParametersNode assert_location(ParametersNode, "def foo(bar, baz); end", 8...16, &:parameters) end diff --git a/test/yarp/snapshots/boolean_operators.txt b/test/yarp/snapshots/boolean_operators.txt index 1b8a2aaed9..51fd183944 100644 --- a/test/yarp/snapshots/boolean_operators.txt +++ b/test/yarp/snapshots/boolean_operators.txt @@ -1,11 +1,10 @@ ProgramNode(0...24)( [:a], StatementsNode(0...24)( - [LocalVariableOperatorAndWriteNode(0...7)( - (0...1), - (2...5), + [AndWriteNode(0...7)( + LocalVariableReadNode(0...1)(:a, 0), CallNode(6...7)(nil, nil, (6...7), nil, nil, nil, nil, 2, "b"), - :a + (2...5) ), LocalVariableOperatorWriteNode(9...15)( (9...10), @@ -14,11 +13,10 @@ ProgramNode(0...24)( :a, :+ ), - LocalVariableOperatorOrWriteNode(17...24)( - (17...18), - (19...22), + OrWriteNode(17...24)( + LocalVariableReadNode(17...18)(:a, 0), CallNode(23...24)(nil, nil, (23...24), nil, nil, nil, nil, 2, "b"), - :a + (19...22) )] ) ) diff --git a/test/yarp/snapshots/seattlerb/bug_op_asgn_rescue.txt b/test/yarp/snapshots/seattlerb/bug_op_asgn_rescue.txt index e54cde69f5..ca841c4e1d 100644 --- a/test/yarp/snapshots/seattlerb/bug_op_asgn_rescue.txt +++ b/test/yarp/snapshots/seattlerb/bug_op_asgn_rescue.txt @@ -1,15 +1,14 @@ ProgramNode(0...18)( [:a], StatementsNode(0...18)( - [LocalVariableOperatorOrWriteNode(0...18)( - (0...1), - (2...5), + [OrWriteNode(0...18)( + LocalVariableReadNode(0...1)(:a, 0), RescueModifierNode(6...18)( CallNode(6...7)(nil, nil, (6...7), nil, nil, nil, nil, 2, "b"), (8...14), NilNode(15...18)() ), - :a + (2...5) )] ) ) diff --git a/test/yarp/snapshots/seattlerb/const_2_op_asgn_or2.txt b/test/yarp/snapshots/seattlerb/const_2_op_asgn_or2.txt index dfaac5447c..369adfb8bb 100644 --- a/test/yarp/snapshots/seattlerb/const_2_op_asgn_or2.txt +++ b/test/yarp/snapshots/seattlerb/const_2_op_asgn_or2.txt @@ -1,14 +1,14 @@ ProgramNode(0...12)( [], StatementsNode(0...12)( - [ConstantPathOperatorOrWriteNode(0...12)( + [OrWriteNode(0...12)( ConstantPathNode(0...6)( ConstantPathNode(0...3)(nil, ConstantReadNode(2...3)(), (0...2)), ConstantReadNode(5...6)(), (3...5) ), - (7...10), - IntegerNode(11...12)() + IntegerNode(11...12)(), + (7...10) )] ) ) diff --git a/test/yarp/snapshots/seattlerb/const_3_op_asgn_or.txt b/test/yarp/snapshots/seattlerb/const_3_op_asgn_or.txt index c9d4dbfe31..60b59b6f01 100644 --- a/test/yarp/snapshots/seattlerb/const_3_op_asgn_or.txt +++ b/test/yarp/snapshots/seattlerb/const_3_op_asgn_or.txt @@ -1,10 +1,10 @@ ProgramNode(0...9)( [], StatementsNode(0...9)( - [ConstantPathOperatorOrWriteNode(0...9)( + [OrWriteNode(0...9)( ConstantPathNode(0...3)(nil, ConstantReadNode(2...3)(), (0...2)), - (4...7), - IntegerNode(8...9)() + IntegerNode(8...9)(), + (4...7) )] ) ) diff --git a/test/yarp/snapshots/seattlerb/const_op_asgn_and2.txt b/test/yarp/snapshots/seattlerb/const_op_asgn_and2.txt index 85739dac2d..6c9c815794 100644 --- a/test/yarp/snapshots/seattlerb/const_op_asgn_and2.txt +++ b/test/yarp/snapshots/seattlerb/const_op_asgn_and2.txt @@ -1,10 +1,10 @@ ProgramNode(0...9)( [], StatementsNode(0...9)( - [ConstantPathOperatorAndWriteNode(0...9)( + [AndWriteNode(0...9)( ConstantPathNode(0...3)(nil, ConstantReadNode(2...3)(), (0...2)), - (4...7), - IntegerNode(8...9)() + IntegerNode(8...9)(), + (4...7) )] ) ) diff --git a/test/yarp/snapshots/seattlerb/const_op_asgn_or.txt b/test/yarp/snapshots/seattlerb/const_op_asgn_or.txt index d1bfe6cd4d..8a42b824dc 100644 --- a/test/yarp/snapshots/seattlerb/const_op_asgn_or.txt +++ b/test/yarp/snapshots/seattlerb/const_op_asgn_or.txt @@ -1,14 +1,14 @@ ProgramNode(0...10)( [], StatementsNode(0...10)( - [ConstantPathOperatorOrWriteNode(0...10)( + [OrWriteNode(0...10)( ConstantPathNode(0...4)( ConstantReadNode(0...1)(), ConstantReadNode(3...4)(), (1...3) ), - (5...8), - IntegerNode(9...10)() + IntegerNode(9...10)(), + (5...8) )] ) ) diff --git a/test/yarp/snapshots/seattlerb/op_asgn_command_call.txt b/test/yarp/snapshots/seattlerb/op_asgn_command_call.txt index 1daadaab67..6d7177dc5b 100644 --- a/test/yarp/snapshots/seattlerb/op_asgn_command_call.txt +++ b/test/yarp/snapshots/seattlerb/op_asgn_command_call.txt @@ -1,9 +1,8 @@ ProgramNode(0...11)( [:a], StatementsNode(0...11)( - [LocalVariableOperatorOrWriteNode(0...11)( - (0...1), - (2...5), + [OrWriteNode(0...11)( + LocalVariableReadNode(0...1)(:a, 0), CallNode(6...11)( CallNode(6...7)(nil, nil, (6...7), nil, nil, nil, nil, 2, "b"), (7...8), @@ -15,7 +14,7 @@ ProgramNode(0...11)( 0, "c" ), - :a + (2...5) )] ) ) diff --git a/test/yarp/snapshots/unparser/corpus/literal/assignment.txt b/test/yarp/snapshots/unparser/corpus/literal/assignment.txt index 1423b7e4d0..63b60ba98c 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/assignment.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/assignment.txt @@ -610,10 +610,10 @@ ProgramNode(0...704)( ), (543...546) ), - InstanceVariableOperatorOrWriteNode(551...561)( - (551...553), - (554...557), - StringNode(558...561)((558...560), (560...560), (560...561), "") + OrWriteNode(551...561)( + InstanceVariableReadNode(551...553)(), + StringNode(558...561)((558...560), (560...560), (560...561), ""), + (554...557) ), LocalVariableWriteNode(562...576)( :x, @@ -703,16 +703,16 @@ ProgramNode(0...704)( ), (665...668) ), - InstanceVariableOperatorOrWriteNode(687...704)( - (687...689), - (690...693), + OrWriteNode(687...704)( + InstanceVariableReadNode(687...689)(), InterpolatedStringNode(694...704)( (694...704), [StringNode(705...707)(nil, (705...707), nil, " "), EmbeddedStatementsNode(707...710)((707...709), nil, (709...710)), StringNode(710...711)(nil, (710...711), nil, "\n")], (711...719) - ) + ), + (690...693) )] ) ) diff --git a/test/yarp/snapshots/unparser/corpus/literal/opasgn.txt b/test/yarp/snapshots/unparser/corpus/literal/opasgn.txt index 04f547fc9e..8be4d97e04 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/opasgn.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/opasgn.txt @@ -36,26 +36,23 @@ ProgramNode(0...233)( :a, :/ ), - LocalVariableOperatorAndWriteNode(36...43)( - (36...37), - (38...41), + AndWriteNode(36...43)( + LocalVariableReadNode(36...37)(:a, 0), CallNode(42...43)(nil, nil, (42...43), nil, nil, nil, nil, 2, "b"), - :a + (38...41) ), - LocalVariableOperatorOrWriteNode(44...51)( - (44...45), - (46...49), + OrWriteNode(44...51)( + LocalVariableReadNode(44...45)(:a, 0), IntegerNode(50...51)(), - :a + (46...49) ), CallNode(52...65)( ParenthesesNode(52...61)( StatementsNode(53...60)( - [LocalVariableOperatorOrWriteNode(53...60)( - (53...54), - (55...58), + [OrWriteNode(53...60)( + LocalVariableReadNode(53...54)(:a, 0), IntegerNode(59...60)(), - :a + (55...58) )] ), (52...53), @@ -73,11 +70,10 @@ ProgramNode(0...233)( CallNode(66...83)( ParenthesesNode(66...76)( StatementsNode(67...75)( - [LocalVariableOperatorOrWriteNode(67...75)( - (67...68), - (69...72), + [OrWriteNode(67...75)( + LocalVariableReadNode(67...68)(:h, 0), HashNode(73...75)((73...74), [], (74...75)), - :h + (69...72) )] ), (66...67), diff --git a/test/yarp/snapshots/unparser/corpus/literal/send.txt b/test/yarp/snapshots/unparser/corpus/literal/send.txt index e6ba96546f..89ac183363 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/send.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/send.txt @@ -6,9 +6,8 @@ ProgramNode(0...991)( (0...6), ConstantReadNode(7...8)(), StatementsNode(11...31)( - [LocalVariableOperatorOrWriteNode(11...31)( - (11...14), - (15...18), + [OrWriteNode(11...31)( + LocalVariableReadNode(11...14)(:foo, 0), ParenthesesNode(19...31)( StatementsNode(21...30)( [MultiWriteNode(21...30)( @@ -45,7 +44,7 @@ ProgramNode(0...991)( (19...20), (30...31) ), - :foo + (15...18) )] ), (32...35) diff --git a/test/yarp/snapshots/whitequark/const_op_asgn.txt b/test/yarp/snapshots/whitequark/const_op_asgn.txt index ef5e755c8e..101df656f9 100644 --- a/test/yarp/snapshots/whitequark/const_op_asgn.txt +++ b/test/yarp/snapshots/whitequark/const_op_asgn.txt @@ -28,14 +28,14 @@ ProgramNode(0...77)( nil, nil, StatementsNode(36...45)( - [ConstantPathOperatorOrWriteNode(36...45)( + [OrWriteNode(36...45)( ConstantPathNode(36...39)( nil, ConstantReadNode(38...39)(), (36...38) ), - (40...43), - IntegerNode(44...45)() + IntegerNode(44...45)(), + (40...43) )] ), [], @@ -51,14 +51,14 @@ ProgramNode(0...77)( nil, nil, StatementsNode(59...72)( - [ConstantPathOperatorOrWriteNode(59...72)( + [OrWriteNode(59...72)( ConstantPathNode(59...66)( SelfNode(59...63)(), ConstantReadNode(65...66)(), (63...65) ), - (67...70), - IntegerNode(71...72)() + IntegerNode(71...72)(), + (67...70) )] ), [], diff --git a/test/yarp/snapshots/whitequark/ruby_bug_12402.txt b/test/yarp/snapshots/whitequark/ruby_bug_12402.txt index fb00d826a2..f329ad8bbd 100644 --- a/test/yarp/snapshots/whitequark/ruby_bug_12402.txt +++ b/test/yarp/snapshots/whitequark/ruby_bug_12402.txt @@ -301,13 +301,12 @@ ProgramNode(0...437)( ), :+ ), - ConstantPathOperatorOrWriteNode(242...273)( + OrWriteNode(242...273)( ConstantPathNode(242...248)( LocalVariableReadNode(242...245)(:foo, 0), ConstantReadNode(247...248)(), (245...247) ), - (249...252), CallNode(253...273)( nil, nil, @@ -334,15 +333,15 @@ ProgramNode(0...437)( nil, 0, "raise" - ) + ), + (249...252) ), - ConstantPathOperatorOrWriteNode(275...307)( + OrWriteNode(275...307)( ConstantPathNode(275...281)( LocalVariableReadNode(275...278)(:foo, 0), ConstantReadNode(280...281)(), (278...280) ), - (282...285), RescueModifierNode(286...307)( CallNode(286...296)( nil, @@ -369,7 +368,8 @@ ProgramNode(0...437)( ), (297...303), NilNode(304...307)() - ) + ), + (282...285) ), CallOperatorWriteNode(309...339)( CallNode(309...315)( diff --git a/test/yarp/snapshots/whitequark/var_and_asgn.txt b/test/yarp/snapshots/whitequark/var_and_asgn.txt index 76469d6b93..8d476a815e 100644 --- a/test/yarp/snapshots/whitequark/var_and_asgn.txt +++ b/test/yarp/snapshots/whitequark/var_and_asgn.txt @@ -1,11 +1,10 @@ ProgramNode(0...7)( [:a], StatementsNode(0...7)( - [LocalVariableOperatorAndWriteNode(0...7)( - (0...1), - (2...5), + [AndWriteNode(0...7)( + LocalVariableReadNode(0...1)(:a, 0), IntegerNode(6...7)(), - :a + (2...5) )] ) ) diff --git a/test/yarp/snapshots/whitequark/var_or_asgn.txt b/test/yarp/snapshots/whitequark/var_or_asgn.txt index 39cc823867..cc029042a8 100644 --- a/test/yarp/snapshots/whitequark/var_or_asgn.txt +++ b/test/yarp/snapshots/whitequark/var_or_asgn.txt @@ -1,11 +1,10 @@ ProgramNode(0...7)( [:a], StatementsNode(0...7)( - [LocalVariableOperatorOrWriteNode(0...7)( - (0...1), - (2...5), + [OrWriteNode(0...7)( + LocalVariableReadNode(0...1)(:a, 0), IntegerNode(6...7)(), - :a + (2...5) )] ) ) diff --git a/yarp/config.yml b/yarp/config.yml index 8b33b6675d..8e923495ff 100644 --- a/yarp/config.yml +++ b/yarp/config.yml @@ -399,6 +399,19 @@ nodes: left and right ^^^^^^^^^^^^^^ + - name: AndWriteNode + child_nodes: + - name: target + type: node + - name: value + type: node + - name: operator_loc + type: location + comment: | + Represents the use of the `&&=` operator. + + target &&= value + ^^^^^^^^^^^^^^^^ - name: ArgumentsNode child_nodes: - name: arguments @@ -723,32 +736,6 @@ nodes: class Foo end ^^^^^^^^^^^^^ - - name: ClassVariableOperatorAndWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `&&=` operator for assignment to a class variable. - - @@target &&= value - ^^^^^^^^^^^^^^^^ - - name: ClassVariableOperatorOrWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `||=` operator for assignment to a class variable. - - @@target ||= value - ^^^^^^^^^^^^^^^^^^ - name: ClassVariableOperatorWriteNode child_nodes: - name: name_loc @@ -783,32 +770,6 @@ nodes: @@foo = 1 ^^^^^^^^^ - - name: ConstantOperatorAndWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `&&=` operator for assignment to a constant. - - Target &&= value - ^^^^^^^^^^^^^^^^ - - name: ConstantOperatorOrWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `||=` operator for assignment to a constant. - - Target ||= value - ^^^^^^^^^^^^^^^^ - name: ConstantOperatorWriteNode child_nodes: - name: name_loc @@ -837,34 +798,6 @@ nodes: Foo::Bar ^^^^^^^^ - - name: ConstantPathOperatorAndWriteNode - child_nodes: - - name: target - type: node - kind: ConstantPathNode - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `&&=` operator for assignment to a constant path. - - Parent::Child &&= value - ^^^^^^^^^^^^^^^^^^^^^^^ - - name: ConstantPathOperatorOrWriteNode - child_nodes: - - name: target - type: node - kind: ConstantPathNode - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `||=` operator for assignment to a constant path. - - Parent::Child ||= value - ^^^^^^^^^^^^^^^^^^^^^^^ - name: ConstantPathOperatorWriteNode child_nodes: - name: target @@ -1123,32 +1056,6 @@ nodes: super ^^^^^ - - name: GlobalVariableOperatorAndWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `&&=` operator for assignment to a global variable. - - $target &&= value - ^^^^^^^^^^^^^^^^^ - - name: GlobalVariableOperatorOrWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `||=` operator for assignment to a global variable. - - $target ||= value - ^^^^^^^^^^^^^^^^^ - name: GlobalVariableOperatorWriteNode child_nodes: - name: name_loc @@ -1263,32 +1170,6 @@ nodes: case a; in b then c end ^^^^^^^^^^^ - - name: InstanceVariableOperatorAndWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `&&=` operator for assignment to an instance variable. - - @target &&= value - ^^^^^^^^^^^^^^^^^ - - name: InstanceVariableOperatorOrWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - comment: | - Represents the use of the `||=` operator for assignment to an instance variable. - - @target ||= value - ^^^^^^^^^^^^^^^^^ - name: InstanceVariableOperatorWriteNode child_nodes: - name: name_loc @@ -1441,36 +1322,6 @@ nodes: ->(value) { value * 2 } ^^^^^^^^^^^^^^^^^^^^^^^ - - name: LocalVariableOperatorAndWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - - name: constant_id - type: constant - comment: | - Represents the use of the `&&=` operator for assignment to a local variable. - - target &&= value - ^^^^^^^^^^^^^^^^ - - name: LocalVariableOperatorOrWriteNode - child_nodes: - - name: name_loc - type: location - - name: operator_loc - type: location - - name: value - type: node - - name: constant_id - type: constant - comment: | - Represents the use of the `||=` operator for assignment to a local variable. - - target ||= value - ^^^^^^^^^^^^^^^^ - name: LocalVariableOperatorWriteNode child_nodes: - name: name_loc @@ -1647,6 +1498,19 @@ nodes: left or right ^^^^^^^^^^^^^ + - name: OrWriteNode + child_nodes: + - name: target + type: node + - name: value + type: node + - name: operator_loc + type: location + comment: | + Represents the use of the `||=` operator. + + target ||= value + ^^^^^^^^^^^^^^^^ - name: ParametersNode child_nodes: - name: requireds diff --git a/yarp/yarp.c b/yarp/yarp.c index 2d54e80583..4718f59c4a 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -658,6 +658,27 @@ yp_and_node_create(yp_parser_t *parser, yp_node_t *left, const yp_token_t *opera return node; } +// Allocate and initialize a new AndWriteNode. +static yp_and_write_node_t * +yp_and_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { + yp_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_and_write_node_t); + + *node = (yp_and_write_node_t) { + { + .type = YP_NODE_AND_WRITE_NODE, + .location = { + .start = target->location.start, + .end = value->location.end + }, + }, + .target = target, + .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), + .value = value + }; + + return node; +} + // Allocate an initialize a new arguments node. static yp_arguments_node_t * yp_arguments_node_create(yp_parser_t *parser) { @@ -1485,29 +1506,6 @@ yp_class_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const y return node; } -// Allocate and initialize a new ClassVariableOperatorAndWriteNode node. -static yp_class_variable_operator_and_write_node_t * -yp_class_variable_operator_and_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_CLASS_VARIABLE_READ_NODE)); - assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL); - yp_class_variable_operator_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_operator_and_write_node_t); - - *node = (yp_class_variable_operator_and_write_node_t) { - { - .type = YP_NODE_CLASS_VARIABLE_OPERATOR_AND_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new ClassVariableOperatorWriteNode node. static yp_class_variable_operator_write_node_t * yp_class_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { @@ -1530,29 +1528,6 @@ yp_class_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *tar return node; } -// Allocate and initialize a new ClassVariableOperatorOrWriteNode node. -static yp_class_variable_operator_or_write_node_t * -yp_class_variable_operator_or_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_CLASS_VARIABLE_READ_NODE)); - assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL); - yp_class_variable_operator_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_operator_or_write_node_t); - - *node = (yp_class_variable_operator_or_write_node_t) { - { - .type = YP_NODE_CLASS_VARIABLE_OPERATOR_OR_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new ClassVariableReadNode node. static yp_class_variable_read_node_t * yp_class_variable_read_node_create(yp_parser_t *parser, const yp_token_t *token) { @@ -1583,28 +1558,6 @@ yp_class_variable_read_node_to_class_variable_write_node(yp_parser_t *parser, yp return node; } -// Allocate and initialize a new ConstantPathOperatorAndWriteNode node. -static yp_constant_path_operator_and_write_node_t * -yp_constant_path_operator_and_write_node_create(yp_parser_t *parser, yp_constant_path_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL); - yp_constant_path_operator_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_constant_path_operator_and_write_node_t); - - *node = (yp_constant_path_operator_and_write_node_t) { - { - .type = YP_NODE_CONSTANT_PATH_OPERATOR_AND_WRITE_NODE, - .location = { - .start = target->base.location.start, - .end = value->location.end - } - }, - .target = target, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new ConstantPathOperatorWriteNode node. static yp_constant_path_operator_write_node_t * yp_constant_path_operator_write_node_create(yp_parser_t *parser, yp_constant_path_node_t *target, const yp_token_t *operator, yp_node_t *value) { @@ -1627,28 +1580,6 @@ yp_constant_path_operator_write_node_create(yp_parser_t *parser, yp_constant_pat return node; } -// Allocate and initialize a new ConstantPathOperatorOrWriteNode node. -static yp_constant_path_operator_or_write_node_t * -yp_constant_path_operator_or_write_node_create(yp_parser_t *parser, yp_constant_path_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL); - yp_constant_path_operator_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_constant_path_operator_or_write_node_t); - - *node = (yp_constant_path_operator_or_write_node_t) { - { - .type = YP_NODE_CONSTANT_PATH_OPERATOR_OR_WRITE_NODE, - .location = { - .start = target->base.location.start, - .end = value->location.end - } - }, - .target = target, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new ConstantPathNode node. static yp_constant_path_node_t * yp_constant_path_node_create(yp_parser_t *parser, yp_node_t *parent, const yp_token_t *delimiter, yp_node_t *child) { @@ -1691,29 +1622,6 @@ yp_constant_path_write_node_create(yp_parser_t *parser, yp_constant_path_node_t return node; } -// Allocate and initialize a new ConstantOperatorAndWriteNode node. -static yp_constant_operator_and_write_node_t * -yp_constant_operator_and_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_CONSTANT_READ_NODE)); - assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL); - yp_constant_operator_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_constant_operator_and_write_node_t); - - *node = (yp_constant_operator_and_write_node_t) { - { - .type = YP_NODE_CONSTANT_OPERATOR_AND_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new ConstantOperatorWriteNode node. static yp_constant_operator_write_node_t * yp_constant_operator_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { @@ -1736,29 +1644,6 @@ yp_constant_operator_write_node_create(yp_parser_t *parser, yp_node_t *target, c return node; } -// Allocate and initialize a new ConstantOperatorOrWriteNode node. -static yp_constant_operator_or_write_node_t * -yp_constant_operator_or_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_CONSTANT_READ_NODE)); - assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL); - yp_constant_operator_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_constant_operator_or_write_node_t); - - *node = (yp_constant_operator_or_write_node_t) { - { - .type = YP_NODE_CONSTANT_OPERATOR_OR_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new ConstantReadNode node. static yp_constant_read_node_t * yp_constant_read_node_create(yp_parser_t *parser, const yp_token_t *name) { @@ -2193,29 +2078,6 @@ yp_hash_pattern_node_node_list_create(yp_parser_t *parser, yp_node_list_t *assoc return node; } -// Allocate and initialize a new GlobalVariableOperatorAndWriteNode node. -static yp_global_variable_operator_and_write_node_t * -yp_global_variable_operator_and_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_GLOBAL_VARIABLE_READ_NODE) || YP_NODE_TYPE_P(target, YP_NODE_BACK_REFERENCE_READ_NODE) || YP_NODE_TYPE_P(target, YP_NODE_NUMBERED_REFERENCE_READ_NODE)); - assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL); - yp_global_variable_operator_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_global_variable_operator_and_write_node_t); - - *node = (yp_global_variable_operator_and_write_node_t) { - { - .type = YP_NODE_GLOBAL_VARIABLE_OPERATOR_AND_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new GlobalVariableOperatorWriteNode node. static yp_global_variable_operator_write_node_t * yp_global_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { @@ -2238,29 +2100,6 @@ yp_global_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *ta return node; } -// Allocate and initialize a new GlobalVariableOperatorOrWriteNode node. -static yp_global_variable_operator_or_write_node_t * -yp_global_variable_operator_or_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_GLOBAL_VARIABLE_READ_NODE) || YP_NODE_TYPE_P(target, YP_NODE_BACK_REFERENCE_READ_NODE) || YP_NODE_TYPE_P(target, YP_NODE_NUMBERED_REFERENCE_READ_NODE)); - assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL); - yp_global_variable_operator_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_global_variable_operator_or_write_node_t); - - *node = (yp_global_variable_operator_or_write_node_t) { - { - .type = YP_NODE_GLOBAL_VARIABLE_OPERATOR_OR_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate a new GlobalVariableReadNode node. static yp_global_variable_read_node_t * yp_global_variable_read_node_create(yp_parser_t *parser, const yp_token_t *name) { @@ -2551,29 +2390,6 @@ yp_in_node_create(yp_parser_t *parser, yp_node_t *pattern, yp_statements_node_t return node; } -// Allocate and initialize a new InstanceVariableOperatorAndWriteNode node. -static yp_instance_variable_operator_and_write_node_t * -yp_instance_variable_operator_and_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_INSTANCE_VARIABLE_READ_NODE)); - assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL); - yp_instance_variable_operator_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_instance_variable_operator_and_write_node_t); - - *node = (yp_instance_variable_operator_and_write_node_t) { - { - .type = YP_NODE_INSTANCE_VARIABLE_OPERATOR_AND_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new InstanceVariableOperatorWriteNode node. static yp_instance_variable_operator_write_node_t * yp_instance_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { @@ -2596,29 +2412,6 @@ yp_instance_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t * return node; } -// Allocate and initialize a new InstanceVariableOperatorOrWriteNode node. -static yp_instance_variable_operator_or_write_node_t * -yp_instance_variable_operator_or_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { - assert(YP_NODE_TYPE_P(target, YP_NODE_INSTANCE_VARIABLE_READ_NODE)); - assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL); - yp_instance_variable_operator_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_instance_variable_operator_or_write_node_t); - - *node = (yp_instance_variable_operator_or_write_node_t) { - { - .type = YP_NODE_INSTANCE_VARIABLE_OPERATOR_OR_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value - }; - - return node; -} - // Allocate and initialize a new InstanceVariableReadNode node. static yp_instance_variable_read_node_t * yp_instance_variable_read_node_create(yp_parser_t *parser, const yp_token_t *token) { @@ -2892,30 +2685,6 @@ yp_lambda_node_create( return node; } -// Allocate and initialize a new LocalVariableOperatorAndWriteNode node. -static yp_local_variable_operator_and_write_node_t * -yp_local_variable_operator_and_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value, yp_constant_id_t constant_id) { - assert(YP_NODE_TYPE_P(target, YP_NODE_LOCAL_VARIABLE_READ_NODE) || YP_NODE_TYPE_P(target, YP_NODE_CALL_NODE)); - assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL); - yp_local_variable_operator_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_local_variable_operator_and_write_node_t); - - *node = (yp_local_variable_operator_and_write_node_t) { - { - .type = YP_NODE_LOCAL_VARIABLE_OPERATOR_AND_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value, - .constant_id = constant_id - }; - - return node; -} - // Allocate and initialize a new LocalVariableOperatorWriteNode node. static yp_local_variable_operator_write_node_t * yp_local_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value, yp_constant_id_t constant_id) { @@ -2939,30 +2708,6 @@ yp_local_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *tar return node; } -// Allocate and initialize a new LocalVariableOperatorOrWriteNode node. -static yp_local_variable_operator_or_write_node_t * -yp_local_variable_operator_or_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value, yp_constant_id_t constant_id) { - assert(YP_NODE_TYPE_P(target, YP_NODE_LOCAL_VARIABLE_READ_NODE) || YP_NODE_TYPE_P(target, YP_NODE_CALL_NODE)); - assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL); - yp_local_variable_operator_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_local_variable_operator_or_write_node_t); - - *node = (yp_local_variable_operator_or_write_node_t) { - { - .type = YP_NODE_LOCAL_VARIABLE_OPERATOR_OR_WRITE_NODE, - .location = { - .start = target->location.start, - .end = value->location.end - } - }, - .name_loc = target->location, - .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), - .value = value, - .constant_id = constant_id - }; - - return node; -} - // Allocate a new LocalVariableReadNode node. static yp_local_variable_read_node_t * yp_local_variable_read_node_create(yp_parser_t *parser, const yp_token_t *name, uint32_t depth) { @@ -3239,6 +2984,27 @@ yp_or_node_create(yp_parser_t *parser, yp_node_t *left, const yp_token_t *operat return node; } +// Allocate and initialize a new OrWriteNode. +static yp_or_write_node_t * +yp_or_write_node_create(yp_parser_t *parser, yp_node_t *target, const yp_token_t *operator, yp_node_t *value) { + yp_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_or_write_node_t); + + *node = (yp_or_write_node_t) { + { + .type = YP_NODE_OR_WRITE_NODE, + .location = { + .start = target->location.start, + .end = value->location.end + }, + }, + .target = target, + .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), + .value = value + }; + + return node; +} + // Allocate and initialize a new ParametersNode node. static yp_parameters_node_t * yp_parameters_node_create(yp_parser_t *parser) { @@ -12452,14 +12218,15 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t case YP_NODE_NUMBERED_REFERENCE_READ_NODE: yp_diagnostic_list_append(&parser->error_list, node->location.start, node->location.end, "Can't set variable"); /* fallthrough */ - case YP_NODE_GLOBAL_VARIABLE_READ_NODE: { + case YP_NODE_CLASS_VARIABLE_READ_NODE: + case YP_NODE_CONSTANT_PATH_NODE: + case YP_NODE_CONSTANT_READ_NODE: + case YP_NODE_GLOBAL_VARIABLE_READ_NODE: + case YP_NODE_INSTANCE_VARIABLE_READ_NODE: + case YP_NODE_LOCAL_VARIABLE_READ_NODE: { parser_lex(parser); - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); - yp_node_t *result = (yp_node_t *) yp_global_variable_operator_and_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; + return (yp_node_t *) yp_and_write_node_create(parser, node, &token, value); } case YP_NODE_CALL_NODE: { yp_call_node_t *call_node = (yp_call_node_t *) node; @@ -12476,13 +12243,11 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t } parser_lex(parser); - + yp_node_t *target = (yp_node_t *) yp_local_variable_read_node_create(parser, &(yp_token_t) { .type = YP_TOKEN_IDENTIFIER, .start = message_loc.start, .end = message_loc.end }, 0); yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); - yp_constant_id_t constant_id = yp_parser_constant_id_location(parser, message_loc.start, message_loc.end); - yp_node_t *result = (yp_node_t *) yp_local_variable_operator_and_write_node_create(parser, node, &token, value, constant_id); yp_node_destroy(parser, node); - return result; + return (yp_node_t *) yp_and_write_node_create(parser, target, &token, value); } parser_lex(parser); @@ -12493,49 +12258,6 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); return (yp_node_t *) yp_call_operator_and_write_node_create(parser, (yp_call_node_t *) node, &token, value); } - case YP_NODE_CLASS_VARIABLE_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); - yp_node_t *result = (yp_node_t *) yp_class_variable_operator_and_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; - } - case YP_NODE_CONSTANT_PATH_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); - return (yp_node_t *) yp_constant_path_operator_and_write_node_create(parser, (yp_constant_path_node_t *) node, &token, value); - } - case YP_NODE_CONSTANT_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); - yp_node_t *result = (yp_node_t *) yp_constant_operator_and_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; - } - case YP_NODE_INSTANCE_VARIABLE_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); - yp_node_t *result = (yp_node_t *) yp_instance_variable_operator_and_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; - } - case YP_NODE_LOCAL_VARIABLE_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after &&="); - yp_constant_id_t constant_id = ((yp_local_variable_read_node_t *) node)->constant_id; - yp_node_t *result = (yp_node_t *) yp_local_variable_operator_and_write_node_create(parser, node, &token, value, constant_id); - - yp_node_destroy(parser, node); - return result; - } case YP_NODE_MULTI_WRITE_NODE: { parser_lex(parser); yp_diagnostic_list_append(&parser->error_list, token.start, token.end, "Cannot use `&&=' on a multi-write."); @@ -12557,14 +12279,16 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t case YP_NODE_NUMBERED_REFERENCE_READ_NODE: yp_diagnostic_list_append(&parser->error_list, node->location.start, node->location.end, "Can't set variable"); /* fallthrough */ - case YP_NODE_GLOBAL_VARIABLE_READ_NODE: { + case YP_NODE_CLASS_VARIABLE_READ_NODE: + case YP_NODE_CONSTANT_PATH_NODE: + case YP_NODE_CONSTANT_READ_NODE: + case YP_NODE_GLOBAL_VARIABLE_READ_NODE: + case YP_NODE_INSTANCE_VARIABLE_READ_NODE: + case YP_NODE_LOCAL_VARIABLE_READ_NODE: { parser_lex(parser); yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); - yp_node_t *result = (yp_node_t *) yp_global_variable_operator_or_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; + return (yp_node_t *) yp_or_write_node_create(parser, node, &token, value); } case YP_NODE_CALL_NODE: { yp_call_node_t *call_node = (yp_call_node_t *) node; @@ -12581,13 +12305,11 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t } parser_lex(parser); - + yp_node_t *target = (yp_node_t *) yp_local_variable_read_node_create(parser, &(yp_token_t) { .type = YP_TOKEN_IDENTIFIER, .start = message_loc.start, .end = message_loc.end }, 0); yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); - yp_constant_id_t constant_id = yp_parser_constant_id_location(parser, message_loc.start, message_loc.end); - yp_node_t *result = (yp_node_t *) yp_local_variable_operator_or_write_node_create(parser, node, &token, value, constant_id); yp_node_destroy(parser, node); - return result; + return (yp_node_t *) yp_or_write_node_create(parser, target, &token, value); } parser_lex(parser); @@ -12598,49 +12320,6 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); return (yp_node_t *) yp_call_operator_or_write_node_create(parser, (yp_call_node_t *) node, &token, value); } - case YP_NODE_CLASS_VARIABLE_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); - yp_node_t *result = (yp_node_t *) yp_class_variable_operator_or_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; - } - case YP_NODE_CONSTANT_PATH_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); - return (yp_node_t *) yp_constant_path_operator_or_write_node_create(parser, (yp_constant_path_node_t *) node, &token, value); - } - case YP_NODE_CONSTANT_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); - yp_node_t *result = (yp_node_t *) yp_constant_operator_or_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; - } - case YP_NODE_INSTANCE_VARIABLE_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); - yp_node_t *result = (yp_node_t *) yp_instance_variable_operator_or_write_node_create(parser, node, &token, value); - - yp_node_destroy(parser, node); - return result; - } - case YP_NODE_LOCAL_VARIABLE_READ_NODE: { - parser_lex(parser); - - yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after ||="); - yp_constant_id_t constant_id = ((yp_local_variable_read_node_t *) node)->constant_id; - yp_node_t *result = (yp_node_t *) yp_local_variable_operator_or_write_node_create(parser, node, &token, value, constant_id); - - yp_node_destroy(parser, node); - return result; - } case YP_NODE_MULTI_WRITE_NODE: { parser_lex(parser); yp_diagnostic_list_append(&parser->error_list, token.start, token.end, "Cannot use `||=' on a multi-write.");