rbs 4.0.0.dev.5 → 4.0.1.dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.clang-format +1 -0
- data/.github/workflows/c-check.yml +8 -4
- data/.github/workflows/comments.yml +3 -1
- data/.github/workflows/dependabot.yml +1 -1
- data/.github/workflows/ruby.yml +10 -0
- data/.github/workflows/rust.yml +95 -0
- data/CHANGELOG.md +323 -0
- data/Rakefile +12 -29
- data/Steepfile +1 -0
- data/config.yml +393 -37
- data/core/array.rbs +218 -188
- data/core/basic_object.rbs +9 -8
- data/core/class.rbs +6 -5
- data/core/comparable.rbs +45 -31
- data/core/complex.rbs +52 -40
- data/core/dir.rbs +57 -45
- data/core/encoding.rbs +5 -5
- data/core/enumerable.rbs +96 -91
- data/core/enumerator.rbs +4 -3
- data/core/errno.rbs +3 -2
- data/core/errors.rbs +31 -29
- data/core/exception.rbs +12 -12
- data/core/fiber.rbs +36 -36
- data/core/file.rbs +186 -113
- data/core/file_test.rbs +2 -2
- data/core/float.rbs +41 -32
- data/core/gc.rbs +78 -70
- data/core/hash.rbs +70 -60
- data/core/integer.rbs +32 -28
- data/core/io/buffer.rbs +36 -36
- data/core/io/wait.rbs +7 -7
- data/core/io.rbs +120 -135
- data/core/kernel.rbs +189 -139
- data/core/marshal.rbs +3 -3
- data/core/match_data.rbs +14 -12
- data/core/math.rbs +69 -67
- data/core/method.rbs +6 -6
- data/core/module.rbs +146 -85
- data/core/nil_class.rbs +4 -3
- data/core/numeric.rbs +35 -32
- data/core/object.rbs +6 -8
- data/core/object_space.rbs +11 -10
- data/core/pathname.rbs +131 -81
- data/core/proc.rbs +65 -33
- data/core/process.rbs +219 -201
- data/core/ractor.rbs +15 -11
- data/core/random.rbs +4 -3
- data/core/range.rbs +52 -47
- data/core/rational.rbs +5 -5
- data/core/rbs/unnamed/argf.rbs +58 -51
- data/core/rbs/unnamed/env_class.rbs +18 -13
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +7 -5
- data/core/regexp.rbs +236 -197
- data/core/ruby.rbs +1 -1
- data/core/ruby_vm.rbs +32 -30
- data/core/rubygems/config_file.rbs +5 -5
- data/core/rubygems/errors.rbs +1 -1
- data/core/rubygems/requirement.rbs +5 -5
- data/core/rubygems/rubygems.rbs +5 -3
- data/core/set.rbs +17 -16
- data/core/signal.rbs +2 -2
- data/core/string.rbs +311 -292
- data/core/struct.rbs +26 -25
- data/core/symbol.rbs +25 -24
- data/core/thread.rbs +40 -34
- data/core/time.rbs +47 -42
- data/core/trace_point.rbs +34 -31
- data/core/true_class.rbs +2 -2
- data/core/unbound_method.rbs +10 -10
- data/core/warning.rbs +7 -7
- data/docs/collection.md +1 -1
- data/docs/config.md +171 -0
- data/docs/inline.md +110 -4
- data/docs/syntax.md +13 -12
- data/ext/rbs_extension/ast_translation.c +489 -135
- data/ext/rbs_extension/class_constants.c +8 -0
- data/ext/rbs_extension/class_constants.h +4 -0
- data/ext/rbs_extension/legacy_location.c +28 -51
- data/ext/rbs_extension/legacy_location.h +37 -0
- data/ext/rbs_extension/main.c +12 -20
- data/include/rbs/ast.h +423 -195
- data/include/rbs/lexer.h +2 -2
- data/include/rbs/location.h +25 -44
- data/include/rbs/parser.h +2 -2
- data/include/rbs/util/rbs_constant_pool.h +0 -3
- data/include/rbs.h +8 -0
- data/lib/rbs/ast/ruby/annotations.rb +157 -4
- data/lib/rbs/ast/ruby/members.rb +374 -22
- data/lib/rbs/cli/validate.rb +5 -60
- data/lib/rbs/collection/config/lockfile_generator.rb +6 -2
- data/lib/rbs/definition_builder.rb +60 -27
- data/lib/rbs/errors.rb +0 -11
- data/lib/rbs/inline_parser.rb +1 -1
- data/lib/rbs/parser_aux.rb +20 -7
- data/lib/rbs/prototype/helpers.rb +57 -0
- data/lib/rbs/prototype/rb.rb +1 -26
- data/lib/rbs/prototype/rbi.rb +1 -20
- data/lib/rbs/test/type_check.rb +3 -0
- data/lib/rbs/types.rb +62 -52
- data/lib/rbs/unit_test/type_assertions.rb +35 -8
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +0 -1
- data/rbs.gemspec +1 -1
- data/rust/.gitignore +1 -0
- data/rust/Cargo.lock +378 -0
- data/rust/Cargo.toml +7 -0
- data/rust/ruby-rbs/Cargo.toml +22 -0
- data/rust/ruby-rbs/build.rs +764 -0
- data/rust/ruby-rbs/examples/locations.rs +60 -0
- data/rust/ruby-rbs/src/lib.rs +1 -0
- data/rust/ruby-rbs/src/node/mod.rs +742 -0
- data/rust/ruby-rbs/tests/sanity.rs +47 -0
- data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
- data/rust/ruby-rbs-sys/Cargo.toml +23 -0
- data/rust/ruby-rbs-sys/build.rs +204 -0
- data/rust/ruby-rbs-sys/src/lib.rs +50 -0
- data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
- data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
- data/rust/ruby-rbs-sys/wrapper.h +1 -0
- data/sig/ast/ruby/annotations.rbs +191 -4
- data/sig/ast/ruby/members.rbs +21 -1
- data/sig/cli/validate.rbs +1 -6
- data/sig/definition_builder.rbs +2 -0
- data/sig/errors.rbs +0 -8
- data/sig/method_types.rbs +1 -1
- data/sig/parser.rbs +17 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/types.rbs +10 -11
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +11 -0
- data/src/ast.c +339 -161
- data/src/lexstate.c +1 -1
- data/src/location.c +7 -47
- data/src/parser.c +674 -480
- data/src/util/rbs_constant_pool.c +0 -4
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
- data/stdlib/cgi-escape/0/escape.rbs +4 -4
- data/stdlib/coverage/0/coverage.rbs +4 -3
- data/stdlib/date/0/date.rbs +33 -28
- data/stdlib/date/0/date_time.rbs +24 -23
- data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
- data/stdlib/erb/0/erb.rbs +64 -53
- data/stdlib/etc/0/etc.rbs +55 -50
- data/stdlib/fileutils/0/fileutils.rbs +138 -125
- data/stdlib/forwardable/0/forwardable.rbs +10 -10
- data/stdlib/io-console/0/io-console.rbs +2 -2
- data/stdlib/json/0/json.rbs +135 -108
- data/stdlib/monitor/0/monitor.rbs +3 -3
- data/stdlib/net-http/0/net-http.rbs +159 -134
- data/stdlib/objspace/0/objspace.rbs +8 -7
- data/stdlib/open-uri/0/open-uri.rbs +8 -8
- data/stdlib/open3/0/open3.rbs +36 -35
- data/stdlib/openssl/0/openssl.rbs +144 -129
- data/stdlib/optparse/0/optparse.rbs +18 -14
- data/stdlib/pathname/0/pathname.rbs +2 -2
- data/stdlib/pp/0/pp.rbs +9 -8
- data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
- data/stdlib/pstore/0/pstore.rbs +35 -30
- data/stdlib/psych/0/psych.rbs +61 -8
- data/stdlib/psych/0/store.rbs +2 -4
- data/stdlib/pty/0/pty.rbs +9 -6
- data/stdlib/random-formatter/0/random-formatter.rbs +2 -2
- data/stdlib/ripper/0/ripper.rbs +20 -17
- data/stdlib/securerandom/0/securerandom.rbs +1 -1
- data/stdlib/shellwords/0/shellwords.rbs +2 -2
- data/stdlib/socket/0/addrinfo.rbs +7 -7
- data/stdlib/socket/0/basic_socket.rbs +3 -3
- data/stdlib/socket/0/ip_socket.rbs +10 -8
- data/stdlib/socket/0/socket.rbs +10 -9
- data/stdlib/socket/0/tcp_server.rbs +1 -1
- data/stdlib/socket/0/tcp_socket.rbs +1 -1
- data/stdlib/socket/0/udp_socket.rbs +1 -1
- data/stdlib/socket/0/unix_server.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +55 -54
- data/stdlib/strscan/0/string_scanner.rbs +46 -44
- data/stdlib/tempfile/0/tempfile.rbs +24 -20
- data/stdlib/time/0/time.rbs +7 -5
- data/stdlib/tsort/0/tsort.rbs +7 -6
- data/stdlib/uri/0/common.rbs +26 -18
- data/stdlib/uri/0/file.rbs +2 -2
- data/stdlib/uri/0/generic.rbs +2 -2
- data/stdlib/uri/0/http.rbs +2 -2
- data/stdlib/uri/0/ldap.rbs +2 -2
- data/stdlib/uri/0/mailto.rbs +3 -3
- data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
- data/stdlib/zlib/0/deflate.rbs +4 -3
- data/stdlib/zlib/0/gzip_reader.rbs +4 -4
- data/stdlib/zlib/0/gzip_writer.rbs +14 -12
- data/stdlib/zlib/0/inflate.rbs +1 -1
- data/stdlib/zlib/0/need_dict.rbs +1 -1
- metadata +23 -5
- data/.github/workflows/valgrind.yml +0 -42
data/docs/config.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# config.yml
|
|
2
|
+
|
|
3
|
+
`config.yml` is the definition of data structure for parser results -- AST.
|
|
4
|
+
|
|
5
|
+
It defines the data structure for the parser implementation in C and Rust `node` modules.
|
|
6
|
+
|
|
7
|
+
## C parser code
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
$ rake templates
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Our C parser consists of two components:
|
|
14
|
+
|
|
15
|
+
1. Pure C Parser
|
|
16
|
+
2. Translator from the pure C AST to Ruby object
|
|
17
|
+
|
|
18
|
+
`config.yml` defines the AST for pure C parser in `ast.h`/`ast.c` and translator from the C AST to Ruby objects in `ast_translation.h`/`ast_translation.c`.
|
|
19
|
+
|
|
20
|
+
## `ruby-rbs` crate
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
$ cd rust; cargo build
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The `build.rs` in `ruby-rbs` crate defines the data structure derived from `config.yml` definitions under `node` module.
|
|
27
|
+
|
|
28
|
+
## nodes
|
|
29
|
+
|
|
30
|
+
`nodes` defines *node* data types in C or Rust.
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
nodes:
|
|
34
|
+
- name: RBS::AST::Declarations::Class
|
|
35
|
+
rust_name: ClassNode
|
|
36
|
+
fields:
|
|
37
|
+
- name: name
|
|
38
|
+
c_type: rbs_type_name
|
|
39
|
+
- name: type_params
|
|
40
|
+
c_type: rbs_node_list
|
|
41
|
+
- name: super_class
|
|
42
|
+
c_type: rbs_ast_declarations_class_super
|
|
43
|
+
optional: true # NULL when no superclass (e.g., `class Foo end` vs `class Foo < Bar end`)
|
|
44
|
+
- name: members
|
|
45
|
+
c_type: rbs_node_list
|
|
46
|
+
- name: annotations
|
|
47
|
+
c_type: rbs_node_list
|
|
48
|
+
- name: comment
|
|
49
|
+
c_type: rbs_ast_comment
|
|
50
|
+
optional: true # NULL when no comment precedes the declaration
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
This defines `rbs_ast_declarations_class` struct so that the parser constructs the AST using the structs.
|
|
54
|
+
|
|
55
|
+
```c
|
|
56
|
+
typedef struct rbs_ast_declarations_class {
|
|
57
|
+
rbs_node_t base;
|
|
58
|
+
|
|
59
|
+
struct rbs_type_name *name;
|
|
60
|
+
struct rbs_node_list *type_params;
|
|
61
|
+
struct rbs_ast_declarations_class_super *super_class; /* Optional */
|
|
62
|
+
struct rbs_node_list *members;
|
|
63
|
+
struct rbs_node_list *annotations;
|
|
64
|
+
struct rbs_ast_comment *comment; /* Optional */
|
|
65
|
+
|
|
66
|
+
rbs_location_range keyword_range; /* Required */
|
|
67
|
+
rbs_location_range name_range; /* Required */
|
|
68
|
+
rbs_location_range end_range; /* Required */
|
|
69
|
+
rbs_location_range type_params_range; /* Optional */
|
|
70
|
+
rbs_location_range lt_range; /* Optional */
|
|
71
|
+
} rbs_ast_declarations_class_t;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The `rbs_ast_declarations_class` struct is a pure C AST, and `ast_translation.c` defines translation into a Ruby object of `RBS::AST::Declarations::Class` class.
|
|
75
|
+
|
|
76
|
+
```c
|
|
77
|
+
case RBS_AST_DECLARATIONS_CLASS: {
|
|
78
|
+
rbs_ast_declarations_class_t *node = (rbs_ast_declarations_class_t *) instance;
|
|
79
|
+
|
|
80
|
+
VALUE h = rb_hash_new();
|
|
81
|
+
VALUE location = rbs_location_range_to_ruby_location(ctx, node->base.location);
|
|
82
|
+
rbs_loc *loc = rbs_check_location(location);
|
|
83
|
+
rbs_loc_legacy_alloc_children(loc, 5);
|
|
84
|
+
rbs_loc_legacy_add_required_child(loc, rb_intern("keyword"), (rbs_loc_range) { .start = node->keyword_range.start_char, .end = node->keyword_range.end_char });
|
|
85
|
+
rbs_loc_legacy_add_required_child(loc, rb_intern("name"), (rbs_loc_range) { .start = node->name_range.start_char, .end = node->name_range.end_char });
|
|
86
|
+
rbs_loc_legacy_add_required_child(loc, rb_intern("end"), (rbs_loc_range) { .start = node->end_range.start_char, .end = node->end_range.end_char });
|
|
87
|
+
rbs_loc_legacy_add_optional_child(loc, rb_intern("type_params"), (rbs_loc_range) { .start = node->type_params_range.start_char, .end = node->type_params_range.end_char });
|
|
88
|
+
rbs_loc_legacy_add_optional_child(loc, rb_intern("lt"), (rbs_loc_range) { .start = node->lt_range.start_char, .end = node->lt_range.end_char });
|
|
89
|
+
rb_hash_aset(h, ID2SYM(rb_intern("location")), location);
|
|
90
|
+
rb_hash_aset(h, ID2SYM(rb_intern("name")), rbs_struct_to_ruby_value(ctx, (rbs_node_t *) node->name)); // rbs_type_name
|
|
91
|
+
rb_hash_aset(h, ID2SYM(rb_intern("type_params")), rbs_node_list_to_ruby_array(ctx, node->type_params));
|
|
92
|
+
rb_hash_aset(h, ID2SYM(rb_intern("super_class")), rbs_struct_to_ruby_value(ctx, (rbs_node_t *) node->super_class)); // rbs_ast_declarations_class_super
|
|
93
|
+
rb_hash_aset(h, ID2SYM(rb_intern("members")), rbs_node_list_to_ruby_array(ctx, node->members));
|
|
94
|
+
rb_hash_aset(h, ID2SYM(rb_intern("annotations")), rbs_node_list_to_ruby_array(ctx, node->annotations));
|
|
95
|
+
rb_hash_aset(h, ID2SYM(rb_intern("comment")), rbs_struct_to_ruby_value(ctx, (rbs_node_t *) node->comment)); // rbs_ast_comment
|
|
96
|
+
|
|
97
|
+
rb_funcall(
|
|
98
|
+
RBS_AST_TypeParam,
|
|
99
|
+
rb_intern("resolve_variables"),
|
|
100
|
+
1,
|
|
101
|
+
rb_hash_lookup(h, ID2SYM(rb_intern("type_params")))
|
|
102
|
+
);
|
|
103
|
+
return CLASS_NEW_INSTANCE(
|
|
104
|
+
RBS_AST_Declarations_Class,
|
|
105
|
+
1,
|
|
106
|
+
&h
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## enums
|
|
112
|
+
|
|
113
|
+
`enums` defines *enum* data types in C or Rust.
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
enums:
|
|
117
|
+
attribute_visibility:
|
|
118
|
+
optional: true
|
|
119
|
+
symbols:
|
|
120
|
+
- unspecified
|
|
121
|
+
- public
|
|
122
|
+
- private
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
For example, the `attribute_visibility` enum is a data type for `visibility` attribute of `attr_reader`, `attr_writer`, and `attr_accessor` definitions.
|
|
126
|
+
The `visibility` attribute can be one of `unspecified`, `public`, and `private`.
|
|
127
|
+
|
|
128
|
+
### Symbol enums
|
|
129
|
+
|
|
130
|
+
Enum definition with `symbols:` attribute defines *enum* data that is mapped to Ruby symbols.
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
enums:
|
|
134
|
+
attribute_visibility:
|
|
135
|
+
optional: true
|
|
136
|
+
symbols:
|
|
137
|
+
- unspecified
|
|
138
|
+
- public
|
|
139
|
+
- private
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
It defines an `enum` in C AST definition.
|
|
143
|
+
|
|
144
|
+
```c
|
|
145
|
+
enum RBS_ATTRIBUTE_VISIBILITY_TAG {
|
|
146
|
+
RBS_ATTRIBUTE_VISIBILITY_TAG_UNSPECIFIED,
|
|
147
|
+
RBS_ATTRIBUTE_VISIBILITY_TAG_PUBLIC,
|
|
148
|
+
RBS_ATTRIBUTE_VISIBILITY_TAG_PRIVATE,
|
|
149
|
+
};
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
The C extension also defines a translation:
|
|
153
|
+
|
|
154
|
+
```c
|
|
155
|
+
VALUE rbs_attribute_visibility_to_ruby(enum rbs_attribute_visibility value) {
|
|
156
|
+
switch (value) {
|
|
157
|
+
case RBS_ATTRIBUTE_VISIBILITY_UNSPECIFIED:
|
|
158
|
+
return Qnil;
|
|
159
|
+
case RBS_ATTRIBUTE_VISIBILITY_PUBLIC:
|
|
160
|
+
return rb_id2sym(rb_intern("public"));
|
|
161
|
+
case RBS_ATTRIBUTE_VISIBILITY_PRIVATE:
|
|
162
|
+
return rb_id2sym(rb_intern("private"));
|
|
163
|
+
default:
|
|
164
|
+
rb_fatal("unknown enum rbs_attribute_visibility value: %d", value);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`RBS_ATTRIBUTE_VISIBILITY_PUBLIC` and `RBS_ATTRIBUTE_VISIBILITY_PRIVATE` are translated to Ruby symbols `:public` and `:private` respectively.
|
|
170
|
+
|
|
171
|
+
Note that the first `RBS_ATTRIBUTE_VISIBILITY_UNSPECIFIED` is translated to `nil` in Ruby. This is specified by the `optional: true` attribute in YAML. When `optional: true` is set, the first enum value is translated to `nil`.
|
data/docs/inline.md
CHANGED
|
@@ -142,7 +142,9 @@ It detects method definitions and allows you to add annotation comments to descr
|
|
|
142
142
|
|
|
143
143
|
### Unannotated method definition
|
|
144
144
|
|
|
145
|
-
Methods defined with `def` syntax are detected, but
|
|
145
|
+
Methods defined with `def` syntax are detected, but their inferred type depends on whether a super method exists.
|
|
146
|
+
|
|
147
|
+
If there is no super method, the inferred type is `(?) -> untyped` -- it accepts any arguments without type checking and returns an `untyped` object.
|
|
146
148
|
|
|
147
149
|
```ruby
|
|
148
150
|
class Calculator
|
|
@@ -150,7 +152,22 @@ class Calculator
|
|
|
150
152
|
end
|
|
151
153
|
```
|
|
152
154
|
|
|
153
|
-
The type of
|
|
155
|
+
The type of `Calculator#add` is `(?) -> untyped`.
|
|
156
|
+
|
|
157
|
+
If the super class (or an included module) defines a method with the same name, the unannotated method inherits that type.
|
|
158
|
+
|
|
159
|
+
```ruby
|
|
160
|
+
class Calculator
|
|
161
|
+
# @rbs (Integer, Integer) -> Integer
|
|
162
|
+
def add(x, y) = x + y
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
class ScientificCalculator < Calculator
|
|
166
|
+
def add(x, y) = x + y # No annotation
|
|
167
|
+
end
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
The type of `ScientificCalculator#add` is `(Integer, Integer) -> Integer`, inherited from `Calculator#add`.
|
|
154
171
|
|
|
155
172
|
### Method type annotation syntax
|
|
156
173
|
|
|
@@ -188,23 +205,112 @@ The type of both methods is `(Integer, Integer) -> Integer | (Float, Float) -> F
|
|
|
188
205
|
> The `@rbs METHOD-TYPE` syntax allows overloads with the `|` operator, just like in RBS files.
|
|
189
206
|
> Multiple `: METHOD-TYPE` declarations are required for overloads.
|
|
190
207
|
|
|
208
|
+
The `@rbs METHOD-TYPE` syntax allows having `...` at the last part.
|
|
209
|
+
|
|
210
|
+
```ruby
|
|
211
|
+
class Calculator2 < Calculator
|
|
212
|
+
# @rbs (Float, Float) -> Float | ...
|
|
213
|
+
def add(x, y) = x + y
|
|
214
|
+
|
|
215
|
+
# @rbs ...
|
|
216
|
+
def subtract(x, y) = super
|
|
217
|
+
end
|
|
218
|
+
```
|
|
219
|
+
|
|
191
220
|
#### Doc-style syntax
|
|
192
221
|
|
|
222
|
+
The doc-style syntax allows annotating individual method parameters and the return type using `@rbs NAME: TYPE` comments.
|
|
223
|
+
|
|
224
|
+
The `@rbs PARAM_NAME: T` syntax declares the type of a parameter:
|
|
225
|
+
|
|
226
|
+
```ruby
|
|
227
|
+
class Calculator
|
|
228
|
+
# @rbs x: Integer
|
|
229
|
+
# @rbs y: Integer
|
|
230
|
+
# @rbs a: String
|
|
231
|
+
# @rbs b: bool
|
|
232
|
+
def add(x, y = 1, a:, b: false)
|
|
233
|
+
pp(x:, y:, a:, b:)
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
You can add a description after `--`:
|
|
239
|
+
|
|
240
|
+
```ruby
|
|
241
|
+
class Calculator
|
|
242
|
+
# @rbs x: Integer -- required positional argument
|
|
243
|
+
# @rbs y: Integer -- optional positional argument
|
|
244
|
+
# @rbs a: String -- required keyword argument
|
|
245
|
+
# @rbs b: bool -- optional keyword argument
|
|
246
|
+
def add(x, y = 1, a:, b: false)
|
|
247
|
+
pp(x:, y:, a:, b:)
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Types of splat (`*a`) and double-splat (`**b`) parameters can be declared too.
|
|
253
|
+
|
|
254
|
+
```ruby
|
|
255
|
+
class Foo
|
|
256
|
+
# @rbs *a: String -- The type of `a` is `Array[String]`
|
|
257
|
+
# @rbs **b: bool -- The type of `b` is `Hash[Symbol, bool]`
|
|
258
|
+
def foo(*a, **b)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# @rbs *: String -- Parameter name is optional
|
|
262
|
+
# @rbs **: bool -- Parameter name can be omitted in Ruby too
|
|
263
|
+
def bar(*a, **)
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Types of block parameter (`&block`) can be declared.
|
|
269
|
+
|
|
270
|
+
```ruby
|
|
271
|
+
class Foo
|
|
272
|
+
# @rbs &block: () -> void
|
|
273
|
+
def foo(&block)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# @rbs &: () -> void -- The parameter name can be omitted
|
|
277
|
+
def bar(&)
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# @rbs &block: ? () -> untyped -- The `?` prefix is for optional block
|
|
281
|
+
def baz(&block)
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
```
|
|
285
|
+
|
|
193
286
|
The `@rbs return: T` syntax declares the return type of a method:
|
|
194
287
|
|
|
195
288
|
```ruby
|
|
196
289
|
class Calculator
|
|
197
|
-
# @rbs return: String
|
|
290
|
+
# @rbs return: String -- a human-readable representation
|
|
198
291
|
def to_s
|
|
199
292
|
"Calculator"
|
|
200
293
|
end
|
|
201
294
|
end
|
|
202
295
|
```
|
|
203
296
|
|
|
297
|
+
Both can be combined:
|
|
298
|
+
|
|
299
|
+
```ruby
|
|
300
|
+
class Calculator
|
|
301
|
+
# @rbs x: Integer -- the first operand
|
|
302
|
+
# @rbs y: Integer -- the second operand
|
|
303
|
+
# @rbs return: Integer
|
|
304
|
+
def add(x, y:)
|
|
305
|
+
x + y
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
```
|
|
309
|
+
|
|
204
310
|
### Current Limitations
|
|
205
311
|
|
|
206
312
|
- Class methods and singleton methods are not supported
|
|
207
|
-
-
|
|
313
|
+
- Only positional and keyword parameters are supported. Splat parameters (`*x`, `**y`) and block parameter (`&block`) are not supported yet.
|
|
208
314
|
- Method visibility declaration is not supported yet
|
|
209
315
|
|
|
210
316
|
## Attributes
|
data/docs/syntax.md
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
## Types
|
|
4
4
|
|
|
5
5
|
```markdown
|
|
6
|
-
_type_ ::= _class-name_ _type-arguments_
|
|
7
|
-
| _interface-name_ _type-arguments_
|
|
8
|
-
| _alias-name_ _type-arguments_
|
|
9
|
-
| `singleton(` _class-name_ `)`
|
|
10
|
-
| _literal_
|
|
11
|
-
| _type_ `|` _type_
|
|
12
|
-
| _type_ `&` _type_
|
|
13
|
-
| _type_ `?`
|
|
14
|
-
| `{` _record-name_ `:` _type_ `,` etc. `}`
|
|
15
|
-
| `[]` | `[` _type_ `,` etc. `]`
|
|
16
|
-
| _type-variable_
|
|
6
|
+
_type_ ::= _class-name_ _type-arguments_ (Class instance type)
|
|
7
|
+
| _interface-name_ _type-arguments_ (Interface type)
|
|
8
|
+
| _alias-name_ _type-arguments_ (Alias type)
|
|
9
|
+
| `singleton(` _class-name_ `)` _type-arguments_ (Class singleton type)
|
|
10
|
+
| _literal_ (Literal type)
|
|
11
|
+
| _type_ `|` _type_ (Union type)
|
|
12
|
+
| _type_ `&` _type_ (Intersection type)
|
|
13
|
+
| _type_ `?` (Optional type)
|
|
14
|
+
| `{` _record-name_ `:` _type_ `,` etc. `}` (Record type)
|
|
15
|
+
| `[]` | `[` _type_ `,` etc. `]` (Tuples)
|
|
16
|
+
| _type-variable_ (Type variables)
|
|
17
17
|
| `self`
|
|
18
18
|
| `instance`
|
|
19
19
|
| `class`
|
|
@@ -85,7 +85,8 @@ Class singleton type denotes _the type of a singleton object of a class_.
|
|
|
85
85
|
|
|
86
86
|
```rbs
|
|
87
87
|
singleton(String)
|
|
88
|
-
singleton(::Hash) # Class singleton type
|
|
88
|
+
singleton(::Hash) # Class singleton type
|
|
89
|
+
singleton(Array)[String] # Class singleton type with type application
|
|
89
90
|
```
|
|
90
91
|
|
|
91
92
|
### Literal type
|