Skip to content

Commit d8fe71b

Browse files
committed
Update parse so that void type is rejected depeneding on the context
1 parent 262302d commit d8fe71b

File tree

6 files changed

+153
-74
lines changed

6 files changed

+153
-74
lines changed

ext/rbs_extension/main.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ struct parse_type_arg {
8585
rb_encoding *encoding;
8686
rbs_parser_t *parser;
8787
VALUE require_eof;
88+
VALUE void_allowed;
8889
};
8990

9091
static VALUE ensure_free_parser(VALUE parser) {
@@ -100,8 +101,10 @@ static VALUE parse_type_try(VALUE a) {
100101
return Qnil;
101102
}
102103

104+
bool void_allowed = RTEST(arg->void_allowed);
105+
103106
rbs_node_t *type;
104-
rbs_parse_type(parser, &type);
107+
rbs_parse_type(parser, &type, void_allowed);
105108

106109
raise_error_if_any(parser, arg->buffer);
107110

@@ -157,7 +160,7 @@ static rbs_parser_t *alloc_parser_from_buffer(VALUE buffer, int start_pos, int e
157160
);
158161
}
159162

160-
static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof) {
163+
static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof, VALUE void_allowed) {
161164
VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
162165
StringValue(string);
163166
rb_encoding *encoding = rb_enc_get(string);
@@ -168,7 +171,8 @@ static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VAL
168171
.buffer = buffer,
169172
.encoding = encoding,
170173
.parser = parser,
171-
.require_eof = require_eof
174+
.require_eof = require_eof,
175+
.void_allowed = void_allowed
172176
};
173177

174178
VALUE result = rb_ensure(parse_type_try, (VALUE) &arg, ensure_free_parser, (VALUE) parser);
@@ -432,7 +436,7 @@ void rbs__init_parser(void) {
432436
VALUE empty_array = rb_obj_freeze(rb_ary_new());
433437
rb_gc_register_mark_object(empty_array);
434438

435-
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 5);
439+
rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 6);
436440
rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
437441
rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 3);
438442
rb_define_singleton_method(RBS_Parser, "_parse_type_params", rbsparser_parse_type_params, 4);

include/rbs/parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ rbs_ast_comment_t *rbs_parser_get_comment(rbs_parser_t *parser, int subject_line
126126

127127
void rbs_parser_set_error(rbs_parser_t *parser, rbs_token_t tok, bool syntax_error, const char *fmt, ...) RBS_ATTRIBUTE_FORMAT(4, 5);
128128

129-
bool rbs_parse_type(rbs_parser_t *parser, rbs_node_t **type);
129+
bool rbs_parse_type(rbs_parser_t *parser, rbs_node_t **type, bool void_allowed);
130130
bool rbs_parse_method_type(rbs_parser_t *parser, rbs_method_type_t **method_type);
131131
bool rbs_parse_signature(rbs_parser_t *parser, rbs_signature_t **signature);
132132

lib/rbs/parser_aux.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
module RBS
77
class Parser
8-
def self.parse_type(source, range: 0..., variables: [], require_eof: false)
8+
def self.parse_type(source, range: 0..., variables: [], require_eof: false, void_allowed: true)
99
buf = buffer(source)
10-
_parse_type(buf, range.begin || 0, range.end || buf.last_position, variables, require_eof)
10+
_parse_type(buf, range.begin || 0, range.end || buf.last_position, variables, require_eof, void_allowed)
1111
end
1212

1313
def self.parse_method_type(source, range: 0..., variables: [], require_eof: false)

sig/parser.rbs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,14 @@ module RBS
6262
# RBS::Parser.parse_type("", require_eof: true) # => nil
6363
# ```
6464
#
65-
def self.parse_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> Types::t?
65+
# The `void_allowed` keyword controls whether `void` is allowed as a type.
66+
#
67+
# ```ruby
68+
# RBS::Parser.parse_type("void", void_allowed: true) # => `void`
69+
# RBS::Parser.parse_type("void", void_allowed: false) # => Raises an syntax error
70+
# ```
71+
#
72+
def self.parse_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool, ?void_allowed: bool) -> Types::t?
6673

6774
# Parse whole RBS file and return an array of declarations
6875
#
@@ -116,7 +123,7 @@ module RBS
116123

117124
def self.buffer: (String | Buffer source) -> Buffer
118125

119-
def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> Types::t?
126+
def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof, bool void_allowed) -> Types::t?
120127

121128
def self._parse_method_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> MethodType?
122129

0 commit comments

Comments
 (0)