diff options
-rw-r--r-- | lib/yarp/desugar_visitor.rb | 14 | ||||
-rw-r--r-- | test/yarp/snapshots/methods.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/patterns.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/seattlerb/case_in.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/strings.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/unparser/corpus/literal/assignment.txt | 5 | ||||
-rw-r--r-- | test/yarp/snapshots/unparser/corpus/literal/dstr.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/unparser/corpus/literal/literal.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/unparser/corpus/literal/variables.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/unparser/corpus/semantic/dstr.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/variables.txt | 8 | ||||
-rw-r--r-- | test/yarp/snapshots/whitequark/cvar.txt | 5 | ||||
-rw-r--r-- | test/yarp/snapshots/whitequark/cvasgn.txt | 7 | ||||
-rw-r--r-- | test/yarp/snapshots/whitequark/masgn_splat.txt | 2 | ||||
-rw-r--r-- | test/yarp/snapshots/whitequark/string_dvar.txt | 5 | ||||
-rw-r--r-- | test/yarp/snapshots/whitequark/var_op_asgn.txt | 2 | ||||
-rw-r--r-- | yarp/config.yml | 14 | ||||
-rw-r--r-- | yarp/yarp.c | 44 |
18 files changed, 81 insertions, 41 deletions
diff --git a/lib/yarp/desugar_visitor.rb b/lib/yarp/desugar_visitor.rb index 8fe488368e..d0c0494e0c 100644 --- a/lib/yarp/desugar_visitor.rb +++ b/lib/yarp/desugar_visitor.rb @@ -8,7 +8,7 @@ module YARP # # @@foo && @@foo = bar def visit_class_variable_and_write_node(node) - desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode) + desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name]) end # @@foo ||= bar @@ -17,7 +17,7 @@ module YARP # # defined?(@@foo) ? @@foo : @@foo = bar def visit_class_variable_or_write_node(node) - desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode) + desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name]) end # @@foo += bar @@ -26,7 +26,7 @@ module YARP # # @@foo = @@foo + bar def visit_class_variable_operator_write_node(node) - desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode) + desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name]) end # Foo &&= bar @@ -245,15 +245,15 @@ module YARP end # Don't desugar `x ||= y` to `defined?(x) ? x : x = y` - def desugar_or_write_defined_node(node, read_class, write_class) + def desugar_or_write_defined_node(node, read_class, write_class, arguments: []) IfNode.new( node.operator_loc, - DefinedNode.new(nil, read_class.new(node.name_loc), nil, node.operator_loc, node.name_loc), - StatementsNode.new([read_class.new(node.name_loc)], node.location), + DefinedNode.new(nil, read_class.new(*arguments, node.name_loc), nil, node.operator_loc, node.name_loc), + StatementsNode.new([read_class.new(*arguments, node.name_loc)], node.location), ElseNode.new( node.operator_loc, StatementsNode.new( - [write_class.new(node.name_loc, node.value, node.operator_loc, node.location)], + [write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location)], node.location ), node.operator_loc, diff --git a/test/yarp/snapshots/methods.txt b/test/yarp/snapshots/methods.txt index 70e030811c..b5ec66aae3 100644 --- a/test/yarp/snapshots/methods.txt +++ b/test/yarp/snapshots/methods.txt @@ -910,7 +910,7 @@ ProgramNode(0...1194)( ), DefNode(811...826)( (821...822), - ClassVariableReadNode(815...820)(), + ClassVariableReadNode(815...820)(:@@var), nil, nil, [], diff --git a/test/yarp/snapshots/patterns.txt b/test/yarp/snapshots/patterns.txt index 63764bca0b..01292cbf3c 100644 --- a/test/yarp/snapshots/patterns.txt +++ b/test/yarp/snapshots/patterns.txt @@ -941,7 +941,7 @@ ProgramNode(0...3743)( "foo" ), PinnedVariableNode(974...980)( - ClassVariableReadNode(975...980)(), + ClassVariableReadNode(975...980)(:@@bar), (974...975) ), (971...973) diff --git a/test/yarp/snapshots/seattlerb/case_in.txt b/test/yarp/snapshots/seattlerb/case_in.txt index 2e508d8c9a..aaee410ef3 100644 --- a/test/yarp/snapshots/seattlerb/case_in.txt +++ b/test/yarp/snapshots/seattlerb/case_in.txt @@ -502,7 +502,7 @@ ProgramNode(0...747)( (633...634) ), PinnedVariableNode(638...642)( - ClassVariableReadNode(639...642)(), + ClassVariableReadNode(639...642)(:@@c), (638...639) )], nil, diff --git a/test/yarp/snapshots/strings.txt b/test/yarp/snapshots/strings.txt index ee8bc79f17..86a732d85d 100644 --- a/test/yarp/snapshots/strings.txt +++ b/test/yarp/snapshots/strings.txt @@ -20,7 +20,7 @@ ProgramNode(0...498)( (122...123), [EmbeddedVariableNode(123...129)( (123...124), - ClassVariableReadNode(124...129)() + ClassVariableReadNode(124...129)(:@@foo) )], (129...130) ), diff --git a/test/yarp/snapshots/unparser/corpus/literal/assignment.txt b/test/yarp/snapshots/unparser/corpus/literal/assignment.txt index 7e193e0e87..78ab4d3d78 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/assignment.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/assignment.txt @@ -54,8 +54,8 @@ ProgramNode(0...704)( (54...55) ), MultiWriteNode(65...84)( - [ClassVariableTargetNode(66...69)(), - ClassVariableTargetNode(71...74)()], + [ClassVariableTargetNode(66...69)(:@@a), + ClassVariableTargetNode(71...74)(:@@b)], (76...77), ArrayNode(78...84)( [IntegerNode(79...80)(), IntegerNode(82...83)()], @@ -291,6 +291,7 @@ ProgramNode(0...704)( ) ), ClassVariableWriteNode(302...309)( + :@@a, (302...305), IntegerNode(308...309)(), (306...307) diff --git a/test/yarp/snapshots/unparser/corpus/literal/dstr.txt b/test/yarp/snapshots/unparser/corpus/literal/dstr.txt index 1abbed681f..facf0171e7 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/dstr.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/dstr.txt @@ -84,7 +84,7 @@ ProgramNode(0...299)( [StringNode(167...168)(nil, (167...168), nil, "a"), EmbeddedVariableNode(168...172)( (168...169), - ClassVariableReadNode(169...172)() + ClassVariableReadNode(169...172)(:@@a) )], (172...173) ), diff --git a/test/yarp/snapshots/unparser/corpus/literal/literal.txt b/test/yarp/snapshots/unparser/corpus/literal/literal.txt index 03f9aecbd5..3b85d3e95f 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/literal.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/literal.txt @@ -158,7 +158,7 @@ ProgramNode(0...916)( StringNode(210...211)(nil, (210...211), nil, " "), EmbeddedVariableNode(211...215)( (211...212), - ClassVariableReadNode(212...215)() + ClassVariableReadNode(212...215)(:@@a) ), StringNode(215...216)(nil, (215...216), nil, " "), EmbeddedVariableNode(216...219)( diff --git a/test/yarp/snapshots/unparser/corpus/literal/variables.txt b/test/yarp/snapshots/unparser/corpus/literal/variables.txt index 051fb2f498..dfb85ec013 100644 --- a/test/yarp/snapshots/unparser/corpus/literal/variables.txt +++ b/test/yarp/snapshots/unparser/corpus/literal/variables.txt @@ -3,7 +3,7 @@ ProgramNode(0...66)( StatementsNode(0...66)( [CallNode(0...1)(nil, nil, (0...1), nil, nil, nil, nil, 2, "a"), InstanceVariableReadNode(2...4)(:@a), - ClassVariableReadNode(5...8)(), + ClassVariableReadNode(5...8)(:@@a), GlobalVariableReadNode(9...11)(), NumberedReferenceReadNode(12...14)(), BackReferenceReadNode(15...17)(), diff --git a/test/yarp/snapshots/unparser/corpus/semantic/dstr.txt b/test/yarp/snapshots/unparser/corpus/semantic/dstr.txt index 47d37b1c38..8822eb5333 100644 --- a/test/yarp/snapshots/unparser/corpus/semantic/dstr.txt +++ b/test/yarp/snapshots/unparser/corpus/semantic/dstr.txt @@ -246,7 +246,7 @@ ProgramNode(0...608)( [StringNode(598...599)(nil, (598...599), nil, "a"), EmbeddedVariableNode(599...603)( (599...600), - ClassVariableReadNode(600...603)() + ClassVariableReadNode(600...603)(:@@a) )], (603...604) ), diff --git a/test/yarp/snapshots/variables.txt b/test/yarp/snapshots/variables.txt index 2dd87366c5..419942d1eb 100644 --- a/test/yarp/snapshots/variables.txt +++ b/test/yarp/snapshots/variables.txt @@ -1,21 +1,23 @@ ProgramNode(0...293)( [:abc, :foo, :bar, :baz], StatementsNode(0...293)( - [ClassVariableReadNode(0...5)(), + [ClassVariableReadNode(0...5)(:@@abc), ClassVariableWriteNode(7...16)( + :@@abc, (7...12), IntegerNode(15...16)(), (13...14) ), MultiWriteNode(18...34)( - [ClassVariableTargetNode(18...23)(), - ClassVariableTargetNode(25...30)()], + [ClassVariableTargetNode(18...23)(:@@foo), + ClassVariableTargetNode(25...30)(:@@bar)], (31...32), IntegerNode(33...34)(), nil, nil ), ClassVariableWriteNode(36...48)( + :@@foo, (36...41), ArrayNode(44...48)( [IntegerNode(44...45)(), IntegerNode(47...48)()], diff --git a/test/yarp/snapshots/whitequark/cvar.txt b/test/yarp/snapshots/whitequark/cvar.txt index 069ff24b17..6a1f2e50f4 100644 --- a/test/yarp/snapshots/whitequark/cvar.txt +++ b/test/yarp/snapshots/whitequark/cvar.txt @@ -1 +1,4 @@ -ProgramNode(0...5)([], StatementsNode(0...5)([ClassVariableReadNode(0...5)()])) +ProgramNode(0...5)( + [], + StatementsNode(0...5)([ClassVariableReadNode(0...5)(:@@foo)]) +) diff --git a/test/yarp/snapshots/whitequark/cvasgn.txt b/test/yarp/snapshots/whitequark/cvasgn.txt index b972caaab7..7e07810eb6 100644 --- a/test/yarp/snapshots/whitequark/cvasgn.txt +++ b/test/yarp/snapshots/whitequark/cvasgn.txt @@ -1,6 +1,11 @@ ProgramNode(0...10)( [], StatementsNode(0...10)( - [ClassVariableWriteNode(0...10)((0...5), IntegerNode(8...10)(), (6...7))] + [ClassVariableWriteNode(0...10)( + :@@var, + (0...5), + IntegerNode(8...10)(), + (6...7) + )] ) ) diff --git a/test/yarp/snapshots/whitequark/masgn_splat.txt b/test/yarp/snapshots/whitequark/masgn_splat.txt index b093187ef6..d21760a65b 100644 --- a/test/yarp/snapshots/whitequark/masgn_splat.txt +++ b/test/yarp/snapshots/whitequark/masgn_splat.txt @@ -52,7 +52,7 @@ ProgramNode(0...139)( ), MultiWriteNode(47...65)( [InstanceVariableTargetNode(47...51)(:@foo), - ClassVariableTargetNode(53...58)()], + ClassVariableTargetNode(53...58)(:@@bar)], (59...60), ArrayNode(61...65)( [SplatNode(61...65)( diff --git a/test/yarp/snapshots/whitequark/string_dvar.txt b/test/yarp/snapshots/whitequark/string_dvar.txt index 981ea318c4..12f083660b 100644 --- a/test/yarp/snapshots/whitequark/string_dvar.txt +++ b/test/yarp/snapshots/whitequark/string_dvar.txt @@ -8,7 +8,10 @@ ProgramNode(0...14)( InstanceVariableReadNode(2...4)(:@a) ), StringNode(4...5)(nil, (4...5), nil, " "), - EmbeddedVariableNode(5...9)((5...6), ClassVariableReadNode(6...9)()), + EmbeddedVariableNode(5...9)( + (5...6), + ClassVariableReadNode(6...9)(:@@a) + ), StringNode(9...10)(nil, (9...10), nil, " "), EmbeddedVariableNode(10...13)( (10...11), diff --git a/test/yarp/snapshots/whitequark/var_op_asgn.txt b/test/yarp/snapshots/whitequark/var_op_asgn.txt index 5618d0944c..0927e8b8f3 100644 --- a/test/yarp/snapshots/whitequark/var_op_asgn.txt +++ b/test/yarp/snapshots/whitequark/var_op_asgn.txt @@ -2,6 +2,7 @@ ProgramNode(0...53)( [:a], StatementsNode(0...53)( [ClassVariableOperatorWriteNode(0...11)( + :@@var, (0...5), (6...8), IntegerNode(9...11)(), @@ -28,6 +29,7 @@ ProgramNode(0...53)( nil, StatementsNode(37...48)( [ClassVariableOperatorWriteNode(37...48)( + :@@var, (37...42), (43...45), IntegerNode(46...48)(), diff --git a/yarp/config.yml b/yarp/config.yml index b4e8b47913..72c4aeb8af 100644 --- a/yarp/config.yml +++ b/yarp/config.yml @@ -727,6 +727,8 @@ nodes: ^^^^^^^^^^^^^ - name: ClassVariableAndWriteNode child_nodes: + - name: name + type: constant - name: name_loc type: location - name: operator_loc @@ -740,6 +742,8 @@ nodes: ^^^^^^^^^^^^^^^^ - name: ClassVariableOperatorWriteNode child_nodes: + - name: name + type: constant - name: name_loc type: location - name: operator_loc @@ -755,6 +759,8 @@ nodes: ^^^^^^^^^^^^^^^^^ - name: ClassVariableOrWriteNode child_nodes: + - name: name + type: constant - name: name_loc type: location - name: operator_loc @@ -767,12 +773,18 @@ nodes: @@target ||= value ^^^^^^^^^^^^^^^^^^ - name: ClassVariableReadNode + child_nodes: + - name: name + type: constant comment: | Represents referencing a class variable. @@foo ^^^^^ - name: ClassVariableTargetNode + child_nodes: + - name: name + type: constant comment: | Represents writing to a class variable in a context that doesn't have an explicit value. @@ -780,6 +792,8 @@ nodes: ^^^^^ ^^^^^ - name: ClassVariableWriteNode child_nodes: + - name: name + type: constant - name: name_loc type: location - name: value diff --git a/yarp/yarp.c b/yarp/yarp.c index 46fe7259a4..6fd16e16fc 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -1558,8 +1558,7 @@ yp_class_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const y // Allocate and initialize a new ClassVariableAndWriteNode node. static yp_class_variable_and_write_node_t * -yp_class_variable_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)); +yp_class_variable_and_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *target, const yp_token_t *operator, yp_node_t *value) { assert(operator->type == YP_TOKEN_AMPERSAND_AMPERSAND_EQUAL); yp_class_variable_and_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_and_write_node_t); @@ -1567,11 +1566,12 @@ yp_class_variable_and_write_node_create(yp_parser_t *parser, yp_node_t *target, { .type = YP_NODE_CLASS_VARIABLE_AND_WRITE_NODE, .location = { - .start = target->location.start, + .start = target->base.location.start, .end = value->location.end } }, - .name_loc = target->location, + .name = target->name, + .name_loc = target->base.location, .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), .value = value }; @@ -1581,18 +1581,19 @@ yp_class_variable_and_write_node_create(yp_parser_t *parser, yp_node_t *target, // 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) { +yp_class_variable_operator_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *target, const yp_token_t *operator, yp_node_t *value) { yp_class_variable_operator_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_operator_write_node_t); *node = (yp_class_variable_operator_write_node_t) { { .type = YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE, .location = { - .start = target->location.start, + .start = target->base.location.start, .end = value->location.end } }, - .name_loc = target->location, + .name = target->name, + .name_loc = target->base.location, .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), .value = value, .operator = yp_parser_constant_id_location(parser, operator->start, operator->end - 1) @@ -1603,8 +1604,7 @@ yp_class_variable_operator_write_node_create(yp_parser_t *parser, yp_node_t *tar // Allocate and initialize a new ClassVariableOrWriteNode node. static yp_class_variable_or_write_node_t * -yp_class_variable_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)); +yp_class_variable_or_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *target, const yp_token_t *operator, yp_node_t *value) { assert(operator->type == YP_TOKEN_PIPE_PIPE_EQUAL); yp_class_variable_or_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_or_write_node_t); @@ -1612,11 +1612,12 @@ yp_class_variable_or_write_node_create(yp_parser_t *parser, yp_node_t *target, c { .type = YP_NODE_CLASS_VARIABLE_OR_WRITE_NODE, .location = { - .start = target->location.start, + .start = target->base.location.start, .end = value->location.end } }, - .name_loc = target->location, + .name = target->name, + .name_loc = target->base.location, .operator_loc = YP_LOCATION_TOKEN_VALUE(operator), .value = value }; @@ -1629,13 +1630,21 @@ static yp_class_variable_read_node_t * yp_class_variable_read_node_create(yp_parser_t *parser, const yp_token_t *token) { assert(token->type == YP_TOKEN_CLASS_VARIABLE); yp_class_variable_read_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_read_node_t); - *node = (yp_class_variable_read_node_t) {{ .type = YP_NODE_CLASS_VARIABLE_READ_NODE, .location = YP_LOCATION_TOKEN_VALUE(token) }}; + + *node = (yp_class_variable_read_node_t) { + { + .type = YP_NODE_CLASS_VARIABLE_READ_NODE, + .location = YP_LOCATION_TOKEN_VALUE(token) + }, + .name = yp_parser_constant_id_location(parser, token->start, token->end) + }; + return node; } // Initialize a new ClassVariableWriteNode node from a ClassVariableRead node. static yp_class_variable_write_node_t * -yp_class_variable_read_node_to_class_variable_write_node(yp_parser_t *parser, yp_class_variable_read_node_t *read_node, yp_token_t *operator, yp_node_t *value) { +yp_class_variable_write_node_create(yp_parser_t *parser, yp_class_variable_read_node_t *read_node, yp_token_t *operator, yp_node_t *value) { yp_class_variable_write_node_t *node = YP_ALLOC_NODE(parser, yp_class_variable_write_node_t); *node = (yp_class_variable_write_node_t) { @@ -1646,6 +1655,7 @@ yp_class_variable_read_node_to_class_variable_write_node(yp_parser_t *parser, yp .end = value->location.end }, }, + .name = read_node->name, .name_loc = YP_LOCATION_NODE_VALUE((yp_node_t *) read_node), .operator_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(operator), .value = value @@ -8007,7 +8017,7 @@ parse_write(yp_parser_t *parser, yp_node_t *target, yp_token_t *operator, yp_nod case YP_NODE_MISSING_NODE: return target; case YP_NODE_CLASS_VARIABLE_READ_NODE: { - yp_class_variable_write_node_t *write_node = yp_class_variable_read_node_to_class_variable_write_node(parser, (yp_class_variable_read_node_t *) target, operator, value); + yp_class_variable_write_node_t *write_node = yp_class_variable_write_node_create(parser, (yp_class_variable_read_node_t *) target, operator, value); yp_node_destroy(parser, target); return (yp_node_t *) write_node; } @@ -12837,7 +12847,7 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t 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_and_write_node_create(parser, node, &token, value); + yp_node_t *result = (yp_node_t *) yp_class_variable_and_write_node_create(parser, (yp_class_variable_read_node_t *) node, &token, value); yp_node_destroy(parser, node); return result; @@ -12938,7 +12948,7 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t 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_or_write_node_create(parser, node, &token, value); + yp_node_t *result = (yp_node_t *) yp_class_variable_or_write_node_create(parser, (yp_class_variable_read_node_t *) node, &token, value); yp_node_destroy(parser, node); return result; @@ -13049,7 +13059,7 @@ parse_expression_infix(yp_parser_t *parser, yp_node_t *node, yp_binding_power_t parser_lex(parser); yp_node_t *value = parse_expression(parser, binding_power, "Expected a value after the operator."); - yp_node_t *result = (yp_node_t *) yp_class_variable_operator_write_node_create(parser, node, &token, value); + yp_node_t *result = (yp_node_t *) yp_class_variable_operator_write_node_create(parser, (yp_class_variable_read_node_t *) node, &token, value); yp_node_destroy(parser, node); return result; |