rbs 4.0.0.dev.4 → 4.1.0.pre.2

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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +1 -0
  3. data/.github/dependabot.yml +16 -14
  4. data/.github/workflows/bundle-update.yml +63 -0
  5. data/.github/workflows/c-check.yml +21 -11
  6. data/.github/workflows/comments.yml +5 -3
  7. data/.github/workflows/dependabot.yml +2 -2
  8. data/.github/workflows/jruby.yml +67 -0
  9. data/.github/workflows/milestone.yml +83 -0
  10. data/.github/workflows/ruby.yml +63 -24
  11. data/.github/workflows/rust.yml +184 -0
  12. data/.github/workflows/truffleruby.yml +54 -0
  13. data/.github/workflows/typecheck.yml +5 -2
  14. data/.github/workflows/wasm.yml +53 -0
  15. data/.github/workflows/windows.yml +8 -2
  16. data/.gitignore +11 -0
  17. data/.rubocop.yml +1 -1
  18. data/CHANGELOG.md +357 -0
  19. data/README.md +4 -4
  20. data/Rakefile +365 -33
  21. data/Steepfile +8 -0
  22. data/config.yml +450 -24
  23. data/core/array.rbs +443 -363
  24. data/core/basic_object.rbs +9 -8
  25. data/core/binding.rbs +0 -2
  26. data/core/builtin.rbs +9 -8
  27. data/core/class.rbs +11 -8
  28. data/core/comparable.rbs +55 -34
  29. data/core/complex.rbs +104 -78
  30. data/core/dir.rbs +61 -49
  31. data/core/encoding.rbs +12 -15
  32. data/core/enumerable.rbs +288 -196
  33. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  34. data/core/enumerator/product.rbs +5 -5
  35. data/core/enumerator.rbs +91 -28
  36. data/core/errno.rbs +11 -2
  37. data/core/errors.rbs +58 -29
  38. data/core/exception.rbs +13 -13
  39. data/core/fiber.rbs +74 -54
  40. data/core/file.rbs +260 -1151
  41. data/core/file_constants.rbs +463 -0
  42. data/core/file_stat.rbs +534 -0
  43. data/core/file_test.rbs +3 -3
  44. data/core/float.rbs +257 -92
  45. data/core/gc.rbs +425 -281
  46. data/core/hash.rbs +1151 -829
  47. data/core/integer.rbs +156 -195
  48. data/core/io/buffer.rbs +53 -42
  49. data/core/io/wait.rbs +13 -35
  50. data/core/io.rbs +216 -150
  51. data/core/kernel.rbs +239 -163
  52. data/core/marshal.rbs +4 -4
  53. data/core/match_data.rbs +15 -13
  54. data/core/math.rbs +107 -66
  55. data/core/method.rbs +69 -33
  56. data/core/module.rbs +302 -150
  57. data/core/nil_class.rbs +7 -6
  58. data/core/numeric.rbs +77 -63
  59. data/core/object.rbs +9 -11
  60. data/core/object_space/weak_key_map.rbs +7 -7
  61. data/core/object_space.rbs +30 -23
  62. data/core/pathname.rbs +1322 -0
  63. data/core/proc.rbs +95 -58
  64. data/core/process.rbs +222 -202
  65. data/core/ractor.rbs +371 -515
  66. data/core/random.rbs +21 -3
  67. data/core/range.rbs +181 -79
  68. data/core/rational.rbs +60 -89
  69. data/core/rbs/ops.rbs +154 -0
  70. data/core/rbs/unnamed/argf.rbs +63 -56
  71. data/core/rbs/unnamed/env_class.rbs +19 -14
  72. data/core/rbs/unnamed/main_class.rbs +123 -0
  73. data/core/rbs/unnamed/random.rbs +11 -118
  74. data/core/regexp.rbs +258 -214
  75. data/core/ruby.rbs +53 -0
  76. data/core/ruby_vm.rbs +78 -34
  77. data/core/rubygems/config_file.rbs +5 -5
  78. data/core/rubygems/errors.rbs +4 -71
  79. data/core/rubygems/requirement.rbs +5 -5
  80. data/core/rubygems/rubygems.rbs +16 -82
  81. data/core/rubygems/version.rbs +2 -3
  82. data/core/set.rbs +493 -363
  83. data/core/signal.rbs +26 -16
  84. data/core/string.rbs +3234 -1285
  85. data/core/struct.rbs +43 -42
  86. data/core/symbol.rbs +41 -34
  87. data/core/thread.rbs +141 -73
  88. data/core/time.rbs +81 -50
  89. data/core/trace_point.rbs +41 -35
  90. data/core/true_class.rbs +2 -2
  91. data/core/unbound_method.rbs +24 -16
  92. data/core/warning.rbs +7 -7
  93. data/docs/CONTRIBUTING.md +2 -1
  94. data/docs/aliases.md +79 -0
  95. data/docs/collection.md +3 -3
  96. data/docs/config.md +171 -0
  97. data/docs/encoding.md +56 -0
  98. data/docs/gem.md +0 -1
  99. data/docs/inline.md +634 -0
  100. data/docs/rbs_by_example.md +20 -20
  101. data/docs/rust.md +96 -0
  102. data/docs/sigs.md +3 -3
  103. data/docs/syntax.md +48 -18
  104. data/docs/type_fingerprint.md +21 -0
  105. data/docs/wasm_serialization.md +80 -0
  106. data/exe/rbs +1 -1
  107. data/ext/rbs_extension/ast_translation.c +1441 -671
  108. data/ext/rbs_extension/ast_translation.h +7 -0
  109. data/ext/rbs_extension/class_constants.c +18 -2
  110. data/ext/rbs_extension/class_constants.h +9 -0
  111. data/ext/rbs_extension/extconf.rb +6 -1
  112. data/ext/rbs_extension/legacy_location.c +33 -56
  113. data/ext/rbs_extension/legacy_location.h +37 -0
  114. data/ext/rbs_extension/main.c +183 -39
  115. data/include/rbs/ast.h +597 -297
  116. data/include/rbs/defines.h +40 -0
  117. data/include/rbs/lexer.h +31 -11
  118. data/include/rbs/location.h +25 -44
  119. data/include/rbs/parser.h +6 -6
  120. data/include/rbs/serialize.h +39 -0
  121. data/include/rbs/string.h +0 -2
  122. data/include/rbs/util/rbs_allocator.h +34 -13
  123. data/include/rbs/util/rbs_assert.h +12 -1
  124. data/include/rbs/util/rbs_constant_pool.h +0 -3
  125. data/include/rbs/util/rbs_encoding.h +2 -0
  126. data/include/rbs/util/rbs_unescape.h +2 -1
  127. data/include/rbs.h +8 -0
  128. data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
  129. data/lib/rbs/ast/annotation.rb +1 -1
  130. data/lib/rbs/ast/comment.rb +1 -1
  131. data/lib/rbs/ast/declarations.rb +10 -10
  132. data/lib/rbs/ast/members.rb +14 -14
  133. data/lib/rbs/ast/ruby/annotations.rb +335 -3
  134. data/lib/rbs/ast/ruby/comment_block.rb +30 -4
  135. data/lib/rbs/ast/ruby/declarations.rb +209 -4
  136. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  137. data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
  138. data/lib/rbs/ast/ruby/members.rb +571 -22
  139. data/lib/rbs/ast/type_param.rb +24 -4
  140. data/lib/rbs/buffer.rb +66 -24
  141. data/lib/rbs/cli/diff.rb +16 -15
  142. data/lib/rbs/cli/validate.rb +38 -106
  143. data/lib/rbs/cli.rb +55 -24
  144. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  145. data/lib/rbs/collection/sources/git.rb +7 -0
  146. data/lib/rbs/definition.rb +1 -1
  147. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  148. data/lib/rbs/definition_builder/method_builder.rb +32 -6
  149. data/lib/rbs/definition_builder.rb +147 -25
  150. data/lib/rbs/diff.rb +7 -1
  151. data/lib/rbs/environment.rb +235 -75
  152. data/lib/rbs/environment_loader.rb +0 -6
  153. data/lib/rbs/errors.rb +27 -18
  154. data/lib/rbs/inline_parser.rb +377 -15
  155. data/lib/rbs/location_aux.rb +1 -1
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +47 -11
  159. data/lib/rbs/parser_aux.rb +20 -7
  160. data/lib/rbs/prototype/helpers.rb +57 -0
  161. data/lib/rbs/prototype/rb.rb +3 -28
  162. data/lib/rbs/prototype/rbi.rb +3 -20
  163. data/lib/rbs/prototype/runtime.rb +10 -0
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  166. data/lib/rbs/rewriter.rb +70 -0
  167. data/lib/rbs/subtractor.rb +3 -1
  168. data/lib/rbs/test/type_check.rb +25 -3
  169. data/lib/rbs/type_name.rb +34 -14
  170. data/lib/rbs/types.rb +88 -78
  171. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  172. data/lib/rbs/validator.rb +2 -2
  173. data/lib/rbs/version.rb +1 -1
  174. data/lib/rbs/wasm/deserializer.rb +213 -0
  175. data/lib/rbs/wasm/location.rb +61 -0
  176. data/lib/rbs/wasm/parser.rb +137 -0
  177. data/lib/rbs/wasm/runtime.rb +217 -0
  178. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  179. data/lib/rbs.rb +13 -2
  180. data/lib/rdoc/discover.rb +1 -1
  181. data/lib/rdoc_plugin/parser.rb +1 -1
  182. data/rbs.gemspec +24 -6
  183. data/schema/typeParam.json +17 -1
  184. data/sig/annotate/rdoc_annotater.rbs +12 -9
  185. data/sig/ast/ruby/annotations.rbs +364 -4
  186. data/sig/ast/ruby/comment_block.rbs +8 -0
  187. data/sig/ast/ruby/declarations.rbs +102 -4
  188. data/sig/ast/ruby/members.rbs +128 -2
  189. data/sig/buffer.rbs +19 -1
  190. data/sig/cli/diff.rbs +5 -11
  191. data/sig/cli/validate.rbs +12 -8
  192. data/sig/cli.rbs +18 -18
  193. data/sig/collection/config/lockfile_generator.rbs +2 -0
  194. data/sig/definition.rbs +6 -1
  195. data/sig/definition_builder.rbs +2 -0
  196. data/sig/environment.rbs +70 -12
  197. data/sig/errors.rbs +13 -14
  198. data/sig/inline_parser.rbs +41 -2
  199. data/sig/locator.rbs +0 -2
  200. data/sig/manifest.yaml +0 -2
  201. data/sig/method_builder.rbs +3 -1
  202. data/sig/namespace.rbs +20 -0
  203. data/sig/parser.rbs +41 -13
  204. data/sig/prototype/helpers.rbs +2 -0
  205. data/sig/resolver/type_name_resolver.rbs +36 -10
  206. data/sig/rewriter.rbs +45 -0
  207. data/sig/source.rbs +3 -3
  208. data/sig/type_param.rbs +13 -8
  209. data/sig/typename.rbs +15 -0
  210. data/sig/types.rbs +6 -7
  211. data/sig/unit_test/spy.rbs +0 -8
  212. data/sig/unit_test/type_assertions.rbs +15 -0
  213. data/sig/wasm/deserializer.rbs +66 -0
  214. data/sig/wasm/serialization_schema.rbs +13 -0
  215. data/src/ast.c +443 -162
  216. data/src/lexer.c +1415 -1313
  217. data/src/lexer.re +4 -0
  218. data/src/lexstate.c +63 -37
  219. data/src/location.c +7 -47
  220. data/src/parser.c +1032 -521
  221. data/src/serialize.c +958 -0
  222. data/src/string.c +0 -48
  223. data/src/util/rbs_allocator.c +89 -74
  224. data/src/util/rbs_assert.c +1 -1
  225. data/src/util/rbs_buffer.c +2 -2
  226. data/src/util/rbs_constant_pool.c +10 -14
  227. data/src/util/rbs_encoding.c +4 -8
  228. data/src/util/rbs_unescape.c +56 -20
  229. data/stdlib/abbrev/0/array.rbs +1 -1
  230. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  231. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  232. data/stdlib/cgi/0/core.rbs +9 -393
  233. data/stdlib/cgi/0/manifest.yaml +1 -0
  234. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  235. data/stdlib/coverage/0/coverage.rbs +7 -4
  236. data/stdlib/csv/0/csv.rbs +5 -5
  237. data/stdlib/date/0/date.rbs +92 -79
  238. data/stdlib/date/0/date_time.rbs +25 -24
  239. data/stdlib/delegate/0/delegator.rbs +10 -7
  240. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  241. data/stdlib/digest/0/digest.rbs +111 -1
  242. data/stdlib/erb/0/erb.rbs +748 -347
  243. data/stdlib/etc/0/etc.rbs +73 -54
  244. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  245. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  246. data/stdlib/io-console/0/io-console.rbs +2 -2
  247. data/stdlib/json/0/json.rbs +223 -142
  248. data/stdlib/monitor/0/monitor.rbs +3 -3
  249. data/stdlib/net-http/0/net-http.rbs +162 -134
  250. data/stdlib/objspace/0/objspace.rbs +17 -34
  251. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  252. data/stdlib/open3/0/open3.rbs +469 -10
  253. data/stdlib/openssl/0/openssl.rbs +482 -364
  254. data/stdlib/optparse/0/optparse.rbs +26 -17
  255. data/stdlib/pathname/0/pathname.rbs +11 -1381
  256. data/stdlib/pp/0/pp.rbs +9 -8
  257. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  258. data/stdlib/pstore/0/pstore.rbs +35 -30
  259. data/stdlib/psych/0/psych.rbs +65 -12
  260. data/stdlib/psych/0/store.rbs +2 -4
  261. data/stdlib/pty/0/pty.rbs +9 -6
  262. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  263. data/stdlib/rdoc/0/code_object.rbs +2 -1
  264. data/stdlib/rdoc/0/parser.rbs +1 -1
  265. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  266. data/stdlib/rdoc/0/store.rbs +1 -1
  267. data/stdlib/resolv/0/resolv.rbs +26 -69
  268. data/stdlib/ripper/0/ripper.rbs +22 -19
  269. data/stdlib/securerandom/0/manifest.yaml +2 -0
  270. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  271. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  272. data/stdlib/singleton/0/singleton.rbs +3 -0
  273. data/stdlib/socket/0/addrinfo.rbs +7 -7
  274. data/stdlib/socket/0/basic_socket.rbs +3 -3
  275. data/stdlib/socket/0/ip_socket.rbs +10 -8
  276. data/stdlib/socket/0/socket.rbs +23 -10
  277. data/stdlib/socket/0/tcp_server.rbs +1 -1
  278. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  279. data/stdlib/socket/0/udp_socket.rbs +1 -1
  280. data/stdlib/socket/0/unix_server.rbs +1 -1
  281. data/stdlib/stringio/0/stringio.rbs +1209 -95
  282. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  283. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  284. data/stdlib/time/0/time.rbs +8 -6
  285. data/stdlib/timeout/0/timeout.rbs +63 -7
  286. data/stdlib/tsort/0/cyclic.rbs +4 -1
  287. data/stdlib/tsort/0/interfaces.rbs +8 -8
  288. data/stdlib/tsort/0/tsort.rbs +16 -15
  289. data/stdlib/uri/0/common.rbs +42 -20
  290. data/stdlib/uri/0/file.rbs +3 -3
  291. data/stdlib/uri/0/generic.rbs +26 -18
  292. data/stdlib/uri/0/http.rbs +2 -2
  293. data/stdlib/uri/0/ldap.rbs +2 -2
  294. data/stdlib/uri/0/mailto.rbs +3 -3
  295. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  296. data/stdlib/zlib/0/deflate.rbs +4 -3
  297. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  298. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  299. data/stdlib/zlib/0/inflate.rbs +1 -1
  300. data/stdlib/zlib/0/need_dict.rbs +1 -1
  301. data/stdlib/zlib/0/zstream.rbs +1 -0
  302. data/wasm/README.md +59 -0
  303. data/wasm/rbs_wasm.c +411 -0
  304. metadata +56 -8
  305. data/.vscode/extensions.json +0 -5
  306. data/.vscode/settings.json +0 -19
