rbs 3.9.4 → 4.2.0

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 (354) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.dockerignore +37 -0
  5. data/.gitattributes +1 -0
  6. data/.github/dependabot.yml +16 -14
  7. data/.github/workflows/bundle-update.yml +63 -0
  8. data/.github/workflows/c-check.yml +66 -0
  9. data/.github/workflows/changelog.yml +121 -0
  10. data/.github/workflows/comments.yml +6 -4
  11. data/.github/workflows/dependabot.yml +2 -2
  12. data/.github/workflows/jruby.yml +74 -0
  13. data/.github/workflows/release-gems.yml +234 -0
  14. data/.github/workflows/ruby.yml +86 -32
  15. data/.github/workflows/rust.yml +186 -0
  16. data/.github/workflows/truffleruby.yml +54 -0
  17. data/.github/workflows/typecheck.yml +6 -3
  18. data/.github/workflows/wasm.yml +55 -0
  19. data/.github/workflows/windows.yml +10 -4
  20. data/.gitignore +16 -0
  21. data/.rubocop.yml +1 -2
  22. data/CHANGELOG.md +502 -0
  23. data/Dockerfile.jruby +53 -0
  24. data/README.md +42 -5
  25. data/Rakefile +892 -111
  26. data/Steepfile +11 -0
  27. data/config.yml +665 -62
  28. data/core/array.rbs +541 -398
  29. data/core/basic_object.rbs +9 -8
  30. data/core/binding.rbs +0 -2
  31. data/core/builtin.rbs +9 -8
  32. data/core/class.rbs +11 -8
  33. data/core/comparable.rbs +55 -34
  34. data/core/complex.rbs +104 -78
  35. data/core/dir.rbs +61 -49
  36. data/core/encoding.rbs +12 -15
  37. data/core/enumerable.rbs +297 -196
  38. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  39. data/core/enumerator/product.rbs +5 -5
  40. data/core/enumerator.rbs +91 -28
  41. data/core/errno.rbs +11 -2
  42. data/core/errors.rbs +58 -29
  43. data/core/exception.rbs +13 -13
  44. data/core/fiber.rbs +74 -54
  45. data/core/file.rbs +260 -1151
  46. data/core/file_constants.rbs +463 -0
  47. data/core/file_stat.rbs +534 -0
  48. data/core/file_test.rbs +3 -3
  49. data/core/float.rbs +257 -116
  50. data/core/gc.rbs +425 -281
  51. data/core/hash.rbs +1151 -829
  52. data/core/integer.rbs +156 -195
  53. data/core/io/buffer.rbs +53 -42
  54. data/core/io/wait.rbs +13 -35
  55. data/core/io.rbs +222 -155
  56. data/core/kernel.rbs +239 -163
  57. data/core/marshal.rbs +4 -4
  58. data/core/match_data.rbs +16 -14
  59. data/core/math.rbs +107 -66
  60. data/core/method.rbs +69 -33
  61. data/core/module.rbs +302 -150
  62. data/core/nil_class.rbs +7 -6
  63. data/core/numeric.rbs +77 -63
  64. data/core/object.rbs +9 -11
  65. data/core/object_space/weak_key_map.rbs +7 -7
  66. data/core/object_space.rbs +30 -23
  67. data/core/pathname.rbs +1312 -0
  68. data/core/proc.rbs +95 -58
  69. data/core/process.rbs +222 -202
  70. data/core/ractor.rbs +364 -518
  71. data/core/random.rbs +21 -3
  72. data/core/range.rbs +181 -79
  73. data/core/rational.rbs +60 -89
  74. data/core/rbs/ops.rbs +154 -0
  75. data/core/rbs/unnamed/argf.rbs +63 -56
  76. data/core/rbs/unnamed/env_class.rbs +19 -14
  77. data/core/rbs/unnamed/main_class.rbs +123 -0
  78. data/core/rbs/unnamed/random.rbs +11 -118
  79. data/core/regexp.rbs +258 -214
  80. data/core/ruby.rbs +53 -0
  81. data/core/ruby_vm.rbs +78 -34
  82. data/core/rubygems/config_file.rbs +5 -5
  83. data/core/rubygems/errors.rbs +6 -70
  84. data/core/rubygems/requirement.rbs +5 -15
  85. data/core/rubygems/rubygems.rbs +18 -81
  86. data/core/rubygems/specification.rbs +8 -0
  87. data/core/rubygems/version.rbs +2 -163
  88. data/core/set.rbs +493 -363
  89. data/core/signal.rbs +26 -16
  90. data/core/string.rbs +3234 -1285
  91. data/core/struct.rbs +43 -42
  92. data/core/symbol.rbs +41 -34
  93. data/core/thread.rbs +139 -83
  94. data/core/time.rbs +81 -50
  95. data/core/trace_point.rbs +41 -35
  96. data/core/true_class.rbs +2 -2
  97. data/core/unbound_method.rbs +24 -16
  98. data/core/warning.rbs +7 -7
  99. data/docs/CONTRIBUTING.md +3 -2
  100. data/docs/aliases.md +79 -0
  101. data/docs/collection.md +3 -3
  102. data/docs/config.md +171 -0
  103. data/docs/encoding.md +56 -0
  104. data/docs/gem.md +0 -1
  105. data/docs/inline.md +634 -0
  106. data/docs/rbs_by_example.md +20 -20
  107. data/docs/release.md +303 -0
  108. data/docs/rust.md +96 -0
  109. data/docs/sigs.md +3 -3
  110. data/docs/stdlib.md +8 -0
  111. data/docs/syntax.md +60 -18
  112. data/docs/type_fingerprint.md +21 -0
  113. data/docs/wasm_serialization.md +80 -0
  114. data/exe/rbs +1 -1
  115. data/ext/rbs_extension/ast_translation.c +1870 -0
  116. data/ext/rbs_extension/ast_translation.h +41 -0
  117. data/ext/rbs_extension/class_constants.c +189 -0
  118. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +24 -1
  119. data/ext/rbs_extension/compat.h +10 -0
  120. data/ext/rbs_extension/extconf.rb +26 -1
  121. data/ext/rbs_extension/legacy_location.c +299 -0
  122. data/ext/rbs_extension/legacy_location.h +82 -0
  123. data/ext/rbs_extension/main.c +639 -23
  124. data/ext/rbs_extension/rbs_extension.h +6 -21
  125. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  126. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  127. data/include/rbs/ast.h +1055 -0
  128. data/include/rbs/defines.h +104 -0
  129. data/include/rbs/lexer.h +208 -0
  130. data/include/rbs/location.h +40 -0
  131. data/include/rbs/parser.h +187 -0
  132. data/include/rbs/serialize.h +39 -0
  133. data/include/rbs/string.h +47 -0
  134. data/include/rbs/util/rbs_allocator.h +59 -0
  135. data/include/rbs/util/rbs_assert.h +20 -0
  136. data/include/rbs/util/rbs_buffer.h +83 -0
  137. data/include/rbs/util/rbs_constant_pool.h +6 -70
  138. data/include/rbs/util/rbs_encoding.h +282 -0
  139. data/include/rbs/util/rbs_unescape.h +24 -0
  140. data/include/rbs.h +9 -2
  141. data/lib/rbs/annotate/formatter.rb +3 -13
  142. data/lib/rbs/annotate/rdoc_annotator.rb +30 -32
  143. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  144. data/lib/rbs/ast/annotation.rb +1 -1
  145. data/lib/rbs/ast/comment.rb +1 -1
  146. data/lib/rbs/ast/declarations.rb +11 -11
  147. data/lib/rbs/ast/members.rb +14 -14
  148. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  149. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  150. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  151. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  152. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  153. data/lib/rbs/ast/ruby/members.rb +762 -0
  154. data/lib/rbs/ast/type_param.rb +25 -5
  155. data/lib/rbs/buffer.rb +142 -20
  156. data/lib/rbs/cli/diff.rb +16 -15
  157. data/lib/rbs/cli/validate.rb +63 -126
  158. data/lib/rbs/cli.rb +59 -29
  159. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  160. data/lib/rbs/collection/sources/git.rb +7 -0
  161. data/lib/rbs/definition.rb +6 -1
  162. data/lib/rbs/definition_builder/ancestor_builder.rb +129 -70
  163. data/lib/rbs/definition_builder/method_builder.rb +74 -33
  164. data/lib/rbs/definition_builder.rb +181 -21
  165. data/lib/rbs/diff.rb +7 -1
  166. data/lib/rbs/environment/class_entry.rb +81 -0
  167. data/lib/rbs/environment/module_entry.rb +91 -0
  168. data/lib/rbs/environment.rb +410 -215
  169. data/lib/rbs/environment_loader.rb +2 -8
  170. data/lib/rbs/errors.rb +31 -21
  171. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  172. data/lib/rbs/inline_parser.rb +568 -0
  173. data/lib/rbs/location_aux.rb +36 -4
  174. data/lib/rbs/locator.rb +5 -1
  175. data/lib/rbs/method_type.rb +5 -3
  176. data/lib/rbs/namespace.rb +47 -18
  177. data/lib/rbs/parser_aux.rb +37 -7
  178. data/lib/rbs/prototype/helpers.rb +24 -0
  179. data/lib/rbs/prototype/rb.rb +3 -28
  180. data/lib/rbs/prototype/rbi.rb +196 -45
  181. data/lib/rbs/prototype/runtime/value_object_generator.rb +0 -1
  182. data/lib/rbs/prototype/runtime.rb +13 -3
  183. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  184. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  185. data/lib/rbs/rewriter.rb +70 -0
  186. data/lib/rbs/source.rb +99 -0
  187. data/lib/rbs/subtractor.rb +7 -4
  188. data/lib/rbs/test/type_check.rb +25 -3
  189. data/lib/rbs/type_name.rb +34 -21
  190. data/lib/rbs/types.rb +135 -81
  191. data/lib/rbs/unit_test/convertibles.rb +1 -0
  192. data/lib/rbs/unit_test/type_assertions.rb +47 -11
  193. data/lib/rbs/validator.rb +2 -2
  194. data/lib/rbs/version.rb +1 -1
  195. data/lib/rbs/wasm/deserializer.rb +213 -0
  196. data/lib/rbs/wasm/location.rb +61 -0
  197. data/lib/rbs/wasm/parser.rb +174 -0
  198. data/lib/rbs/wasm/runtime.rb +211 -0
  199. data/lib/rbs/wasm/serialization_schema.rb +111 -0
  200. data/lib/rbs.rb +25 -2
  201. data/lib/rbs_jars.rb +39 -0
  202. data/lib/rdoc/discover.rb +1 -1
  203. data/lib/rdoc_plugin/parser.rb +8 -3
  204. data/rbs.gemspec +34 -6
  205. data/schema/function.json +12 -1
  206. data/schema/typeParam.json +17 -1
  207. data/sig/ancestor_builder.rbs +1 -1
  208. data/sig/annotate/formatter.rbs +2 -2
  209. data/sig/annotate/rdoc_annotater.rbs +13 -10
  210. data/sig/ast/ruby/annotations.rbs +470 -0
  211. data/sig/ast/ruby/comment_block.rbs +127 -0
  212. data/sig/ast/ruby/declarations.rbs +158 -0
  213. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  214. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  215. data/sig/ast/ruby/members.rbs +198 -0
  216. data/sig/buffer.rbs +81 -5
  217. data/sig/cli/diff.rbs +5 -11
  218. data/sig/cli/validate.rbs +12 -8
  219. data/sig/cli.rbs +18 -18
  220. data/sig/collection/config/lockfile_generator.rbs +2 -0
  221. data/sig/definition.rbs +6 -0
  222. data/sig/definition_builder.rbs +3 -1
  223. data/sig/environment/class_entry.rbs +56 -0
  224. data/sig/environment/module_entry.rbs +65 -0
  225. data/sig/environment.rbs +94 -87
  226. data/sig/errors.rbs +26 -20
  227. data/sig/inline_parser/comment_association.rbs +71 -0
  228. data/sig/inline_parser.rbs +126 -0
  229. data/sig/location.rbs +32 -7
  230. data/sig/locator.rbs +0 -2
  231. data/sig/manifest.yaml +0 -2
  232. data/sig/method_builder.rbs +9 -4
  233. data/sig/namespace.rbs +20 -5
  234. data/sig/parser.rbs +79 -15
  235. data/sig/prototype/helpers.rbs +2 -0
  236. data/sig/prototype/rbi.rbs +33 -4
  237. data/sig/resolver/type_name_resolver.rbs +36 -10
  238. data/sig/rewriter.rbs +45 -0
  239. data/sig/source.rbs +48 -0
  240. data/sig/type_param.rbs +13 -8
  241. data/sig/typename.rbs +15 -5
  242. data/sig/types.rbs +21 -9
  243. data/sig/unit_test/spy.rbs +0 -8
  244. data/sig/unit_test/type_assertions.rbs +17 -2
  245. data/sig/wasm/deserializer.rbs +66 -0
  246. data/sig/wasm/serialization_schema.rbs +13 -0
  247. data/src/ast.c +1644 -0
  248. data/src/lexer.c +3223 -0
  249. data/src/lexer.re +187 -0
  250. data/src/lexstate.c +222 -0
  251. data/src/location.c +31 -0
  252. data/src/parser.c +4318 -0
  253. data/src/serialize.c +965 -0
  254. data/src/string.c +41 -0
  255. data/src/util/rbs_allocator.c +171 -0
  256. data/src/util/rbs_assert.c +19 -0
  257. data/src/util/rbs_buffer.c +54 -0
  258. data/src/util/rbs_constant_pool.c +18 -92
  259. data/src/util/rbs_encoding.c +21454 -0
  260. data/src/util/rbs_unescape.c +167 -0
  261. data/stdlib/abbrev/0/array.rbs +1 -1
  262. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  263. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  264. data/stdlib/cgi/0/core.rbs +9 -393
  265. data/stdlib/cgi/0/manifest.yaml +1 -0
  266. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  267. data/stdlib/coverage/0/coverage.rbs +7 -4
  268. data/stdlib/csv/0/csv.rbs +5 -5
  269. data/stdlib/date/0/date.rbs +92 -79
  270. data/stdlib/date/0/date_time.rbs +25 -24
  271. data/stdlib/delegate/0/delegator.rbs +11 -7
  272. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  273. data/stdlib/digest/0/digest.rbs +117 -1
  274. data/stdlib/erb/0/erb.rbs +754 -353
  275. data/stdlib/etc/0/etc.rbs +73 -54
  276. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  277. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  278. data/stdlib/io-console/0/io-console.rbs +2 -2
  279. data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
  280. data/stdlib/json/0/json.rbs +232 -185
  281. data/stdlib/monitor/0/monitor.rbs +9 -9
  282. data/stdlib/net-http/0/net-http.rbs +162 -134
  283. data/stdlib/objspace/0/objspace.rbs +17 -34
  284. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  285. data/stdlib/open3/0/open3.rbs +469 -10
  286. data/stdlib/openssl/0/openssl.rbs +521 -397
  287. data/stdlib/optparse/0/optparse.rbs +26 -17
  288. data/stdlib/pathname/0/pathname.rbs +11 -1381
  289. data/stdlib/pp/0/pp.rbs +9 -8
  290. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  291. data/stdlib/pstore/0/pstore.rbs +35 -30
  292. data/stdlib/psych/0/psych.rbs +65 -12
  293. data/stdlib/psych/0/store.rbs +2 -4
  294. data/stdlib/pty/0/pty.rbs +9 -6
  295. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  296. data/stdlib/rdoc/0/code_object.rbs +4 -3
  297. data/stdlib/rdoc/0/comment.rbs +2 -0
  298. data/stdlib/rdoc/0/options.rbs +76 -0
  299. data/stdlib/rdoc/0/parser.rbs +1 -1
  300. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  301. data/stdlib/rdoc/0/store.rbs +2 -2
  302. data/stdlib/resolv/0/resolv.rbs +26 -69
  303. data/stdlib/ripper/0/ripper.rbs +25 -19
  304. data/stdlib/securerandom/0/manifest.yaml +2 -0
  305. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  306. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  307. data/stdlib/singleton/0/singleton.rbs +6 -0
  308. data/stdlib/socket/0/addrinfo.rbs +9 -9
  309. data/stdlib/socket/0/basic_socket.rbs +3 -3
  310. data/stdlib/socket/0/ip_socket.rbs +10 -8
  311. data/stdlib/socket/0/socket.rbs +23 -10
  312. data/stdlib/socket/0/tcp_server.rbs +1 -1
  313. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  314. data/stdlib/socket/0/udp_socket.rbs +1 -1
  315. data/stdlib/socket/0/unix_server.rbs +1 -1
  316. data/stdlib/stringio/0/stringio.rbs +1211 -96
  317. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  318. data/stdlib/tempfile/0/manifest.yaml +3 -0
  319. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  320. data/stdlib/time/0/time.rbs +8 -6
  321. data/stdlib/timeout/0/timeout.rbs +58 -7
  322. data/stdlib/tsort/0/cyclic.rbs +4 -1
  323. data/stdlib/tsort/0/interfaces.rbs +8 -8
  324. data/stdlib/tsort/0/tsort.rbs +16 -15
  325. data/stdlib/uri/0/common.rbs +42 -20
  326. data/stdlib/uri/0/file.rbs +3 -3
  327. data/stdlib/uri/0/generic.rbs +21 -18
  328. data/stdlib/uri/0/http.rbs +2 -2
  329. data/stdlib/uri/0/ldap.rbs +2 -2
  330. data/stdlib/uri/0/mailto.rbs +3 -3
  331. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  332. data/stdlib/zlib/0/deflate.rbs +4 -3
  333. data/stdlib/zlib/0/gzip_file.rbs +1 -1
  334. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  335. data/stdlib/zlib/0/gzip_writer.rbs +16 -13
  336. data/stdlib/zlib/0/inflate.rbs +1 -1
  337. data/stdlib/zlib/0/need_dict.rbs +1 -1
  338. data/wasm/README.md +109 -0
  339. data/wasm/rbs_wasm.c +479 -0
  340. metadata +133 -19
  341. data/ext/rbs_extension/lexer.c +0 -2728
  342. data/ext/rbs_extension/lexer.h +0 -179
  343. data/ext/rbs_extension/lexer.re +0 -147
  344. data/ext/rbs_extension/lexstate.c +0 -175
  345. data/ext/rbs_extension/location.c +0 -325
  346. data/ext/rbs_extension/location.h +0 -85
  347. data/ext/rbs_extension/parser.c +0 -2982
  348. data/ext/rbs_extension/parser.h +0 -18
  349. data/ext/rbs_extension/parserstate.c +0 -411
  350. data/ext/rbs_extension/parserstate.h +0 -163
  351. data/ext/rbs_extension/unescape.c +0 -32
  352. data/include/rbs/ruby_objs.h +0 -72
  353. data/src/constants.c +0 -153
  354. data/src/ruby_objs.c +0 -799
