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.
Files changed (194) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +1 -0
  3. data/.github/workflows/c-check.yml +8 -4
  4. data/.github/workflows/comments.yml +3 -1
  5. data/.github/workflows/dependabot.yml +1 -1
  6. data/.github/workflows/ruby.yml +10 -0
  7. data/.github/workflows/rust.yml +95 -0
  8. data/CHANGELOG.md +323 -0
  9. data/Rakefile +12 -29
  10. data/Steepfile +1 -0
  11. data/config.yml +393 -37
  12. data/core/array.rbs +218 -188
  13. data/core/basic_object.rbs +9 -8
  14. data/core/class.rbs +6 -5
  15. data/core/comparable.rbs +45 -31
  16. data/core/complex.rbs +52 -40
  17. data/core/dir.rbs +57 -45
  18. data/core/encoding.rbs +5 -5
  19. data/core/enumerable.rbs +96 -91
  20. data/core/enumerator.rbs +4 -3
  21. data/core/errno.rbs +3 -2
  22. data/core/errors.rbs +31 -29
  23. data/core/exception.rbs +12 -12
  24. data/core/fiber.rbs +36 -36
  25. data/core/file.rbs +186 -113
  26. data/core/file_test.rbs +2 -2
  27. data/core/float.rbs +41 -32
  28. data/core/gc.rbs +78 -70
  29. data/core/hash.rbs +70 -60
  30. data/core/integer.rbs +32 -28
  31. data/core/io/buffer.rbs +36 -36
  32. data/core/io/wait.rbs +7 -7
  33. data/core/io.rbs +120 -135
  34. data/core/kernel.rbs +189 -139
  35. data/core/marshal.rbs +3 -3
  36. data/core/match_data.rbs +14 -12
  37. data/core/math.rbs +69 -67
  38. data/core/method.rbs +6 -6
  39. data/core/module.rbs +146 -85
  40. data/core/nil_class.rbs +4 -3
  41. data/core/numeric.rbs +35 -32
  42. data/core/object.rbs +6 -8
  43. data/core/object_space.rbs +11 -10
  44. data/core/pathname.rbs +131 -81
  45. data/core/proc.rbs +65 -33
  46. data/core/process.rbs +219 -201
  47. data/core/ractor.rbs +15 -11
  48. data/core/random.rbs +4 -3
  49. data/core/range.rbs +52 -47
  50. data/core/rational.rbs +5 -5
  51. data/core/rbs/unnamed/argf.rbs +58 -51
  52. data/core/rbs/unnamed/env_class.rbs +18 -13
  53. data/core/rbs/unnamed/main_class.rbs +123 -0
  54. data/core/rbs/unnamed/random.rbs +7 -5
  55. data/core/regexp.rbs +236 -197
  56. data/core/ruby.rbs +1 -1
  57. data/core/ruby_vm.rbs +32 -30
  58. data/core/rubygems/config_file.rbs +5 -5
  59. data/core/rubygems/errors.rbs +1 -1
  60. data/core/rubygems/requirement.rbs +5 -5
  61. data/core/rubygems/rubygems.rbs +5 -3
  62. data/core/set.rbs +17 -16
  63. data/core/signal.rbs +2 -2
  64. data/core/string.rbs +311 -292
  65. data/core/struct.rbs +26 -25
  66. data/core/symbol.rbs +25 -24
  67. data/core/thread.rbs +40 -34
  68. data/core/time.rbs +47 -42
  69. data/core/trace_point.rbs +34 -31
  70. data/core/true_class.rbs +2 -2
  71. data/core/unbound_method.rbs +10 -10
  72. data/core/warning.rbs +7 -7
  73. data/docs/collection.md +1 -1
  74. data/docs/config.md +171 -0
  75. data/docs/inline.md +110 -4
  76. data/docs/syntax.md +13 -12
  77. data/ext/rbs_extension/ast_translation.c +489 -135
  78. data/ext/rbs_extension/class_constants.c +8 -0
  79. data/ext/rbs_extension/class_constants.h +4 -0
  80. data/ext/rbs_extension/legacy_location.c +28 -51
  81. data/ext/rbs_extension/legacy_location.h +37 -0
  82. data/ext/rbs_extension/main.c +12 -20
  83. data/include/rbs/ast.h +423 -195
  84. data/include/rbs/lexer.h +2 -2
  85. data/include/rbs/location.h +25 -44
  86. data/include/rbs/parser.h +2 -2
  87. data/include/rbs/util/rbs_constant_pool.h +0 -3
  88. data/include/rbs.h +8 -0
  89. data/lib/rbs/ast/ruby/annotations.rb +157 -4
  90. data/lib/rbs/ast/ruby/members.rb +374 -22
  91. data/lib/rbs/cli/validate.rb +5 -60
  92. data/lib/rbs/collection/config/lockfile_generator.rb +6 -2
  93. data/lib/rbs/definition_builder.rb +60 -27
  94. data/lib/rbs/errors.rb +0 -11
  95. data/lib/rbs/inline_parser.rb +1 -1
  96. data/lib/rbs/parser_aux.rb +20 -7
  97. data/lib/rbs/prototype/helpers.rb +57 -0
  98. data/lib/rbs/prototype/rb.rb +1 -26
  99. data/lib/rbs/prototype/rbi.rb +1 -20
  100. data/lib/rbs/test/type_check.rb +3 -0
  101. data/lib/rbs/types.rb +62 -52
  102. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  103. data/lib/rbs/version.rb +1 -1
  104. data/lib/rbs.rb +0 -1
  105. data/rbs.gemspec +1 -1
  106. data/rust/.gitignore +1 -0
  107. data/rust/Cargo.lock +378 -0
  108. data/rust/Cargo.toml +7 -0
  109. data/rust/ruby-rbs/Cargo.toml +22 -0
  110. data/rust/ruby-rbs/build.rs +764 -0
  111. data/rust/ruby-rbs/examples/locations.rs +60 -0
  112. data/rust/ruby-rbs/src/lib.rs +1 -0
  113. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  114. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  115. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  116. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  117. data/rust/ruby-rbs-sys/build.rs +204 -0
  118. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  119. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  120. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  121. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  122. data/sig/ast/ruby/annotations.rbs +191 -4
  123. data/sig/ast/ruby/members.rbs +21 -1
  124. data/sig/cli/validate.rbs +1 -6
  125. data/sig/definition_builder.rbs +2 -0
  126. data/sig/errors.rbs +0 -8
  127. data/sig/method_types.rbs +1 -1
  128. data/sig/parser.rbs +17 -13
  129. data/sig/prototype/helpers.rbs +2 -0
  130. data/sig/types.rbs +10 -11
  131. data/sig/unit_test/spy.rbs +0 -8
  132. data/sig/unit_test/type_assertions.rbs +11 -0
  133. data/src/ast.c +339 -161
  134. data/src/lexstate.c +1 -1
  135. data/src/location.c +7 -47
  136. data/src/parser.c +674 -480
  137. data/src/util/rbs_constant_pool.c +0 -4
  138. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
  139. data/stdlib/cgi-escape/0/escape.rbs +4 -4
  140. data/stdlib/coverage/0/coverage.rbs +4 -3
  141. data/stdlib/date/0/date.rbs +33 -28
  142. data/stdlib/date/0/date_time.rbs +24 -23
  143. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  144. data/stdlib/erb/0/erb.rbs +64 -53
  145. data/stdlib/etc/0/etc.rbs +55 -50
  146. data/stdlib/fileutils/0/fileutils.rbs +138 -125
  147. data/stdlib/forwardable/0/forwardable.rbs +10 -10
  148. data/stdlib/io-console/0/io-console.rbs +2 -2
  149. data/stdlib/json/0/json.rbs +135 -108
  150. data/stdlib/monitor/0/monitor.rbs +3 -3
  151. data/stdlib/net-http/0/net-http.rbs +159 -134
  152. data/stdlib/objspace/0/objspace.rbs +8 -7
  153. data/stdlib/open-uri/0/open-uri.rbs +8 -8
  154. data/stdlib/open3/0/open3.rbs +36 -35
  155. data/stdlib/openssl/0/openssl.rbs +144 -129
  156. data/stdlib/optparse/0/optparse.rbs +18 -14
  157. data/stdlib/pathname/0/pathname.rbs +2 -2
  158. data/stdlib/pp/0/pp.rbs +9 -8
  159. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  160. data/stdlib/pstore/0/pstore.rbs +35 -30
  161. data/stdlib/psych/0/psych.rbs +61 -8
  162. data/stdlib/psych/0/store.rbs +2 -4
  163. data/stdlib/pty/0/pty.rbs +9 -6
  164. data/stdlib/random-formatter/0/random-formatter.rbs +2 -2
  165. data/stdlib/ripper/0/ripper.rbs +20 -17
  166. data/stdlib/securerandom/0/securerandom.rbs +1 -1
  167. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  168. data/stdlib/socket/0/addrinfo.rbs +7 -7
  169. data/stdlib/socket/0/basic_socket.rbs +3 -3
  170. data/stdlib/socket/0/ip_socket.rbs +10 -8
  171. data/stdlib/socket/0/socket.rbs +10 -9
  172. data/stdlib/socket/0/tcp_server.rbs +1 -1
  173. data/stdlib/socket/0/tcp_socket.rbs +1 -1
  174. data/stdlib/socket/0/udp_socket.rbs +1 -1
  175. data/stdlib/socket/0/unix_server.rbs +1 -1
  176. data/stdlib/stringio/0/stringio.rbs +55 -54
  177. data/stdlib/strscan/0/string_scanner.rbs +46 -44
  178. data/stdlib/tempfile/0/tempfile.rbs +24 -20
  179. data/stdlib/time/0/time.rbs +7 -5
  180. data/stdlib/tsort/0/tsort.rbs +7 -6
  181. data/stdlib/uri/0/common.rbs +26 -18
  182. data/stdlib/uri/0/file.rbs +2 -2
  183. data/stdlib/uri/0/generic.rbs +2 -2
  184. data/stdlib/uri/0/http.rbs +2 -2
  185. data/stdlib/uri/0/ldap.rbs +2 -2
  186. data/stdlib/uri/0/mailto.rbs +3 -3
  187. data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
  188. data/stdlib/zlib/0/deflate.rbs +4 -3
  189. data/stdlib/zlib/0/gzip_reader.rbs +4 -4
  190. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  191. data/stdlib/zlib/0/inflate.rbs +1 -1
  192. data/stdlib/zlib/0/need_dict.rbs +1 -1
  193. metadata +23 -5
  194. 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 they are untyped.
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 the `Calculator#add` method is `(?) -> untyped` -- it accepts any arguments without type checking and returns an `untyped` object.
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
- - Parameter types are not supported with doc-style syntax
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_ (Class instance type)
7
- | _interface-name_ _type-arguments_ (Interface type)
8
- | _alias-name_ _type-arguments_ (Alias type)
9
- | `singleton(` _class-name_ `)` (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)
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 cannot be parametrized.
88
+ singleton(::Hash) # Class singleton type
89
+ singleton(Array)[String] # Class singleton type with type application
89
90
  ```
90
91
 
91
92
  ### Literal type