@@ -0,0 +1,70 @@
1
+ # <!-- rdoc-file=enumerator.c -->
2
+ # Enumerator::ArithmeticSequence is a subclass of Enumerator, that is a
3
+ # representation of sequences of numbers with common difference. Instances of
4
+ # this class can be generated by the Range#step and Numeric#step methods.
5
+ #
6
+ # The class can be used for slicing Array (see Array#slice) or custom
7
+ # collections.
8
+ #
9
+ class Enumerator::ArithmeticSequence < Enumerator[Numeric]
10
+ # <!--
11
+ # rdoc-file=enumerator.c
12
+ # - aseq.begin -> num or nil
13
+ # -->
14
+ # Returns the number that defines the first element of this arithmetic sequence.
15
+ #
16
+ def begin: () -> Numeric?
17
+
18
+ # <!--
19
+ # rdoc-file=enumerator.c
20
+ # - aseq.end -> num or nil
21
+ # -->
22
+ # Returns the number that defines the end of this arithmetic sequence.
23
+ #
24
+ def end: () -> Numeric?
25
+
26
+ # <!--
27
+ # rdoc-file=enumerator.c
28
+ # - aseq.each {|i| block } -> aseq
29
+ # - aseq.each -> aseq
30
+ # -->
31
+ #
32
+ def each: () ?{ (Numeric) -> void } -> self
33
+
34
+ # <!--
35
+ # rdoc-file=enumerator.c
36
+ # - aseq.exclude_end? -> true or false
37
+ # -->
38
+ # Returns `true` if this arithmetic sequence excludes its end value.
39
+ #
40
+ def exclude_end?: () -> bool
41
+
42
+ # <!--
43
+ # rdoc-file=enumerator.c
44
+ # - aseq.last -> num or nil
45
+ # - aseq.last(n) -> an_array
46
+ # -->
47
+ # Returns the last number in this arithmetic sequence, or an array of the last
48
+ # `n` elements.
49
+ #
50
+ def last: () -> Numeric?
51
+ | (Integer n) -> Array[Numeric]
52
+
53
+ # <!--
54
+ # rdoc-file=enumerator.c
55
+ # - aseq.size -> num or nil
56
+ # -->
57
+ # Returns the number of elements in this arithmetic sequence if it is a finite
58
+ # sequence. Otherwise, returns `nil`.
59
+ #
60
+ def size: () -> (Integer | Float)
61
+
62
+ # <!--
63
+ # rdoc-file=enumerator.c
64
+ # - aseq.step -> num
65
+ # -->
66
+ # Returns the number that defines the common difference between two adjacent
67
+ # elements in this arithmetic sequence.
68
+ #
69
+ def step: () -> Numeric
70
+ end
@@ -1,5 +1,5 @@
1
1
  %a{annotate:rdoc:skip}
