зеркало из https://github.com/github/ruby.git
[ruby/yarp] Add class variables to the constant pool
https://github.com/ruby/yarp/commit/be5cb60c83
This commit is contained in:
Родитель
151e94fee5
Коммит
00dbee94ac
|
@ -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,
|
||||
|
|
|
@ -910,7 +910,7 @@ ProgramNode(0...1194)(
|
|||
),
|
||||
DefNode(811...826)(
|
||||
(821...822),
|
||||
ClassVariableReadNode(815...820)(),
|
||||
ClassVariableReadNode(815...820)(:@@var),
|
||||
nil,
|
||||
nil,
|
||||
[],
|
||||
|
|
|
@ -941,7 +941,7 @@ ProgramNode(0...3743)(
|
|||
"foo"
|
||||
),
|
||||
PinnedVariableNode(974...980)(
|
||||
ClassVariableReadNode(975...980)(),
|
||||
ClassVariableReadNode(975...980)(:@@bar),
|
||||
(974...975)
|
||||
),
|
||||
(971...973)
|
||||
|
|
|
@ -502,7 +502,7 @@ ProgramNode(0...747)(
|
|||
(633...634)
|
||||
),
|
||||
PinnedVariableNode(638...642)(
|
||||
ClassVariableReadNode(639...642)(),
|
||||
ClassVariableReadNode(639...642)(:@@c),
|
||||
(638...639)
|
||||
)],
|
||||
nil,
|
||||
|
|
|
@ -20,7 +20,7 @@ ProgramNode(0...498)(
|
|||
(122...123),
|
||||
[EmbeddedVariableNode(123...129)(
|
||||
(123...124),
|
||||
ClassVariableReadNode(124...129)()
|
||||
ClassVariableReadNode(124...129)(:@@foo)
|
||||
)],
|
||||
(129...130)
|
||||
),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
),
|
||||
|
|
|
@ -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)(
|
||||
|
|
|
@ -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)(),
|
||||
|
|
|
@ -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)
|
||||
),
|
||||
|
|
|
@ -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)()],
|
||||
|
|
|
@ -1 +1,4 @@
|
|||
ProgramNode(0...5)([], StatementsNode(0...5)([ClassVariableReadNode(0...5)()]))
|
||||
ProgramNode(0...5)(
|
||||
[],
|
||||
StatementsNode(0...5)([ClassVariableReadNode(0...5)(:@@foo)])
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
)]
|
||||
)
|
||||
)
|
||||
|
|
|
@ -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)(
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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)(),
|
||||
|
|
|
@ -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
|
||||
|
|
44
yarp/yarp.c
44
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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче