66#include <ctype.h>
77#include <string.h>
88
9+ #include "legacy_location.h"
910#include "rbs/ast.h"
1011#include "rbs/defines.h"
1112#include "rbs/lexer.h"
@@ -1042,10 +1043,10 @@ static bool parse_instance_type(rbs_parser_t *parser, bool parse_alias, rbs_node
10421043}
10431044
10441045/*
1045- singleton_type ::= {`singleton`} `(` type_name <`)`>
1046+ singleton_type ::= {`singleton`} `(` type_name <`)`> type_args?
10461047*/
10471048NODISCARD
1048- static bool parse_singleton_type (rbs_parser_t * parser , rbs_types_class_singleton_t * * singleton ) {
1049+ static bool parse_singleton_type (rbs_parser_t * parser , rbs_types_class_singleton_t * * singleton , bool self_allowed , bool classish_allowed ) {
10491050 ASSERT_TOKEN (parser , kSINGLETON );
10501051
10511052 rbs_range_t type_range ;
@@ -1058,9 +1059,26 @@ static bool parse_singleton_type(rbs_parser_t *parser, rbs_types_class_singleton
10581059 CHECK_PARSE (parse_type_name (parser , CLASS_NAME , & name_range , & type_name ));
10591060
10601061 ADVANCE_ASSERT (parser , pRPAREN );
1062+
1063+ rbs_node_list_t * types = rbs_node_list_new (ALLOCATOR ());
1064+
1065+ rbs_location_range args_range = RBS_LOCATION_NULL_RANGE ;
1066+ if (parser -> next_token .type == pLBRACKET ) {
1067+ rbs_parser_advance (parser );
1068+ args_range .start_byte = parser -> current_token .range .start .byte_pos ;
1069+ args_range .start_char = parser -> current_token .range .start .char_pos ;
1070+ CHECK_PARSE (parse_type_list (parser , pRBRACKET , types , true, self_allowed , classish_allowed ));
1071+ ADVANCE_ASSERT (parser , pRBRACKET );
1072+ args_range .end_byte = parser -> current_token .range .end .byte_pos ;
1073+ args_range .end_char = parser -> current_token .range .end .char_pos ;
1074+ }
1075+
10611076 type_range .end = parser -> current_token .range .end ;
1077+ rbs_location_range loc = RBS_RANGE_LEX2AST (type_range );
1078+
1079+ * singleton = rbs_types_class_singleton_new (ALLOCATOR (), loc , type_name , types , RBS_RANGE_LEX2AST (name_range ));
1080+ (* singleton )-> args_range = args_range ;
10621081
1063- * singleton = rbs_types_class_singleton_new (ALLOCATOR (), RBS_RANGE_LEX2AST (type_range ), type_name , RBS_RANGE_LEX2AST (name_range ));
10641082 return true;
10651083}
10661084
@@ -1242,7 +1260,7 @@ static bool parse_simple(rbs_parser_t *parser, rbs_node_t **type, bool void_allo
12421260 }
12431261 case kSINGLETON : {
12441262 rbs_types_class_singleton_t * singleton = NULL ;
1245- CHECK_PARSE (parse_singleton_type (parser , & singleton ));
1263+ CHECK_PARSE (parse_singleton_type (parser , & singleton , self_allowed , classish_allowed ));
12461264 * type = (rbs_node_t * ) singleton ;
12471265 return true;
12481266 }
0 commit comments