2
- class Enumerator[unchecked out Elem, out Return = void]
2
+ class Enumerator[unchecked out E, out R = void]
3
3
  # <!-- rdoc-file=enumerator.c -->
4
4
  # Enumerator::Product generates a Cartesian product of any number of enumerable
5
5
  # objects. Iterating over the product of enumerable objects is roughly
@@ -30,7 +30,7 @@ class Enumerator[unchecked out Elem, out Return = void]
30
30
  #
31
31
  # This type of objects can be created by Enumerator.product.
32
32
  #
33
- class Product[unchecked out Elem] < Enumerator[Array[Elem], Product[Elem]]
33
+ class Product[unchecked out E] < Enumerator[Array[E], Product[E]]
34
34
  # <!--
35
35
  # rdoc-file=enumerator.c
36
36
  # - Enumerator::Product.new(*enums) -> enum
@@ -42,7 +42,7 @@ class Enumerator[unchecked out Elem, out Return = void]
42
42
  # e.to_a #=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]
43
43
  # e.size #=> 6
44
44
  #
45
- def initialize: (*_EachEntry[Elem]) -> void
45
+ def initialize: (*_EachEntry[E]) -> void
46
46
 
47
47
  # <!--
48
48
  # rdoc-file=enumerator.c
@@ -55,7 +55,7 @@ class Enumerator[unchecked out Elem, out Return = void]
55
55
  #
