Skip to content

Commit f74b1ec

Browse files
special syntax for Data and Struct subclasses
allows declaring and typing variables, inject inherited methods OTTB
1 parent 4d124e8 commit f74b1ec

File tree

6 files changed

+1399
-26
lines changed

6 files changed

+1399
-26
lines changed

core/process.rbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2236,7 +2236,7 @@ end
22362236
# <!-- rdoc-file=process.c -->
22372237
# Placeholder for rusage
22382238
#
2239-
class Process::Tms < Struct[Float]
2239+
class Process::Tms < Struct(utime: Float, stime: Float, cutime: Float, cstime: Float)
22402240
end
22412241

22422242
class Process::Waiter < Thread

ext/rbs_extension/parser.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)