[ruby/yarp] Add names to classes and modules

This should hopefully make it easier to compile these nodes, and
also for static analysis tools for having a quick label.

https://github.com/ruby/yarp/commit/f086662144
This commit is contained in:
Kevin Newton 2023-08-24 21:22:20 -04:00 committed by git
parent fe73f9f24b
commit 61c5c2f1c8
30 changed files with 197 additions and 93 deletions

View File

@ -18,9 +18,10 @@ class ErrorsTest < Test::Unit::TestCase
Location(), Location(),
ConstantReadNode(), ConstantReadNode(),
StatementsNode( StatementsNode(
[ModuleNode([], Location(), MissingNode(), nil, Location())] [ModuleNode([], Location(), MissingNode(), nil, Location(), "")]
), ),
Location() Location(),
"Parent"
) )
assert_errors expected, "module Parent module end", [ assert_errors expected, "module Parent module end", [
@ -391,7 +392,7 @@ class ErrorsTest < Test::Unit::TestCase
Location(), Location(),
nil, nil,
nil, nil,
StatementsNode([ModuleNode([], Location(), ConstantReadNode(), nil, Location())]), StatementsNode([ModuleNode([], Location(), ConstantReadNode(), nil, Location(), "A")]),
[], [],
Location(), Location(),
nil, nil,
@ -422,7 +423,7 @@ class ErrorsTest < Test::Unit::TestCase
BlockNode( BlockNode(
[], [],
nil, nil,
StatementsNode([ModuleNode([], Location(), ConstantReadNode(), nil, Location())]), StatementsNode([ModuleNode([], Location(), ConstantReadNode(), nil, Location(), "Foo")]),
Location(), Location(),
Location() Location()
), ),
@ -463,7 +464,8 @@ class ErrorsTest < Test::Unit::TestCase
nil, nil,
nil, nil,
nil, nil,
Location() Location(),
"A"
)] )]
), ),
[], [],
@ -963,7 +965,8 @@ class ErrorsTest < Test::Unit::TestCase
nil, nil,
nil, nil,
StatementsNode([ReturnNode(Location(), nil)]), StatementsNode([ReturnNode(Location(), nil)]),
Location() Location(),
"A"
) )
assert_errors expected, "class A; return; end", [ assert_errors expected, "class A; return; end", [
@ -977,7 +980,8 @@ class ErrorsTest < Test::Unit::TestCase
Location(), Location(),
ConstantReadNode(), ConstantReadNode(),
StatementsNode([ReturnNode(Location(), nil)]), StatementsNode([ReturnNode(Location(), nil)]),
Location() Location(),
"A"
) )
assert_errors expected, "module A; return; end", [ assert_errors expected, "module A; return; end", [

View File

@ -16,7 +16,8 @@ ProgramNode(0...370)(
(10...11) (10...11)
)] )]
), ),
(14...17) (14...17),
"A"
), ),
ClassNode(19...39)( ClassNode(19...39)(
[], [],
@ -32,7 +33,8 @@ ProgramNode(0...370)(
EnsureNode(28...39)((28...34), nil, (36...39)), EnsureNode(28...39)((28...34), nil, (36...39)),
(36...39) (36...39)
), ),
(36...39) (36...39),
"A"
), ),
ClassNode(41...75)( ClassNode(41...75)(
[], [],
@ -48,7 +50,8 @@ ProgramNode(0...370)(
EnsureNode(64...75)((64...70), nil, (72...75)), EnsureNode(64...75)((64...70), nil, (72...75)),
(72...75) (72...75)
), ),
(72...75) (72...75),
"A"
), ),
ClassNode(77...98)( ClassNode(77...98)(
[:a], [:a],
@ -65,7 +68,8 @@ ProgramNode(0...370)(
(91...92) (91...92)
)] )]
), ),
(95...98) (95...98),
"A"
), ),
SingletonClassNode(100...120)( SingletonClassNode(100...120)(
[], [],
@ -118,7 +122,8 @@ ProgramNode(0...370)(
(154...157) (154...157)
)] )]
), ),
(159...162) (159...162),
"A"
), ),
ClassNode(164...218)( ClassNode(164...218)(
[], [],
@ -143,7 +148,8 @@ ProgramNode(0...370)(
(210...213) (210...213)
)] )]
), ),
(215...218) (215...218),
"A"
), ),
SingletonClassNode(220...240)( SingletonClassNode(220...240)(
[], [],
@ -274,7 +280,8 @@ ProgramNode(0...370)(
"[]" "[]"
), ),
nil, nil,
(367...370) (367...370),
"A"
)] )]
) )
) )

View File

@ -1191,7 +1191,8 @@ ProgramNode(0...1237)(
"baz" "baz"
)] )]
), ),
(926...929) (926...929),
"Bar"
)] )]
), ),
nil, nil,
@ -1222,7 +1223,8 @@ ProgramNode(0...1237)(
"baz" "baz"
)] )]
), ),
(957...960) (957...960),
"Bar"
)] )]
), ),
nil, nil,

View File

@ -14,7 +14,8 @@ ProgramNode(0...140)(
(11...12) (11...12)
)] )]
), ),
(15...18) (15...18),
"A"
), ),
InterpolatedStringNode(20...38)( InterpolatedStringNode(20...38)(
(20...23), (20...23),
@ -48,7 +49,8 @@ ProgramNode(0...140)(
(48...50) (48...50)
), ),
nil, nil,
(52...55) (52...55),
"M"
), ),
ModuleNode(57...85)( ModuleNode(57...85)(
[:x], [:x],
@ -70,14 +72,16 @@ ProgramNode(0...140)(
nil, nil,
(82...85) (82...85)
), ),
(82...85) (82...85),
"A"
), ),
ModuleNode(87...101)( ModuleNode(87...101)(
[], [],
(87...93), (87...93),
ConstantPathNode(94...97)(nil, ConstantReadNode(96...97)(), (94...96)), ConstantPathNode(94...97)(nil, ConstantReadNode(96...97)(), (94...96)),
nil, nil,
(98...101) (98...101),
"A"
), ),
ModuleNode(103...120)( ModuleNode(103...120)(
[], [],
@ -98,7 +102,8 @@ ProgramNode(0...140)(
(113...115) (113...115)
), ),
nil, nil,
(117...120) (117...120),
"B"
), ),
ModuleNode(122...140)( ModuleNode(122...140)(
[], [],
@ -119,7 +124,8 @@ ProgramNode(0...140)(
(133...135) (133...135)
), ),
nil, nil,
(137...140) (137...140),
"B"
)] )]
) )
) )

View File

@ -86,7 +86,8 @@ ProgramNode(0...689)(
(243...246) (243...246)
)] )]
), ),
(266...269) (266...269),
"X"
), ),
ClassNode(293...376)( ClassNode(293...376)(
[], [],
@ -108,10 +109,12 @@ ProgramNode(0...689)(
(339...340) (339...340)
)] )]
), ),
(355...358) (355...358),
"Y"
)] )]
), ),
(373...376) (373...376),
"X"
), ),
ClassNode(395...498)( ClassNode(395...498)(
[], [],
@ -157,7 +160,8 @@ ProgramNode(0...689)(
(477...480) (477...480)
)] )]
), ),
(495...498) (495...498),
"X"
), ),
ModuleNode(517...565)( ModuleNode(517...565)(
[], [],
@ -175,7 +179,8 @@ ProgramNode(0...689)(
(530...531) (530...531)
)] )]
), ),
(562...565) (562...565),
"X"
), ),
ModuleNode(568...651)( ModuleNode(568...651)(
[], [],
@ -193,10 +198,12 @@ ProgramNode(0...689)(
(614...615) (614...615)
)] )]
), ),
(630...633) (630...633),
"Y"
)] )]
), ),
(648...651) (648...651),
"X"
), ),
CallNode(670...689)( CallNode(670...689)(
nil, nil,

View File

@ -22,7 +22,8 @@ ProgramNode(19...71)(
(64...67) (64...67)
)] )]
), ),
(68...71) (68...71),
"X"
)] )]
) )
) )

View File

@ -30,7 +30,8 @@ ProgramNode(0...28)(
nil nil
)] )]
), ),
(25...28) (25...28),
"X"
)] )]
) )
) )

View File

@ -30,7 +30,8 @@ ProgramNode(0...33)(
nil nil
)] )]
), ),
(30...33) (30...33),
"X"
)] )]
) )
) )

View File