56
56
  # If no block is given, returns an enumerator. Otherwise, returns self.
57
57
  #
58
- def each: () { (Array[Elem]) -> void } -> self
58
+ def each: () { (Array[E]) -> void } -> self
59
59
 
60
60
  # <!--
61
61
  # rdoc-file=enumerator.c
@@ -87,6 +87,6 @@ class Enumerator[unchecked out Elem, out Return = void]
87
87
 
88
88
  private
89
89
 
90
- def initialize_copy: (Product[Elem]) -> void
90
+ def initialize_copy: (Product[E]) -> void
91
91
  end
92
92
  end
data/core/enumerator.rbs CHANGED
@@ -125,19 +125,19 @@
125
125
  # puts ext_each(o.to_enum) {|*x| puts x; [:b, *x] }
126
126
  # # => [], [:b], [1], [:b, 1], [1, 2], [:b, 1, 2], 3
127
127
  #
128
- class Enumerator[unchecked out Elem, out Return = void] < Object
129
- include Enumerable[Elem]
128
+ class Enumerator[unchecked out E, out R = void] < Object
129
+ include Enumerable[E]
130
130
 
131
131
  # A convenience interface for `each` with optional block
132
132
  #
133
- interface _Each[out E, out R]
134
- def each: () { (E) -> void } -> R
135
- | () -> Enumerator[E, R]
133
+ interface _Each[out T, out R]
134
+ def each: () { (T) -> void } -> R
135
+ | () -> Enumerator[T, R]
136
136
  end
137
137
 
138
138
  # <!--
139
139
  # rdoc-file=enumerator.c
140
- # - Enumerator.produce(initial = nil) { |prev| block } -> enumerator
140
+ # - Enumerator.produce(initial = nil, size: nil) { |prev| block } -> enumerator
141
141
  # -->
142
142
  # Creates an infinite enumerator from any block, just called over and over. The
143
143
  # result of the previous iteration is passed to the next one. If `initial` is
@@ -169,6 +169,30 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
169
169
  # Enumerator.produce { scanner.scan(PATTERN) }.slice_after { scanner.eos? }.first
170
170
  # # => ["7", "+", "38", "/", "6"]
171
171
  #
