@@ -1747,6 +1747,8 @@ VALUE parse_member_def(parserstate *state, bool instance_only, bool accept_overl
17471747
17481748/**
17491749 * class_instance_name ::= {} <class_name>
1750+ * | {} Data `{` kwarg args `}`
1751+ * | {} Struct `{` kwarg args `}`
17501752 * | {} class_name `[` type args <`]`>
17511753 *
17521754 * @param kind
@@ -1756,13 +1758,28 @@ void class_instance_name(parserstate *state, TypeNameKind kind, VALUE *name, VAL
17561758
17571759 * name = parse_type_name (state , kind , name_range );
17581760
1759- if (state -> next_token .type == pLBRACKET ) {
1761+ if (state -> next_token .type == pLBRACE && CLASS_OF (* name ) == RBS_TypeName && rb_funcall (* name , rb_intern ("data?" ), 0 ) == Qtrue ) {
1762+ parser_advance_assert (state , pLBRACE );
1763+ args_range -> start = state -> current_token .range .start ;
1764+ * args = parse_record_attributes (state );
1765+ parser_advance_assert (state , pRBRACE );
1766+ args_range -> end = state -> current_token .range .end ;
1767+ }
1768+ else if (state -> next_token .type == pLBRACE && CLASS_OF (* name ) == RBS_TypeName && rb_funcall (* name , rb_intern ("struct?" ), 0 ) == Qtrue ) {
1769+ parser_advance_assert (state , pLBRACE );
1770+ args_range -> start = state -> current_token .range .start ;
1771+ * args = parse_record_attributes (state );
1772+ parser_advance_assert (state , pRBRACE );
1773+ args_range -> end = state -> current_token .range .end ;
1774+ }
1775+ else if (state -> next_token .type == pLBRACKET ) {
17601776 parser_advance (state );
17611777 args_range -> start = state -> current_token .range .start ;
17621778 parse_type_list (state , pRBRACKET , args );
17631779 parser_advance_assert (state , pRBRACKET );
17641780 args_range -> end = state -> current_token .range .end ;
1765- } else {
1781+ }
1782+ else {
17661783 * args_range = NULL_RANGE ;
17671784 }
17681785}
0 commit comments