@ -30,7 +30,8 @@ ProgramNode(18...90)(
(83...86) (83...86)
)] )]
), ),
(87...90) (87...90),
"ExampleUTF8ClassNameVarietà"
)] )]
) )
) )

View File

@ -20,7 +20,8 @@ ProgramNode(24...77)(
(70...73) (70...73)
)] )]
), ),
(74...77) (74...77),
"X"
)] )]
) )
) )

View File

@ -18,7 +18,8 @@ ProgramNode(0...48)(
nil, nil,
nil, nil,
nil, nil,
(45...48) (45...48),
"Foo"
)] )]
) )
) )

View File

@ -8,7 +8,8 @@ ProgramNode(0...213)(
nil, nil,
nil, nil,
nil, nil,
(8...11) (8...11),
"A"
), ),
SingletonClassNode(13...27)( SingletonClassNode(13...27)(
[], [],
@ -39,7 +40,8 @@ ProgramNode(0...213)(
nil, nil,
nil, nil,
nil, nil,
(60...63) (60...63),
"B"
), ),
ClassNode(65...82)( ClassNode(65...82)(
[], [],
@ -56,7 +58,8 @@ ProgramNode(0...213)(
nil, nil,
nil, nil,
nil, nil,
(79...82) (79...82),
"C"
), ),
ClassNode(84...99)( ClassNode(84...99)(
[], [],
@ -65,7 +68,8 @@ ProgramNode(0...213)(
(92...93), (92...93),
ConstantReadNode(94...95)(), ConstantReadNode(94...95)(),
nil, nil,
(96...99) (96...99),
"A"
), ),
ClassNode(101...119)( ClassNode(101...119)(
[], [],
@ -78,7 +82,8 @@ ProgramNode(0...213)(
(112...114) (112...114)
), ),
nil, nil,
(116...119) (116...119),
"A"
), ),
ClassNode(121...142)( ClassNode(121...142)(
[], [],
@ -95,7 +100,8 @@ ProgramNode(0...213)(
(135...137) (135...137)
), ),
nil, nil,
(139...142) (139...142),
"B"
), ),
ClassNode(144...198)( ClassNode(144...198)(
[], [],
@ -143,7 +149,8 @@ ProgramNode(0...213)(
(191...194) (191...194)
)] )]
), ),
(195...198) (195...198),
"A"
), ),
ClassNode(200...213)( ClassNode(200...213)(
[], [],
@ -156,7 +163,8 @@ ProgramNode(0...213)(
nil, nil,
nil, nil,
nil, nil,
(210...213) (210...213),
"A"
)] )]
) )
) )

View File

@ -80,7 +80,8 @@ ProgramNode(0...246)(
nil nil
)] )]
), ),
(130...133) (130...133),
"A"
), ),
ModuleNode(135...170)( ModuleNode(135...170)(
[:foo], [:foo],
@ -113,7 +114,8 @@ ProgramNode(0...246)(
nil nil
)] )]
), ),
(167...170) (167...170),
"B"
), ),
UnlessNode(171...197)( UnlessNode(171...197)(
(171...177), (171...177),

View File

@ -1,7 +1,14 @@
ProgramNode(0...106)( ProgramNode(0...106)(
[], [],
StatementsNode(0...106)( StatementsNode(0...106)(
[ModuleNode(0...12)([], (0...6), ConstantReadNode(7...8)(), nil, (9...12)), [ModuleNode(0...12)(
[],
(0...6),
ConstantReadNode(7...8)(),
nil,
(9...12),
"A"
),
ModuleNode(14...29)( ModuleNode(14...29)(
[], [],
(14...20), (14...20),
@ -11,7 +18,8 @@ ProgramNode(0...106)(
(22...24) (22...24)
), ),
nil, nil,
(26...29) (26...29),
"B"
), ),
ModuleNode(31...49)( ModuleNode(31...49)(
[], [],
@ -26,7 +34,8 @@ ProgramNode(0...106)(
(42...44) (42...44)
), ),
nil, nil,
(46...49) (46...49),
"C"
), ),
ModuleNode(51...106)( ModuleNode(51...106)(
[], [],
@ -72,7 +81,8 @@ ProgramNode(0...106)(
(99...102) (99...102)
)] )]
), ),
(103...106) (103...106),
"A"
)] )]
) )
) )