172
+ # The optional `size` keyword argument specifies the size of the enumerator,
173
+ # which can be retrieved by Enumerator#size. It can be an integer,
174
+ # <code>Float::INFINITY</code>, a callable object (such as a lambda), or `nil`
175
+ # to indicate unknown size. When not specified, the size defaults to
176
+ # <code>Float::INFINITY</code>.
177
+ #
178
+ # # Infinite enumerator
179
+ # enum = Enumerator.produce(1, size: Float::INFINITY, &:succ)
180
+ # enum.size # => Float::INFINITY
181
+ #
182
+ # # Finite enumerator with known/computable size
183
+ # abs_dir = File.expand_path("./baz") # => "/foo/bar/baz"
184
+ # traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) {
185
+ # raise StopIteration if it == "/"
186
+ # File.dirname(it)
187
+ # }
188
+ # traverser.size # => 4
189
+ #
190
+ # # Finite enumerator with unknown size
191
+ # calendar = Enumerator.produce(Date.today, size: nil) {
192
+ # it.monday? ? raise(StopIteration) : it + 1
193
+ # }
194
+ # calendar.size # => nil
195
+ #
172
196
  def self.produce: [T] () { (T? prev) -> T } -> Enumerator[T, bot]
173
197
  | [T] (T initial) { (T prev) -> T } -> Enumerator[T, bot]
174
198
 
@@ -187,7 +211,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
187
211
  # When a block is given, calls the block with each N-element array generated and
188
212
  # returns `nil`.
189
213
  #
190
- def self.product: [Elem] (*_EachEntry[Elem]) -> Product[Elem]
214
+ def self.product: [E] (*_EachEntry[E]) -> Product[E]
191
215
 
192
216
  # <!--
193
217
  # rdoc-file=enumerator.c
@@ -224,7 +248,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
224
248
  # enum.each(:y, :z).equal?(enum) #=> false
225
249
  # enum.each(:y, :z) { |elm| elm } #=> :method_returned
226
250
  #
227
- def each: () { (Elem arg0) -> untyped } -> Return
251
+ def each: () { (E arg0) -> untyped } -> R
228
252
  | () -> self
229
253
 
230
254
  # <!--
@@ -272,7 +296,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
272
296
  # e.next # (7)
273
297
  # # (10)
274
298
  #
275
- def feed: (Elem arg0) -> NilClass
299
+ def feed: (E arg0) -> NilClass
276
300
 
277
301
  # <!--
278
302
  # rdoc-file=enumerator.c
@@ -282,7 +306,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
282
306
  #
283
307
  # Iteration is defined by the given block, in which a "yielder" object, given as
284
308
  # block parameter, can be used to yield a value by calling the `yield` method
285
- # (aliased as `<<`):
309
+ # (aliased as <code><<</code>):
286
310
  #
287
311
  # fib = Enumerator.new do |y|
288
312
  # a = b = 1
@@ -298,7 +322,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
298
322
  # lazy fashion (see Enumerator#size). It can either be a value or a callable
299
323
  # object.
300
324
  #
301
- def initialize: (?Integer arg0) { (Enumerator::Yielder arg0) -> Return } -> void
325
+ def initialize: (?Integer arg0) { (Enumerator::Yielder arg0) -> R } -> void
302
326
 
303
327
  # <!--
304
328
  # rdoc-file=enumerator.c
@@ -326,7 +350,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
326
350
  #
327
351
  # See class-level notes about external iterators.
328
352
  #
329
- def next: () -> Elem
353
+ def next: () -> E
330
354
 
331
355
  # <!--
332
356
  # rdoc-file=enumerator.c
@@ -370,7 +394,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
370
394
  # # yield nil [nil] nil
371
395
  # # yield [1, 2] [[1, 2]] [1, 2]
372
396
  #
373
- def next_values: () -> ::Array[Elem]
397
+ def next_values: () -> ::Array[E]
374
398
 
375
399
  # <!--
376
400
  # rdoc-file=enumerator.c
@@ -394,7 +418,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
394
418
  # p e.next #=> 3
395
419
  # p e.peek #raises StopIteration
396
420
  #
397
- def peek: () -> Elem
421
+ def peek: () -> E
398
422
 
399
423
  # <!--
400
424
  # rdoc-file=enumerator.c
@@ -424,7 +448,7 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
424
448
  # e.next
425
449
  # p e.peek_values # raises StopIteration
426
450
  #
427
- def peek_values: () -> ::Array[Elem]
451
+ def peek_values: () -> ::Array[E]
428
452
 
429
453
  # <!--
430
454
  # rdoc-file=enumerator.c
@@ -446,8 +470,39 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
446
470
  # loop.size # => Float::INFINITY
447
471
  # (1..100).drop_while.size # => nil
448
472
  #
473
+ # Note that enumerator size might be inaccurate, and should be rather treated as
474
+ # a hint. For example, there is no check that the size provided to ::new is
475
+ # accurate:
476
+ #
477
+ # e = Enumerator.new(5) { |y| 2.times { y << it} }
478
+ # e.size # => 5
479
+ # e.to_a.size # => 2
480
+ #
481
+ # Another example is an enumerator created by ::produce without a `size`
482
+ # argument. Such enumerators return `Infinity` for size, but this is inaccurate
483
+ # if the passed block raises StopIteration:
484
+ #
485
+ # e = Enumerator.produce(1) { it + 1 }
486
+ # e.size # => Infinity
487
+ #
488
+ # e = Enumerator.produce(1) { it > 3 ? raise(StopIteration) : it + 1 }
489
+ # e.size # => Infinity
490
+ # e.to_a.size # => 4
491
+ #
449
492
  def size: () -> (Integer | Float)?
450
493
 
494
+ # <!--
495
+ # rdoc-file=enumerator.c
496
+ # - e + enum -> enumerator
497
+ # -->
498
+ # Returns an enumerator object generated from this enumerator and a given
499
+ # enumerable.
500
+ #
501
+ # e = (1..3).each + [4, 5]
502
+ # e.to_a #=> [1, 2, 3, 4, 5]
503
+ #
504
+ def +: [Elem2] (::_Each[Elem2]) -> ::Enumerator::Chain[E | Elem2]
505
+
451
506
  # <!--
