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/src/lexer.re ADDED
@@ -0,0 +1,187 @@
1
+ #include "rbs/lexer.h"
2
+
3
+ rbs_token_t rbs_lexer_next_token(rbs_lexer_t *lexer) {
4
+ rbs_lexer_t backup;
5
+
6
+ backup = *lexer;
7
+
8
+ /*!re2c
9
+ re2c:flags:u = 1;
10
+ re2c:api:style = free-form;
11
+ re2c:flags:input = custom;
12
+ re2c:define:YYCTYPE = "unsigned int";
13
+ re2c:define:YYPEEK = "rbs_peek(lexer)";
14
+ re2c:define:YYSKIP = "rbs_skip(lexer);";
15
+ re2c:define:YYBACKUP = "backup = *lexer;";
16
+ re2c:define:YYRESTORE = "*lexer = backup;";
17
+ re2c:yyfill:enable = 0;
18
+
19
+ // Ruby's rule for what an identifier is made of is `ISALNUM(c) ||
20
+ // (c) == '_' || !ISASCII(c)`, so define the class by what it leaves
21
+ // out: every ASCII character that is not a word character, and the
22
+ // sentinel `rbs_next_char` reports for a byte that is invalid under
23
+ // the active encoding. Everything else can appear in an identifier,
24
+ // which is how a non-ASCII character gets in.
25
+ ident_char = . \ ([\x00-\x7F] \ [a-zA-Z0-9_]) \ [\uFFFD];
26
+
27
+ // An ASCII digit cannot lead an identifier, but a non-ASCII one can --
28
+ // Ruby accepts a name made of full-width digits. Since `rbs_next_char`
29
+ // never reports a non-ASCII character as `[0-9]`, subtracting the ASCII
30
+ // digits from `ident_char` is the whole of that rule.
31
+ ident_start = ident_char \ [0-9];
32
+
33
+ operator = "/" | "~" | "[]=" | "!" | "!=" | "!~" | "-" | "-@" | "+" | "+@"
34
+ | "==" | "===" | "=~" | "<<" | "<=" | "<=>" | ">" | ">=" | ">>" | "%";
35
+
36
+ "(" { return rbs_next_token(lexer, pLPAREN); }
37
+ ")" { return rbs_next_token(lexer, pRPAREN); }
38
+ "[" { return rbs_next_token(lexer, pLBRACKET); }
39
+ "]" { return rbs_next_token(lexer, pRBRACKET); }
40
+ "{" { return rbs_next_token(lexer, pLBRACE); }
41
+ "}" { return rbs_next_token(lexer, pRBRACE); }
42
+ "," { return rbs_next_token(lexer, pCOMMA); }
43
+ "|" { return rbs_next_token(lexer, pBAR); }
44
+ "^" { return rbs_next_token(lexer, pHAT); }
45
+ "&" { return rbs_next_token(lexer, pAMP); }
46
+ "?" { return rbs_next_token(lexer, pQUESTION); }
47
+ "*" { return rbs_next_token(lexer, pSTAR); }
48
+ "**" { return rbs_next_token(lexer, pSTAR2); }
49
+ "." { return rbs_next_token(lexer, pDOT); }
50
+ "..." { return rbs_next_token(lexer, pDOT3); }
51
+ "`" { return rbs_next_token(lexer, tOPERATOR); }
52
+ "`" [^ :\x00] [^`\x00]* "`" { return rbs_next_token(lexer, tQIDENT); }
53
+ "->" { return rbs_next_token(lexer, pARROW); }
54
+ "=>" { return rbs_next_token(lexer, pFATARROW); }
55
+ "=" { return rbs_next_token(lexer, pEQ); }
56
+ ":" { return rbs_next_token(lexer, pCOLON); }
57
+ "::" { return rbs_next_token(lexer, pCOLON2); }
58
+ "<" { return rbs_next_token(lexer, pLT); }
59
+ ">" { return rbs_next_token(lexer, pGT); }
60
+ "[]" { return rbs_next_token(lexer, pAREF_OPR); }
61
+ operator { return rbs_next_token(lexer, tOPERATOR); }
62
+ "--" [^\x00]* { return rbs_next_token(lexer, tINLINECOMMENT); }
63
+
64
+ number = [0-9] [0-9_]*;
65
+ ("-"|"+")? number { return rbs_next_token(lexer, tINTEGER); }
66
+
67
+ "%a{" [^}\x00]* "}" { return rbs_next_token(lexer, tANNOTATION); }
68
+ "%a(" [^)\x00]* ")" { return rbs_next_token(lexer, tANNOTATION); }
69
+ "%a[" [^\]\x00]* "]" { return rbs_next_token(lexer, tANNOTATION); }
70
+ "%a|" [^|\x00]* "|" { return rbs_next_token(lexer, tANNOTATION); }
71
+ "%a<" [^>\x00]* ">" { return rbs_next_token(lexer, tANNOTATION); }
72
+
73
+ "#" (. \ [\x00\uFFFD])* {
74
+ // Keep a bare CR in the comment, but leave the CR in CRLF for a trivia token.
75
+ if (rbs_peek(lexer) == '\n' && lexer->string.start[lexer->current.byte_pos - 1] == '\r') {
76
+ lexer->current.byte_pos -= 1;
77
+ lexer->current.char_pos -= 1;
78
+ lexer->current.column -= 1;
79
+ lexer->current_code_point = '\r';
80
+ lexer->current_character_bytes = 1;
81
+ }
82
+
83
+ return rbs_next_token(
84
+ lexer,
85
+ lexer->first_token_of_line ? tLINECOMMENT : tCOMMENT
86
+ );
87
+ }
88
+
89
+ "alias" { return rbs_next_token(lexer, kALIAS); }
90
+ "attr_accessor" { return rbs_next_token(lexer, kATTRACCESSOR); }
91
+ "attr_reader" { return rbs_next_token(lexer, kATTRREADER); }
92
+ "attr_writer" { return rbs_next_token(lexer, kATTRWRITER); }
93
+ "bool" { return rbs_next_token(lexer, kBOOL); }
94
+ "bot" { return rbs_next_token(lexer, kBOT); }
95
+ "class" { return rbs_next_token(lexer, kCLASS); }
96
+ "class-alias" { return rbs_next_token(lexer, kCLASSALIAS); }
97
+ "def" { return rbs_next_token(lexer, kDEF); }
98
+ "end" { return rbs_next_token(lexer, kEND); }
99
+ "extend" { return rbs_next_token(lexer, kEXTEND); }
100
+ "false" { return rbs_next_token(lexer, kFALSE); }
101
+ "in" { return rbs_next_token(lexer, kIN); }
102
+ "include" { return rbs_next_token(lexer, kINCLUDE); }
103
+ "instance" { return rbs_next_token(lexer, kINSTANCE); }
104
+ "interface" { return rbs_next_token(lexer, kINTERFACE); }
105
+ "module" { return rbs_next_token(lexer, kMODULE); }
106
+ "module-alias" { return rbs_next_token(lexer, kMODULEALIAS); }
107
+ "module-self" { return rbs_next_token(lexer, kMODULESELF); }
108
+ "nil" { return rbs_next_token(lexer, kNIL); }
109
+ "out" { return rbs_next_token(lexer, kOUT); }
110
+ "prepend" { return rbs_next_token(lexer, kPREPEND); }
111
+ "private" { return rbs_next_token(lexer, kPRIVATE); }
112
+ "public" { return rbs_next_token(lexer, kPUBLIC); }
113
+ "self" { return rbs_next_token(lexer, kSELF); }
114
+ "singleton" { return rbs_next_token(lexer, kSINGLETON); }
115
+ "top" { return rbs_next_token(lexer, kTOP); }
116
+ "true" { return rbs_next_token(lexer, kTRUE); }
117
+ "type" { return rbs_next_token(lexer, kTYPE); }
118
+ "unchecked" { return rbs_next_token(lexer, kUNCHECKED); }
119
+ "untyped" { return rbs_next_token(lexer, kUNTYPED); }
120
+ "void" { return rbs_next_token(lexer, kVOID); }
121
+ "use" { return rbs_next_token(lexer, kUSE); }
122
+ "as" { return rbs_next_token(lexer, kAS); }
123
+ "__todo__" { return rbs_next_token(lexer, k__TODO__); }
124
+ "@rbs" { return rbs_next_token(lexer, kATRBS); }
125
+ "skip" { return rbs_next_token(lexer, kSKIP); }
126
+ "return" { return rbs_next_token(lexer, kRETURN); }
127
+
128
+ unicode_char = "\\u" [0-9a-fA-F]{4};
129
+ oct_char = "\\x" [0-9a-f]{1,2};
130
+ hex_char = "\\" [0-7]{1,3};
131
+
132
+ dqstring = ["] (unicode_char | oct_char | hex_char | "\\" [^xu] | [^\\"\x00])* ["];
133
+ sqstring = ['] ("\\"['\\] | [^'\x00])* ['];
134
+
135
+ dqstring { return rbs_next_token(lexer, tDQSTRING); }
136
+ sqstring { return rbs_next_token(lexer, tSQSTRING); }
137
+ ":" dqstring { return rbs_next_token(lexer, tDQSYMBOL); }
138
+ ":" sqstring { return rbs_next_token(lexer, tSQSYMBOL); }
139
+
140
+ symbol_opr = ":|" | ":&" | ":/" | ":%" | ":~" | ":`" | ":^"
141
+ | ":==" | ":=~" | ":===" | ":!" | ":!=" | ":!~"
142
+ | ":<" | ":<=" | ":<<" | ":<=>" | ":>" | ":>=" | ":>>"
143
+ | ":-" | ":-@" | ":+" | ":+@" | ":*" | ":**" | ":[]" | ":[]=";
144
+
145
+ global_ident = [0-9]+
146
+ | "-" [a-zA-Z0-9_]
147
+ | [~*$?!@\\/;,.=:<>"&'`+]
148
+ | [^ \t\r\n:;=.,!"$%&()-+~|\\'[\]{}*/<>^\x00]+;
149
+
150
+ ":" "@"{0,2} ident_start ident_char* [!?=]? { return rbs_next_token(lexer, tSYMBOL); }
151
+ ":$" global_ident { return rbs_next_token(lexer, tSYMBOL); }
152
+ symbol_opr { return rbs_next_token(lexer, tSYMBOL); }
153
+
154
+ [a-z] ident_char* { return rbs_next_token(lexer, tLIDENT); }
155
+ [A-Z] ident_char* { return rbs_next_token(lexer, tUIDENT); }
156
+ "_" [a-z0-9_] ident_char* { return rbs_next_token(lexer, tULLIDENT); }
157
+ "_" [A-Z] ident_char* { return rbs_next_token(lexer, tULIDENT); }
158
+ "_" { return rbs_next_token(lexer, tULLIDENT); }
159
+
160
+ // Every ASCII spelling is covered by one of the rules above, which match
161
+ // exactly as far, and re2c settles a tie of equal length in favour of the
162
+ // rule written first. So this one is left with the names that open with a
163
+ // character outside ASCII.
164
+ //
165
+ // RBS reads the case of that character to tell a class name from an alias
166
+ // name, and outside ASCII there is no reading of it that both the lexer
167
+ // and `TypeName#kind` can agree on. Those names get a token of their own
168
+ // and the parser takes it only where the question does not come up.
169
+ ident_start ident_char* { return rbs_next_token(lexer, tNONASCIIIDENT); }
170
+
171
+ // None of these four needs to know the case of the first character, so
172
+ // widening the leading position to `ident_start` is all they need.
173
+ ident_start ident_char* "!" { return rbs_next_token(lexer, tBANGIDENT); }
174
+ ident_start ident_char* "=" { return rbs_next_token(lexer, tEQIDENT); }
175
+
176
+ "@" ident_start ident_char* { return rbs_next_token(lexer, tAIDENT); }
177
+ "@@" ident_start ident_char* { return rbs_next_token(lexer, tA2IDENT); }
178
+
179
+ "$" global_ident { return rbs_next_token(lexer, tGIDENT); }
180
+
181
+ skip = ([ \t]+|[\r\n]);
182
+
183
+ skip { return rbs_next_token(lexer, tTRIVIA); }
184
+ "\x00" { return rbs_next_eof_token(lexer); }
185
+ * { return rbs_next_token(lexer, ErrorToken); }
186
+ */
187
+ }
data/src/lexstate.c ADDED
@@ -0,0 +1,222 @@
1
+ #include "rbs/defines.h"
2
+ #include "rbs/lexer.h"
3
+ #include "rbs/util/rbs_assert.h"
4
+
5
+ static const char *RBS_TOKENTYPE_NAMES[] = {
6
+ "NullType",
7
+ "pEOF",
8
+ "ErrorToken",
9
+
10
+ "pLPAREN", /* ( */
11
+ "pRPAREN", /* ) */
12
+ "pCOLON", /* : */
13
+ "pCOLON2", /* :: */
14
+ "pLBRACKET", /* [ */
15
+ "pRBRACKET", /* ] */
16
+ "pLBRACE", /* { */
17
+ "pRBRACE", /* } */
18
+ "pHAT", /* ^ */
19
+ "pARROW", /* -> */
20
+ "pFATARROW", /* => */
21
+ "pCOMMA", /* , */
22
+ "pBAR", /* | */
23
+ "pAMP", /* & */
24
+ "pSTAR", /* * */
25
+ "pSTAR2", /* ** */
26
+ "pDOT", /* . */
27
+ "pDOT3", /* ... */
28
+ "pBANG", /* ! */
29
+ "pQUESTION", /* ? */
30
+ "pLT", /* < */
31
+ "pGT", /* > */
32
+ "pEQ", /* = */
33
+
34
+ "kALIAS", /* alias */
35
+ "kATTRACCESSOR", /* attr_accessor */
36
+ "kATTRREADER", /* attr_reader */
37
+ "kATTRWRITER", /* attr_writer */
38
+ "kBOOL", /* bool */
39
+ "kBOT", /* bot */
40
+ "kCLASS", /* class */
41
+ "kCLASSALIAS", /* class-alias */
42
+ "kDEF", /* def */
43
+ "kEND", /* end */
44
+ "kEXTEND", /* extend */
45
+ "kFALSE", /* kFALSE */
46
+ "kIN", /* in */
47
+ "kINCLUDE", /* include */
48
+ "kINSTANCE", /* instance */
49
+ "kINTERFACE", /* interface */
50
+ "kMODULE", /* module */
51
+ "kMODULEALIAS", /* module-alias */
52
+ "kNIL", /* nil */
53
+ "kOUT", /* out */
54
+ "kPREPEND", /* prepend */
55
+ "kPRIVATE", /* private */
56
+ "kPUBLIC", /* public */
57
+ "kSELF", /* self */
58
+ "kSINGLETON", /* singleton */
59
+ "kTOP", /* top */
60
+ "kTRUE", /* true */
61
+ "kTYPE", /* type */
62
+ "kUNCHECKED", /* unchecked */
63
+ "kUNTYPED", /* untyped */
64
+ "kVOID", /* void */
65
+ "kUSE", /* use */
66
+ "kAS", /* as */
67
+ "k__TODO__", /* __todo__ */
68
+ "kATRBS", /* @rbs */
69
+ "kSKIP", /* skip */
70
+ "kRETURN", /* return */
71
+ "kMODULESELF", /* module-self */
72
+
73
+ "tLIDENT", /* Identifiers starting with lower case */
74
+ "tUIDENT", /* Identifiers starting with upper case */
75
+ "tULIDENT", /* Identifiers starting with `_` */
76
+ "tULLIDENT",
77
+ "tNONASCIIIDENT",
78
+ "tGIDENT", /* Identifiers starting with `$` */
79
+ "tAIDENT", /* Identifiers starting with `@` */
80
+ "tA2IDENT", /* Identifiers starting with `@@` */
81
+ "tBANGIDENT",
82
+ "tEQIDENT",
83
+ "tQIDENT", /* Quoted identifier */
84
+ "pAREF_OPR", /* [] */
85
+ "tOPERATOR", /* Operator identifier */
86
+
87
+ "tCOMMENT",
88
+ "tLINECOMMENT",
89
+ "tINLINECOMMENT",
90
+
91
+ "tTRIVIA",
92
+
93
+ "tDQSTRING", /* Double quoted string */
94
+ "tSQSTRING", /* Single quoted string */
95
+ "tINTEGER", /* Integer */
96
+ "tSYMBOL", /* Symbol */
97
+ "tDQSYMBOL",
98
+ "tSQSYMBOL",
99
+ "tANNOTATION", /* Annotation */
100
+ };
101
+
102
+ const rbs_position_t NullPosition = { -1, -1, -1, -1 };
103
+ const rbs_range_t NULL_RANGE = { { -1, -1, -1, -1 }, { -1, -1, -1, -1 } };
104
+ const rbs_token_t NullToken = { .type = NullType, .range = { { 0 }, { 0 } } };
105
+
106
+ const char *rbs_token_type_str(enum RBSTokenType type) {
107
+ return RBS_TOKENTYPE_NAMES[type];
108
+ }
109
+
110
+ int rbs_token_chars(rbs_token_t tok) {
111
+ return tok.range.end.char_pos - tok.range.start.char_pos;
112
+ }
113
+
114
+ int rbs_token_bytes(rbs_token_t tok) {
115
+ return RBS_RANGE_BYTES(tok.range);
116
+ }
117
+
118
+ unsigned int rbs_peek(rbs_lexer_t *lexer) {
119
+ return lexer->current_code_point;
120
+ }
121
+
122
+ bool rbs_next_char(rbs_lexer_t *lexer, unsigned int *codepoint, size_t *byte_len) {
123
+ if (RBS_UNLIKELY(lexer->current.byte_pos >= lexer->end_pos)) {
124
+ return false;
125
+ }
126
+
127
+ const char *start = lexer->string.start + lexer->current.byte_pos;
128
+
129
+ // Fast path for ASCII (single-byte) characters
130
+ if ((unsigned int) *start < 128) {
131
+ *codepoint = (unsigned int) *start;
132
+ *byte_len = 1;
133
+ return true;
134
+ }
135
+
136
+ *byte_len = lexer->encoding->char_width((const uint8_t *) start, (ptrdiff_t) (lexer->string.end - start));
137
+
138
+ if (*byte_len == 0) {
139
+ // Invalid byte under the active encoding. Map it to a sentinel code
140
+ // point (U+FFFD) and advance one byte so the lexer always makes
141
+ // progress. Token rules that scan until a delimiter exclude this
142
+ // sentinel, so an invalid byte surfaces as an ErrorToken instead of
143
+ // being silently swallowed.
144
+ *byte_len = 1;
145
+ *codepoint = 0xFFFD;
146
+ } else if (*byte_len == 1) {
147
+ *codepoint = (unsigned int) *start;
148
+ } else {
149
+ *codepoint = 12523; // Dummy data for "ル" from "ルビー" (Ruby) in Unicode
150
+ }
151
+
152
+ return true;
153
+ }
154
+
155
+ void rbs_skip(rbs_lexer_t *lexer) {
156
+ RBS_ASSERT(lexer->current_character_bytes > 0, "rbs_skip called with current_character_bytes == 0");
157
+
158
+ if (RBS_UNLIKELY(lexer->current_code_point == '\0')) {
159
+ return;
160
+ }
161
+
162
+ unsigned int codepoint;
163
+ size_t byte_len;
164
+
165
+ lexer->current.byte_pos += lexer->current_character_bytes;
166
+ lexer->current.char_pos += 1;
167
+ if (lexer->current_code_point == '\n') {
168
+ lexer->current.line += 1;
169
+ lexer->current.column = 0;
170
+ lexer->first_token_of_line = true;
171
+ } else {
172
+ lexer->current.column += 1;
173
+ }
174
+
175
+ if (rbs_next_char(lexer, &codepoint, &byte_len)) {
176
+ lexer->current_code_point = codepoint;
177
+ lexer->current_character_bytes = byte_len;
178
+ } else {
179
+ lexer->current_character_bytes = 1;
180
+ lexer->current_code_point = '\0';
181
+ }
182
+ }
183
+
184
+ rbs_token_t rbs_next_token(rbs_lexer_t *lexer, enum RBSTokenType type) {
185
+ rbs_token_t t;
186
+
187
+ t.type = type;
188
+ t.range.start = lexer->start;
189
+ t.range.end = lexer->current;
190
+ lexer->start = lexer->current;
191
+ if (type != tTRIVIA) {
192
+ lexer->first_token_of_line = false;
193
+ }
194
+
195
+ return t;
196
+ }
197
+
198
+ rbs_token_t rbs_next_eof_token(rbs_lexer_t *lexer) {
199
+ if ((size_t) lexer->current.byte_pos == rbs_string_len(lexer->string) + 1) {
200
+ // End of String
201
+ rbs_token_t t;
202
+ t.type = pEOF;
203
+ t.range.start = lexer->start;
204
+ t.range.end = lexer->start;
205
+ lexer->start = lexer->current;
206
+
207
+ return t;
208
+ } else {
209
+ // NULL byte in the middle of the string
210
+ return rbs_next_token(lexer, pEOF);
211
+ }
212
+ }
213
+
214
+ void rbs_skipn(rbs_lexer_t *lexer, size_t size) {
215
+ for (size_t i = 0; i < size; i++) {
216
+ rbs_skip(lexer);
217
+ }
218
+ }
219
+
220
+ char *rbs_peek_token(rbs_lexer_t *lexer, rbs_token_t tok) {
221
+ return (char *) lexer->string.start + tok.range.start.byte_pos;
222
+ }
data/src/location.c ADDED
@@ -0,0 +1,31 @@
1
+ #include "rbs/location.h"
2
+
3
+ rbs_location_range_list_t *rbs_location_range_list_new(rbs_allocator_t *allocator) {
4
+ rbs_location_range_list_t *list = rbs_allocator_alloc(allocator, rbs_location_range_list_t);
5
+ *list = (rbs_location_range_list_t) {
6
+ .allocator = allocator,
7
+ .head = NULL,
8
+ .tail = NULL,
9
+ .length = 0,
10
+ };
11
+
12
+ return list;
13
+ }
14
+
15
+ void rbs_location_range_list_append(rbs_location_range_list_t *list, rbs_location_range range) {
16
+ rbs_location_range_list_node_t *node = rbs_allocator_alloc(list->allocator, rbs_location_range_list_node_t);
17
+ *node = (rbs_location_range_list_node_t) {
18
+ .range = range,
19
+ .next = NULL,
20
+ };
21
+
22
+ if (list->head == NULL) {
23
+ list->head = node;
24
+ list->tail = node;
25
+ } else {
26
+ list->tail->next = node;
27
+ list->tail = node;
28
+ }
29
+
30
+ list->length++;
31
+ }