View File

@ -47,7 +47,8 @@ ProgramNode(0...999)(
(15...18) (15...18)
)] )]
), ),
(32...35) (32...35),
"A"
), ),
ModuleNode(37...73)( ModuleNode(37...73)(
[:local], [:local],
@ -73,7 +74,8 @@ ProgramNode(0...999)(
"bar" "bar"
)] )]
), ),
(70...73) (70...73),
"A"
), ),
CallNode(74...89)( CallNode(74...89)(
ClassNode(74...85)( ClassNode(74...85)(
@ -83,7 +85,8 @@ ProgramNode(0...999)(
nil, nil,
nil, nil,
nil, nil,
(82...85) (82...85),
"A"
), ),
(85...86), (85...86),
(86...89), (86...89),
@ -100,7 +103,8 @@ ProgramNode(0...999)(
(90...96), (90...96),
ConstantReadNode(97...98)(), ConstantReadNode(97...98)(),
nil, nil,
(99...102) (99...102),
"A"
), ),
(102...103), (102...103),
(103...106), (103...106),

View File

@ -62,7 +62,8 @@ ProgramNode(0...620)(
"foo" "foo"
)] )]
), ),
(65...68) (65...68),
"A"
), ),
DefNode(70...110)( DefNode(70...110)(
(74...77), (74...77),
@ -154,7 +155,8 @@ ProgramNode(0...620)(
0 0
)] )]
), ),
(143...146) (143...146),
"A"
), ),
ModuleNode(148...182)( ModuleNode(148...182)(
[:foo], [:foo],
@ -186,7 +188,8 @@ ProgramNode(0...620)(
0 0
)] )]
), ),
(179...182) (179...182),
"A"
), ),
ModuleNode(184...228)( ModuleNode(184...228)(
[:foo], [:foo],
@ -228,7 +231,8 @@ ProgramNode(0...620)(
0 0
)] )]
), ),
(225...228) (225...228),
"A"
), ),
ModuleNode(230...299)( ModuleNode(230...299)(
[], [],
@ -301,7 +305,8 @@ ProgramNode(0...620)(
"each" "each"
)] )]
), ),
(296...299) (296...299),
"A"
), ),
ModuleNode(301...370)( ModuleNode(301...370)(
[], [],
@ -364,7 +369,8 @@ ProgramNode(0...620)(
"each" "each"
)] )]
), ),
(367...370) (367...370),
"A"
), ),
LocalVariableWriteNode(371...402)( LocalVariableWriteNode(371...402)(
:x, :x,

View File

@ -178,7 +178,8 @@ ProgramNode(0...188)(
0 0
)] )]
), ),
(185...188) (185...188),
"A"
)] )]
) )
) )

View File

@ -130,7 +130,8 @@ ProgramNode(0...314)(
(181...182) (181...182)
)] )]
), ),
(195...198) (195...198),
"Foo"
), ),
StatementsNode(200...205)([BreakNode(200...205)(nil, (200...205))]), StatementsNode(200...205)([BreakNode(200...205)(nil, (200...205))]),
0 0

View File

@ -8,7 +8,8 @@ ProgramNode(0...29)(
nil, nil,
nil, nil,
nil, nil,
(10...13) (10...13),
"Foo"
), ),
ClassNode(15...29)( ClassNode(15...29)(
[], [],
@ -17,7 +18,8 @@ ProgramNode(0...29)(
nil, nil,
nil, nil,
nil, nil,
(26...29) (26...29),
"Foo"
)] )]
) )
) )

View File

@ -84,7 +84,8 @@ ProgramNode(0...197)(
(122...123) (122...123)
)] )]
), ),
(136...139) (136...139),
"Foo"
), ),
StatementsNode(141...146)([BreakNode(141...146)(nil, (141...146))]), StatementsNode(141...146)([BreakNode(141...146)(nil, (141...146))]),
0 0
@ -110,7 +111,8 @@ ProgramNode(0...197)(
"tap" "tap"
)] )]
), ),
(182...185) (182...185),
"Foo"
), ),
StatementsNode(187...192)([BreakNode(187...192)(nil, (187...192))]), StatementsNode(187...192)([BreakNode(187...192)(nil, (187...192))]),
0 0

View File