452
507
  # rdoc-file=enumerator.c
453
508
  # - e.with_index(offset = 0) {|(*args), idx| ... }
@@ -460,8 +515,8 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
460
515
  # `offset`
461
516
  # : the starting index to use
462
517
  #
463
- def with_index: (?Integer offset) { (Elem arg0, Integer arg1) -> untyped } -> Return
464
- | (?Integer offset) -> ::Enumerator[[ Elem, Integer ], Return]
518
+ def with_index: (?Integer offset) { (E arg0, Integer arg1) -> untyped } -> R
519
+ | (?Integer offset) -> ::Enumerator[[ E, Integer ], R]
465
520
 
466
521
  # <!-- rdoc-file=enumerator.c -->
467
522
  # Iterates the given block for each element with an arbitrary object, `obj`, and
@@ -486,17 +541,17 @@ class Enumerator[unchecked out Elem, out Return = void] < Object
486
541
  # # => foo: 1
487
542
  # # => foo: 2
488
543
  #
489
- def with_object: [U] (U obj) { (Elem, U obj) -> untyped } -> U
490
- | [U] (U obj) -> ::Enumerator[[ Elem, U ], U]
544
+ def with_object: [U] (U obj) { (E, U obj) -> untyped } -> U
545
+ | [U] (U obj) -> ::Enumerator[[ E, U ], U]
491
546
  end
492
547
 
493
548
  # <!-- rdoc-file=enumerator.c -->
494
549
  # Generator
495
550
  #
496
- class Enumerator::Generator[out Elem] < Object
497
- include Enumerable[Elem]
551
+ class Enumerator::Generator[out E] < Object
552
+ include Enumerable[E]
498
553
 
499
- def each: () { (Elem) -> void } -> void
554
+ def each: () { (E) -> void } -> void
500
555
  end
501
556
 
502
557
  # <!-- rdoc-file=enumerator.c -->
@@ -565,7 +620,7 @@ end
565
620
  # # This returns an array of items like a normal enumerator does.
566
621
  # all_checked = active_items.select(&:checked)
567
622
  #
568
- class Enumerator::Lazy[out Elem, out Return = void] < Enumerator[Elem, Return]
623
+ class Enumerator::Lazy[out E, out R = void] < Enumerator[E, R]
569
624
  # <!-- rdoc-file=enumerator.c -->
570
625
  # Expands `lazy` enumerator to an array. See Enumerable#to_a.
571
626
  #
@@ -577,7 +632,15 @@ class Enumerator::Lazy[out Elem, out Return = void] < Enumerator[Elem, Return]
577
632
  # -->
578
633
  # Like Enumerable#compact, but chains operation to be lazy-evaluated.
579
634
  #
580
- def compact: () -> Enumerator::Lazy[Elem, Return]
635
+ def compact: () -> Enumerator::Lazy[E, R]
636
+
637
+ # <!--
638
+ # rdoc-file=enumerator.c
639
+ # - lzy.eager -> enum
640
+ # -->
641
+ # Returns a non-lazy Enumerator converted from the lazy enumerator.
642
+ #
643
+ def eager: () -> ::Enumerator[E, R]
581
644
  end
582
645
 
583
646
  # <!-- rdoc-file=enumerator.c -->
@@ -612,7 +675,7 @@ end
612
675
  #
613
676
  # This type of objects can be created by Enumerable#chain and Enumerator#+.
614
677
  #
615
- class Enumerator::Chain[out Elem] < Enumerator[Elem, void]
678
+ class Enumerator::Chain[out E] < Enumerator[E, void]
616
679
  # <!--
617
680
  # rdoc-file=enumerator.c
618
681
  # - Enumerator::Chain.new(*enums) -> enum
@@ -624,7 +687,7 @@ class Enumerator::Chain[out Elem] < Enumerator[Elem, void]
624
687
  # e.to_a #=> [1, 2, 3, 4, 5]
625
688
  # e.size #=> 5
626
689
  #
627
- def initialize: (*_Each[Elem] enums) -> void
690
+ def initialize: (*_Each[E] enums) -> void
628
691
 
629
692
  # <!--
630
693
  # rdoc-file=enumerator.c
@@ -637,6 +700,6 @@ class Enumerator::Chain[out Elem] < Enumerator[Elem, void]
637
700
  #
638
701
  # If no block is given, returns an enumerator.
639
702
  #
640
- def each: () { (Elem) -> void } -> self
641
- | () -> Enumerator[Elem, self]
703
+ def each: () { (E) -> void } -> self
704
+ | () -> Enumerator[E, self]
642
705
  end
data/core/errno.rbs CHANGED
@@ -9,7 +9,7 @@
9
9
  #
10
10
  # When the Ruby interpreter interacts with the operating system and receives
11
11
  # such an error code (e.g., `2`), it maps the code to a particular Ruby
12
- # exception class (e.g., `Errno::ENOENT`):
12
+ # exception class (e.g., <code>Errno::ENOENT</code>):
13
13
  #
14
14
  # File.open('nosuch.txt')
15
15
  # # => No such file or directory @ rb_sysopen - nosuch.txt (Errno::ENOENT)
@@ -25,7 +25,8 @@
25
25
  # Errno::ENOENT.superclass # => SystemCallError
26
26
  # Errno::ENOENT::Errno # => 2
27
27
  #
28
- # The names of nested classes are returned by method `Errno.constants`:
28
+ # The names of nested classes are returned by method
29
+ # <code>Errno.constants</code>:
29
30
  #
