@@ -1042,10 +1042,10 @@ static bool parse_instance_type(rbs_parser_t *parser, bool parse_alias, rbs_node
10421042}
10431043
10441044/*
1045- singleton_type ::= {`singleton`} `(` type_name <`)`>
1045+ singleton_type ::= {`singleton`} `(` type_name <`)`> type_args?
10461046*/
10471047NODISCARD
1048- static bool parse_singleton_type (rbs_parser_t * parser , rbs_types_class_singleton_t * * singleton ) {
1048+ static bool parse_singleton_type (rbs_parser_t * parser , rbs_types_class_singleton_t * * singleton , bool self_allowed , bool classish_allowed ) {
10491049 ASSERT_TOKEN (parser , kSINGLETON );
10501050
10511051 rbs_range_t type_range ;
@@ -1058,9 +1058,26 @@ static bool parse_singleton_type(rbs_parser_t *parser, rbs_types_class_singleton
10581058 CHECK_PARSE (parse_type_name (parser , CLASS_NAME , & name_range , & type_name ));
10591059
10601060 ADVANCE_ASSERT (parser , pRPAREN );
1061+
1062+ rbs_node_list_t * types = rbs_node_list_new (ALLOCATOR ());
1063+
1064+ rbs_location_range args_range = RBS_LOCATION_NULL_RANGE ;
1065+ if (parser -> next_token .type == pLBRACKET ) {
1066+ rbs_parser_advance (parser );
1067+ args_range .start_byte = parser -> current_token .range .start .byte_pos ;
1068+ args_range .start_char = parser -> current_token .range .start .char_pos ;
1069+ CHECK_PARSE (parse_type_list (parser , pRBRACKET , types , true, self_allowed , classish_allowed ));
1070+ ADVANCE_ASSERT (parser , pRBRACKET );
1071+ args_range .end_byte = parser -> current_token .range .end .byte_pos ;
1072+ args_range .end_char = parser -> current_token .range .end .char_pos ;
1073+ }
1074+
10611075 type_range .end = parser -> current_token .range .end ;
1076+ rbs_location_range loc = RBS_RANGE_LEX2AST (type_range );
1077+
1078+ * singleton = rbs_types_class_singleton_new (ALLOCATOR (), loc , type_name , types , RBS_RANGE_LEX2AST (name_range ));
1079+ (* singleton )-> args_range = args_range ;
10621080
1063- * singleton = rbs_types_class_singleton_new (ALLOCATOR (), RBS_RANGE_LEX2AST (type_range ), type_name , RBS_RANGE_LEX2AST (name_range ));
10641081 return true;
10651082}
10661083
@@ -1242,7 +1259,7 @@ static bool parse_simple(rbs_parser_t *parser, rbs_node_t **type, bool void_allo
12421259 }
12431260 case kSINGLETON : {
12441261 rbs_types_class_singleton_t * singleton = NULL ;
1245- CHECK_PARSE (parse_singleton_type (parser , & singleton ));
1262+ CHECK_PARSE (parse_singleton_type (parser , & singleton , self_allowed , classish_allowed ));
12461263 * type = (rbs_node_t * ) singleton ;
12471264 return true;
12481265 }
0 commit comments