@ -8,7 +8,8 @@ ProgramNode(0...20)(
(10...11), (10...11),
ConstantReadNode(12...15)(), ConstantReadNode(12...15)(),
nil, nil,
(17...20) (17...20),
"Foo"
)] )]
) )
) )

View File

@ -20,7 +20,8 @@ ProgramNode(0...20)(
"a" "a"
), ),
nil, nil,
(17...20) (17...20),
"Foo"
)] )]
) )
) )

View File

@ -6,7 +6,8 @@ ProgramNode(0...39)(
(0...6), (0...6),
ConstantPathNode(7...12)(nil, ConstantReadNode(9...12)(), (7...9)), ConstantPathNode(7...12)(nil, ConstantReadNode(9...12)(), (7...9)),
nil, nil,
(14...17) (14...17),
"Foo"
), ),
ModuleNode(19...39)( ModuleNode(19...39)(
[], [],
@ -17,7 +18,8 @@ ProgramNode(0...39)(
(29...31) (29...31)
), ),
nil, nil,
(36...39) (36...39),
"Foo"
)] )]
) )
) )

View File

@ -18,7 +18,8 @@ ProgramNode(0...178)(
nil, nil,
nil, nil,
nil, nil,
(35...38) (35...38),
"Kernel"
), ),
ClassNode(40...87)( ClassNode(40...87)(
[], [],
@ -41,7 +42,8 @@ ProgramNode(0...178)(
nil, nil,
nil, nil,
nil, nil,
(84...87) (84...87),
"Kernel"
), ),
ModuleNode(89...128)( ModuleNode(89...128)(
[], [],
@ -58,7 +60,8 @@ ProgramNode(0...178)(
(115...117) (115...117)
), ),
nil, nil,
(125...128) (125...128),
"Kernel"
), ),
ModuleNode(130...178)( ModuleNode(130...178)(
[], [],
@ -79,7 +82,8 @@ ProgramNode(0...178)(
(165...167) (165...167)
), ),
nil, nil,
(175...178) (175...178),
"Kernel"
)] )]
) )
) )

View File

@ -6,7 +6,8 @@ ProgramNode(0...15)(
(0...6), (0...6),
ConstantReadNode(7...10)(), ConstantReadNode(7...10)(),
nil, nil,
(12...15) (12...15),
"Foo"
)] )]
) )
) )

View File

@ -21,7 +21,8 @@ ProgramNode(0...83)(
StatementsNode(36...38)( StatementsNode(36...38)(
[CallNode(36...38)(nil, nil, (36...38), nil, nil, nil, nil, 2, "_1")] [CallNode(36...38)(nil, nil, (36...38), nil, nil, nil, nil, 2, "_1")]
), ),
(40...43) (40...43),
"A"
), ),
DefNode(45...64)( DefNode(45...64)(
(54...55), (54...55),
@ -45,7 +46,8 @@ ProgramNode(0...83)(
StatementsNode(76...78)( StatementsNode(76...78)(
[CallNode(76...78)(nil, nil, (76...78), nil, nil, nil, nil, 2, "_1")] [CallNode(76...78)(nil, nil, (76...78), nil, nil, nil, nil, 2, "_1")]
), ),
(80...83) (80...83),
"A"
)] )]
) )
) )

View File

@ -47,7 +47,8 @@ ProgramNode(0...132)(
nil, nil,
nil, nil,
nil, nil,
(72...75) (72...75),
"C"
)] )]
), ),
(77...80) (77...80)
@ -77,7 +78,8 @@ ProgramNode(0...132)(
(109...115), (109...115),
ConstantReadNode(116...117)(), ConstantReadNode(116...117)(),
nil, nil,
(119...122) (119...122),
"M"
)] )]
), ),
(124...127) (124...127)

View File

@ -8,7 +8,8 @@ ProgramNode(0...15)(
(8...9), (8...9),
ConstantReadNode(10...11)(), ConstantReadNode(10...11)(),
nil, nil,
(12...15) (12...15),
"A"
)] )]
) )
) )

View File

@ -731,6 +731,8 @@ nodes:
type: node? type: node?
- name: end_keyword_loc - name: end_keyword_loc
type: location type: location
- name: name
type: string
comment: | comment: |
Represents a class declaration involving the `class` keyword. Represents a class declaration involving the `class` keyword.
@ -1318,6 +1320,8 @@ nodes:
type: node? type: node?
- name: end_keyword_loc - name: end_keyword_loc
type: location type: location
- name: name
type: string
comment: | comment: |
Represents a module declaration involving the `module` keyword. Represents a module declaration involving the `module` keyword.