30
31
  # Errno.constants.size # => 158
31
32
  # Errno.constants.sort.take(5) # => [:E2BIG, :EACCES, :EADDRINUSE, :EADDRNOTAVAIL, :EADV]
@@ -38,6 +39,14 @@
38
39
  # Errno::ENOENT::Errno # => 2
39
40
  # Errno::ENOTCAPABLE::Errno # => 0
40
41
  #
42
+ # Each class in Errno can be created with optional messages:
43
+ #
44
+ # Errno::EPIPE.new # => #<Errno::EPIPE: Broken pipe>
45
+ # Errno::EPIPE.new("foo") # => #<Errno::EPIPE: Broken pipe - foo>
46
+ # Errno::EPIPE.new("foo", "here") # => #<Errno::EPIPE: Broken pipe @ here - foo>
47
+ #
48
+ # See SystemCallError.new.
49
+ #
41
50
  module Errno
42
51
  class NOERROR < SystemCallError
43
52
  Errno: 0
data/core/errors.rbs CHANGED
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # [1, 2, 3].first(4, 5)
8
8
  #
9
- # *raises the exception:*
9
+ # <em>raises the exception:</em>
10
10
  #
11
11
  # ArgumentError: wrong number of arguments (given 2, expected 1)
12
12
  #
@@ -14,7 +14,7 @@
14
14
  #
15
15
  # [1, 2, 3].first(-4)
16
16
  #
17
- # *raises the exception:*
17
+ # <em>raises the exception:</em>
18
18
  #
19
19
  # ArgumentError: negative array size
20
20
  #
@@ -66,7 +66,7 @@ end
66
66
  #
67
67
  # [1, 2, 3].freeze << 4
68
68
  #
69
- # *raises the exception:*
69
+ # <em>raises the exception:</em>
70
70
  #
71
71
  # FrozenError: can't modify frozen Array
72
72
  #
@@ -115,11 +115,11 @@ end
115
115
  # puts "Note: You will typically use Signal.trap instead."
116
116
  # end
117
117
  #
118
- # *produces:*
118
+ # <em>produces:</em>
119
119
  #
120
120
  # Press ctrl-C when you get bored
121
121
  #
122
- # *then waits until it is interrupted with Control-C and then prints:*
122
+ # <em>then waits until it is interrupted with Control-C and then prints:</em>
123
123
  #
124
124
  # Note: You will typically use Signal.trap instead.
125
125
  #
@@ -184,7 +184,7 @@ end
184
184
  #
185
185
  # require 'this/file/does/not/exist'
186
186
  #
187
- # *raises the exception:*
187
+ # <em>raises the exception:</em>
188
188
  #
189
189
  # LoadError: no such file to load -- this/file/does/not/exist
190
190
  #
@@ -209,7 +209,7 @@ end
209
209
  # end
210
210
  # call_block
211
211
  #
212
- # *raises the exception:*
212
+ # <em>raises the exception:</em>
213
213
  #
214
214
  # LocalJumpError: no block given (yield)
215
215
  #
@@ -220,7 +220,7 @@ end
220
220
  # end
221
221
  # get_me_a_return.call
222
222
  #
223
- # *raises the exception:*
223
+ # <em>raises the exception:</em>
224
224
  #
225
225
  # LocalJumpError: unexpected return
226
226
  #
@@ -248,7 +248,7 @@ end
248
248
  #
249
249
  # puts foo
250
250
  #
251
- # *raises the exception:*
251
+ # <em>raises the exception:</em>
252
252
  #
253
253
  # NameError: undefined local variable or method `foo' for main:Object
254
254
  #
@@ -256,7 +256,7 @@ end
256
256
  #
257
257
  # Integer.const_set :answer, 42
258
258
  #
259
- # *raises the exception:*
259
+ # <em>raises the exception:</em>
260
260
  #
261
261
  # NameError: wrong constant name answer
262
262
  #
@@ -302,9 +302,15 @@ class NameError[T] < StandardError
302
302
  def receiver: () -> T?
303
303
  end
304
304
 
305
+ # <!-- rdoc-file=error.c -->
306
+ # Raised when matching pattern not found.
307
+ #
305
308
  class NoMatchingPatternError < StandardError
306
309
  end
307
310
 
311
+ # <!-- rdoc-file=error.c -->
312
+ # Raised when matching key not found.
313
+ #
308
314
  class NoMatchingPatternKeyError[M, K] < NoMatchingPatternError
309
315
  # <!--
310
316
  # rdoc-file=error.c
@@ -344,7 +350,7 @@ end
344
350
  #
345
351
  # "hello".to_ary
346
352
  #
347
- # *raises the exception:*
353
+ # <em>raises the exception:</em>
348
354
  #
349
355
  # NoMethodError: undefined method `to_ary' for an instance of String
350
356
  #
@@ -354,11 +360,13 @@ class NoMethodError[T] < NameError[T]
354
360
  # - NoMethodError.new(msg=nil, name=nil, args=nil, private=false, receiver: nil) -> no_method_error
355
361
  # -->
356
362
  # Construct a NoMethodError exception for a method of the given name called with
357
- # the given arguments. The name may be accessed using the `#name` method on the
358
- # resulting object, and the arguments using the `#args` method.
363
+ # the given arguments. The name may be accessed using the <code>#name</code>
364
+ # method on the resulting object, and the arguments using the <code>#args</code>
365
+ # method.
359
366
  #
360
367
  # If *private* argument were passed, it designates method was attempted to call
361
- # in private context, and can be accessed with `#private_call?` method.
368
+ # in private context, and can be accessed with <code>#private_call?</code>
369
+ # method.
362
370
  #
363
371
  # *receiver* argument stores an object whose method was called.
364
372
  #
@@ -387,8 +395,8 @@ end
387
395
  # exception if the underlying operating system or Ruby runtime does not support