data/docs/CONTRIBUTING.md CHANGED
@@ -12,7 +12,8 @@
12
12
  The RBS repository contains the type definitions of Core API and Standard Libraries.
13
13
  There are some discussions whether if it is the best to have them in this repository, but we have them and continue updating the files meanwhile.
14
14
 
15
- The target version of the bundled type definitions is the latest _release_ of Ruby -- `3.1` as of January 2022.
15
+ The target version of the bundled type definitions is the [latest _release_ of Ruby](https://www.ruby-lang.org/en/downloads/branches/) -- `4.0` as of 2026.
16
+ Note, however, that the CI runs the tests on every non-EOL Ruby -- `3.3` and later as of 2026.
16
17
 
17
18
  **The core API** type definitions are in `core` directory.
18
19
  You will find the familiar class names in the directory, like `string.rbs` or `array.rbs`.
@@ -32,7 +33,7 @@ You will typically follow the steps as follows:
32
33
 
33
34
  1. Run `rbs prototype runtime` to generate list of methods.
34
35
  2. Run `rbs annotate` to import RDoc comments.
35
- 3. Run `rake generate:stdlib_test[LIB]` to generate a test case.
36
+ 3. Run `rake generate:stdlib_test[CLASS,PATH,...]` to generate a test case. Pass the paths to the standard library signatures and their dependencies when needed.
36
37
  4. Write the type definitions and tests.
37
38
 
38
39
  See the next *Useful Tools* section and the guides above for writing and testing RBS files.
data/docs/aliases.md ADDED
@@ -0,0 +1,79 @@
1
+ # Aliases
2
+
3
+ This document explains module/class aliases and type aliases.
4
+
5
+ ## Module/class alias
6
+
7
+ Module/class aliases give another name to a module/class.
8
+ This is useful for some syntaxes that has lexical constraints.
9
+
10
+ ```rbs
11
+ class C
12
+ end
13
+
14
+ class D = C # ::D is an alias for ::C
15
+
16
+ class E < D # ::E inherits from ::D, which is actually ::C
17
+ end
18
+ ```
19
+
20
+ Note that module/class aliases cannot be recursive.
21
+
22
+ So, we can define a *normalization* of aliased module/class names.
23
+ Normalization follows the chain of alias definitions and resolves them to the original module/class defined with `module`/`class` syntax.
24
+
25
+ ```rbs
26
+ class C
27
+ end
28
+
29
+ class D = C
30
+ class E = D
31
+ ```
32
+
33
+ `::E` is defined as an alias, and it can be normalized to `::C`.
34
+
35
+ ## Type alias
36
+
37
+ The biggest difference from module/class alias is that type alias can be recursive.
38
+
39
+ ```rbs
40
+ # cons_cell type is defined recursively
41
+ type cons_cell = nil
42
+ | [Integer, cons_cell]
43
+ ```
44
+
45
+ This means type aliases *cannot be* normalized generally.
46
+ So, we provide another operation for type alias, `DefinitionBuilder#expand_alias` and its family.
47
+ It substitutes with the immediate right hand side of a type alias.
48
+
49
+ ```
50
+ cons_cell ===> nil | [Integer, cons_cell] (expand 1 step)
51
+ ===> nil | [Integer, nil | [Integer, cons_cell]] (expand 2 steps)
52
+ ===> ... (expand will go infinitely)
53
+ ```
54
+
55
+ Note that the namespace of a type alias *can be* normalized, because they are module names.
56
+
57
+ ```rbs
58
+ module M
59
+ type t = String
60
+ end
61
+
62
+ module N = M
63
+ ```
64
+
65
+ With the type definition above, a type `::N::t` can be normalized to `::M::t`.
66
+ And then it can be expanded to `::String`.
67
+
68
+ > [!NOTE]
69
+ > This is something like an *unfold* operation in type theory.
70
+
71
+ ## Type name resolution
72
+
73
+ Type name resolution in RBS usually rewrites *relative* type names to *absolute* type names.
74
+ `Environment#resolve_type_names` converts all type names in the RBS type definitions, and returns a new `Environment` object.
75
+
76
+ It also *normalizes* modules names in type names.
77
+
78
+ - If the type name can be resolved and normalized successfully, the AST has *absolute* type names.
79
+ - If the type name resolution/normalization fails, the AST has *relative* type names.
data/docs/collection.md CHANGED
@@ -159,9 +159,9 @@ For example:
159
159
  # manifest.yaml
160
160
 
161
161
  dependencies:
162
- # If your gem depends on pathname but the gemspec doesn't include pathname,
162
+ # If your gem depends on logger but the gemspec doesn't include logger,
163
163
  # you need to write the following.
164
- - name: pathname
164
+ - name: logger
165
165
  ```
166
166
 
167
167
  If the gem's RBS is managed with [ruby/gem_rbs_collection](https://github.com/ruby/gem_rbs_collection), put it as `gems/GEM_NAME/VERSION/manifest.yaml`. For example, `gems/activesupport/6.0/manifest.yaml`.
@@ -189,4 +189,4 @@ If the gem's RBS is included in the gem package, put it as `sig/manifest.yaml`.
189
189
  ## How it works
190
190
 
191
191
  `rbs collection` is integrated with Bundler.
192
- `rbs collection install` command generates `gem_rbs_collection.lock.yaml` from `gem_rbs_collection.yaml` and `Gemfile.lock`. It uses `Gemfile.lock` to detects dependencies.
192
+ `rbs collection install` command generates `rbs_collection.lock.yaml` from `rbs_collection.yaml` and `Gemfile.lock`. It uses `Gemfile.lock` to detects dependencies.
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/encoding.md ADDED
@@ -0,0 +1,56 @@
1
+ # RBS File Encoding
2
+
3
+ ## Best Practice
4
+
5
+ **Use UTF-8** for both file encoding and your system locale.
6
+
7
+ ## Supported Encodings
8
+
9
+ RBS parser supports ASCII-compatible encodings (similar to Ruby's script encoding support).
10
+
11
+ **Examples**: UTF-8, US-ASCII, Shift JIS, EUC-JP, ...
12
+
13
+ ## Unicode Codepoint Symbols
14
+
15
+ String literal types in RBS can contain Unicode codepoint escape sequences (`\uXXXX`).
16
+
17
+ When the file encoding is UTF-8, the parser translates Unicode codepoint symbols:
18
+
19
+ ```rbs
20
+ # In UTF-8 encoded files
21
+
22
+ type t = "\u0123" # Translated to the actual Unicode character ģ
23
+ type s = "\u3042" # Translated to the actual Unicode character あ
24
+ ```
25
+
26
+ When the file encoding is not UTF-8, Unicode escape sequences are interpreted literally as the string `\uXXXX`:
27
+
28
+ ```rbs
29
+ # In non-UTF-8 encoded files
30
+
31
+ type t = "\u0123" # Remains as the literal string "\u0123"
32
+ ```
33
+
34
+ ## Implementation
35
+
36
+ RBS gem currently doesn't do anything for file encoding. It relies on Ruby's encoding handling, specifically `Encoding.default_external` and `Encoding.default_internal`.
37
+
38
+ `Encoding.default_external` is the encoding Ruby assumes when it reads external resources like files. The Ruby interpreter sets it based on the locale. `Encoding.default_internal` is the encoding Ruby converts the external resources to. The default is `nil` (no conversion.)
39
+
40
+ When your locale is set to use `UTF-8` encoding, `default_external` is `Encoding::UTF_8`. So the RBS file content read from the disk will have UTF-8 encoding.
41
+
42
+ ### Parsing non UTF-8 RBS source text
43
+
44
+ If you want to work with another encoding, ensure the source string has ASCII compatible encoding.
45
+
46
+ ```ruby
47
+ source = '"日本語"'
48
+ RBS::Parser.parse_type(source.encode(Encoding::EUC_JP)) # => Parses successfully
49
+ RBS::Parser.parse_type(source.encode(Encoding::UTF_32)) # => Returns `nil` since UTF-32 is not ASCII compatible
50
+ ```
51
+
52
+ ### Specifying file encoding
53
+
54
+ Currently, RBS doesn't support specifying file encoding directly.
55
+
56
+ You can use `Encoding.default_external` while the gem loads RBS files from the storage.
data/docs/gem.md CHANGED
@@ -34,7 +34,6 @@ dependencies:
34
34
  - name: json
35
35
  - name: logger
36
36
  - name: optparse
37
- - name: pathname
38
37
  - name: rdoc
39
38
  - name: tsort
40
39
  ```