View File

@ -1553,7 +1553,7 @@ yp_case_node_end_keyword_loc_set(yp_case_node_t *node, const yp_token_t *end_key
// Allocate a new ClassNode node. // Allocate a new ClassNode node.
static yp_class_node_t * static yp_class_node_t *
yp_class_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const yp_token_t *class_keyword, yp_node_t *constant_path, const yp_token_t *inheritance_operator, yp_node_t *superclass, yp_node_t *body, const yp_token_t *end_keyword) { yp_class_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const yp_token_t *class_keyword, yp_node_t *constant_path, const yp_token_t *name, const yp_token_t *inheritance_operator, yp_node_t *superclass, yp_node_t *body, const yp_token_t *end_keyword) {
yp_class_node_t *node = YP_ALLOC_NODE(parser, yp_class_node_t); yp_class_node_t *node = YP_ALLOC_NODE(parser, yp_class_node_t);
*node = (yp_class_node_t) { *node = (yp_class_node_t) {
@ -1567,9 +1567,11 @@ yp_class_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const y
.inheritance_operator_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(inheritance_operator), .inheritance_operator_loc = YP_OPTIONAL_LOCATION_TOKEN_VALUE(inheritance_operator),
.superclass = superclass, .superclass = superclass,
.body = body, .body = body,
.end_keyword_loc = YP_LOCATION_TOKEN_VALUE(end_keyword) .end_keyword_loc = YP_LOCATION_TOKEN_VALUE(end_keyword),
.name = YP_EMPTY_STRING
}; };
yp_string_shared_init(&node->name, name->start, name->end);
return node; return node;
} }
@ -2746,7 +2748,7 @@ yp_match_required_node_create(yp_parser_t *parser, yp_node_t *value, yp_node_t *
// Allocate a new ModuleNode node. // Allocate a new ModuleNode node.
static yp_module_node_t * static yp_module_node_t *
yp_module_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const yp_token_t *module_keyword, yp_node_t *constant_path, yp_node_t *body, const yp_token_t *end_keyword) { yp_module_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const yp_token_t *module_keyword, yp_node_t *constant_path, const yp_token_t *name, yp_node_t *body, const yp_token_t *end_keyword) {
yp_module_node_t *node = YP_ALLOC_NODE(parser, yp_module_node_t); yp_module_node_t *node = YP_ALLOC_NODE(parser, yp_module_node_t);
*node = (yp_module_node_t) { *node = (yp_module_node_t) {
@ -2761,9 +2763,11 @@ yp_module_node_create(yp_parser_t *parser, yp_constant_id_list_t *locals, const
.module_keyword_loc = YP_LOCATION_TOKEN_VALUE(module_keyword), .module_keyword_loc = YP_LOCATION_TOKEN_VALUE(module_keyword),
.constant_path = constant_path, .constant_path = constant_path,
.body = body, .body = body,
.end_keyword_loc = YP_LOCATION_TOKEN_VALUE(end_keyword) .end_keyword_loc = YP_LOCATION_TOKEN_VALUE(end_keyword),
.name = YP_EMPTY_STRING
}; };
yp_string_shared_init(&node->name, name->start, name->end);
return node; return node;
} }
@ -10854,7 +10858,12 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
return (yp_node_t *) yp_singleton_class_node_create(parser, &locals, &class_keyword, &operator, expression, statements, &parser->previous); return (yp_node_t *) yp_singleton_class_node_create(parser, &locals, &class_keyword, &operator, expression, statements, &parser->previous);
} }
yp_node_t *name = parse_expression(parser, YP_BINDING_POWER_INDEX, "Expected to find a class name after `class`."); yp_node_t *constant_path = parse_expression(parser, YP_BINDING_POWER_INDEX, "Expected to find a class name after `class`.");
yp_token_t name = parser->previous;
if (name.type != YP_TOKEN_CONSTANT) {
yp_diagnostic_list_append(&parser->error_list, name.start, name.end, "Expected a constant name after `class`.");
}
yp_token_t inheritance_operator; yp_token_t inheritance_operator;
yp_node_t *superclass; yp_node_t *superclass;
@ -10895,7 +10904,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_constant_id_list_t locals = parser->current_scope->locals;
yp_parser_scope_pop(parser); yp_parser_scope_pop(parser);
yp_do_loop_stack_pop(parser); yp_do_loop_stack_pop(parser);
return (yp_node_t *) yp_class_node_create(parser, &locals, &class_keyword, name, &inheritance_operator, superclass, statements, &parser->previous); return (yp_node_t *) yp_class_node_create(parser, &locals, &class_keyword, constant_path, &name, &inheritance_operator, superclass, statements, &parser->previous);
} }
case YP_TOKEN_KEYWORD_DEF: { case YP_TOKEN_KEYWORD_DEF: {
yp_token_t def_keyword = parser->current; yp_token_t def_keyword = parser->current;
@ -11289,13 +11298,14 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
parser_lex(parser); parser_lex(parser);
yp_token_t module_keyword = parser->previous; yp_token_t module_keyword = parser->previous;
yp_node_t *name = parse_expression(parser, YP_BINDING_POWER_INDEX, "Expected to find a module name after `module`."); yp_node_t *constant_path = parse_expression(parser, YP_BINDING_POWER_INDEX, "Expected to find a module name after `module`.");
yp_token_t name;
// If we can recover from a syntax error that occurred while parsing the // If we can recover from a syntax error that occurred while parsing
// name of the module, then we'll handle that here. // the name of the module, then we'll handle that here.
if (YP_NODE_TYPE_P(name, YP_NODE_MISSING_NODE)) { if (YP_NODE_TYPE_P(constant_path, YP_NODE_MISSING_NODE)) {
yp_token_t end_keyword = (yp_token_t) { .type = YP_TOKEN_MISSING, .start = parser->previous.end, .end = parser->previous.end }; yp_token_t missing = (yp_token_t) { .type = YP_TOKEN_MISSING, .start = parser->previous.end, .end = parser->previous.end };
return (yp_node_t *) yp_module_node_create(parser, NULL, &module_keyword, name, NULL, &end_keyword); return (yp_node_t *) yp_module_node_create(parser, NULL, &module_keyword, constant_path, &missing, NULL, &missing);
} }
while (accept(parser, YP_TOKEN_COLON_COLON)) { while (accept(parser, YP_TOKEN_COLON_COLON)) {
@ -11304,7 +11314,15 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
expect(parser, YP_TOKEN_CONSTANT, "Expected to find a module name after `::`."); expect(parser, YP_TOKEN_CONSTANT, "Expected to find a module name after `::`.");
yp_node_t *constant = (yp_node_t *) yp_constant_read_node_create(parser, &parser->previous); yp_node_t *constant = (yp_node_t *) yp_constant_read_node_create(parser, &parser->previous);
name = (yp_node_t *)yp_constant_path_node_create(parser, name, &double_colon, constant); constant_path = (yp_node_t *) yp_constant_path_node_create(parser, constant_path, &double_colon, constant);
}
// Here we retrieve the name of the module. If it wasn't a constant,
// then it's possible that `module foo` was passed, which is a
// syntax error. We handle that here as well.
name = parser->previous;
if (name.type != YP_TOKEN_CONSTANT) {
yp_diagnostic_list_append(&parser->error_list, name.start, name.end, "Expected to find a module name after `module`.");
} }
yp_parser_scope_push(parser, true); yp_parser_scope_push(parser, true);
@ -11331,7 +11349,7 @@ parse_expression_prefix(yp_parser_t *parser, yp_binding_power_t binding_power) {
yp_diagnostic_list_append(&parser->error_list, module_keyword.start, module_keyword.end, "Module definition in method body"); yp_diagnostic_list_append(&parser->error_list, module_keyword.start, module_keyword.end, "Module definition in method body");
} }
return (yp_node_t *) yp_module_node_create(parser, &locals, &module_keyword, name, statements, &parser->previous); return (yp_node_t *) yp_module_node_create(parser, &locals, &module_keyword, constant_path, &name, statements, &parser->previous);
} }
case YP_TOKEN_KEYWORD_NIL: case YP_TOKEN_KEYWORD_NIL:
parser_lex(parser); parser_lex(parser);