388
396
  # them.
389
397
  #
390
- # Note that if `fork` raises a `NotImplementedError`, then `respond_to?(:fork)`
391
- # returns `false`.
398
+ # Note that if `fork` raises a `NotImplementedError`, then
399
+ # <code>respond_to?(:fork)</code> returns `false`.
392
400
  #
393
401
  class NotImplementedError < ScriptError
394
402
  end
@@ -398,7 +406,7 @@ end
398
406
  #
399
407
  # [1, 2, 3].drop(1 << 100)
400
408
  #
401
- # *raises the exception:*
409
+ # <em>raises the exception:</em>
402
410
  #
403
411
  # RangeError: bignum too big to convert into `long'
404
412
  #
@@ -410,7 +418,7 @@ end
410
418
  #
411
419
  # Regexp.new("?")
412
420
  #
413
- # *raises the exception:*
421
+ # <em>raises the exception:</em>
414
422
  #
415
423
  # RegexpError: target of repeat operator is not specified: /?/
416
424
  #
@@ -423,7 +431,7 @@ end
423
431
  #
424
432
  # raise "ouch"
425
433
  #
426
- # *raises the exception:*
434
+ # <em>raises the exception:</em>
427
435
  #
428
436
  # RuntimeError: ouch
429
437
  #
@@ -455,7 +463,7 @@ end
455
463
  # puts "received Exception #{e}"
456
464
  # end
457
465
  #
458
- # *produces:*
466
+ # <em>produces:</em>
459
467
  #
460
468
  # received Exception SIGHUP
461
469
  #
@@ -496,7 +504,7 @@ end
496
504
  #
497
505
  # require 'does/not/exist' rescue "Hi"
498
506
  #
499
- # *raises the exception:*
507
+ # <em>raises the exception:</em>
500
508
  #
501
509
  # LoadError: no such file to load -- does/not/exist
502
510
  #
@@ -514,7 +522,7 @@ end
514
522
  # end
515
523
  # puts "Done!"
516
524
  #
517
- # *produces:*
525
+ # <em>produces:</em>
518
526
  #
519
527
  # Hello
520
528
  # Done!
@@ -554,7 +562,7 @@ end
554
562
  #
555
563
  # eval("1+1=2")
556
564
  #
557
- # *raises the exception:*
565
+ # <em>raises the exception:</em>
558
566
  #
559
567
  # SyntaxError: (eval):1: syntax error, unexpected '=', expecting $end
560
568
  #
@@ -581,20 +589,41 @@ end
581
589
  #
582
590
  # File.open("does/not/exist")
583
591
  #
584
- # *raises the exception:*
592
+ # <em>raises the exception:</em>
585
593
  #
586
594
  # Errno::ENOENT: No such file or directory - does/not/exist
587
595
  #
588
596
  class SystemCallError < StandardError
589
597
  # <!--
590
598
  # rdoc-file=error.c
591
- # - SystemCallError.new(msg, errno) -> system_call_error_subclass
599
+ # - SystemCallError.new(msg, errno = nil, func = nil) -> system_call_error_subclass
592
600
  # -->
593
601
  # If *errno* corresponds to a known system error code, constructs the
594
602
  # appropriate Errno class for that error, otherwise constructs a generic
595
603
  # SystemCallError object. The error number is subsequently available via the
596
604
  # #errno method.
597
605
  #
606
+ # If only numeric object is given, it is treated as an Integer *errno*, and
607
+ # *msg* is omitted, otherwise the first argument *msg* is used as the additional
608
+ # error message.
609
+ #
610
+ # SystemCallError.new(Errno::EPIPE::Errno)
611
+ # #=> #<Errno::EPIPE: Broken pipe>
612
+ #
613
+ # SystemCallError.new("foo")
614
+ # #=> #<SystemCallError: unknown error - foo>
615
+ #
616
+ # SystemCallError.new("foo", Errno::EPIPE::Errno)
617
+ # #=> #<Errno::EPIPE: Broken pipe - foo>
618
+ #
619
+ # If *func* is not `nil`, it is appended to the message with "<code> @ </code>".
620
+ #
621
+ # SystemCallError.new("foo", Errno::EPIPE::Errno, "here")
622
+ # #=> #<Errno::EPIPE: Broken pipe @ here - foo>
623
+ #
624
+ # A subclass of SystemCallError can also be instantiated via the `new` method of
625
+ # the subclass. See Errno.
626
+ #
598
627
  def initialize: (string msg, Integer errno) -> void
599
628
 
600
629
  # <!--
@@ -658,7 +687,7 @@ end
658
687
  # end
659
688
  # me_myself_and_i
660
689
  #
661
- # *raises the exception:*
690
+ # <em>raises the exception:</em>
662
691
  #
663
692
  # SystemStackError: stack level too deep
664
693
  #
@@ -685,7 +714,7 @@ end
685
714
  #
686
715
  # [1, 2, 3].first("two")
687
716
  #
688
- # *raises the exception:*
717
+ # <em>raises the exception:</em>
689
718
  #
690
719
  # TypeError: no implicit conversion of String into Integer
691
720
  #
@@ -698,7 +727,7 @@ end
698
727
  #
699
728
  # throw "foo", "bar"
700
729
  #
701
- # *raises the exception:*
730
+ # <em>raises the exception:</em>
702
731
  #
703
732
  # UncaughtThrowError: uncaught throw "foo"
704
733
  #
@@ -714,7 +743,7 @@ class UncaughtThrowError < ArgumentError
714
743
  #
715
744
  # throw "foo", "bar"
716
745
  #
717
- # *raises the exception:*
746
+ # <em>raises the exception:</em>
718
747
  #
719
748
  # UncaughtThrowError: uncaught throw "foo"
720
749
  #