rbs 3.9.4 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) 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/.github/dependabot.yml +16 -14
  6. data/.github/workflows/bundle-update.yml +63 -0
  7. data/.github/workflows/c-check.yml +66 -0
  8. data/.github/workflows/comments.yml +5 -3
  9. data/.github/workflows/dependabot.yml +2 -2
  10. data/.github/workflows/jruby.yml +79 -0
  11. data/.github/workflows/release-gems.yml +164 -0
  12. data/.github/workflows/ruby.yml +84 -30
  13. data/.github/workflows/rust.yml +186 -0
  14. data/.github/workflows/truffleruby.yml +54 -0
  15. data/.github/workflows/typecheck.yml +5 -2
  16. data/.github/workflows/wasm.yml +55 -0
  17. data/.github/workflows/windows.yml +9 -3
  18. data/.gitignore +16 -0
  19. data/.rubocop.yml +2 -2
  20. data/CHANGELOG.md +430 -0
  21. data/Dockerfile.jruby +53 -0
  22. data/README.md +41 -4
  23. data/Rakefile +777 -60
  24. data/Steepfile +11 -0
  25. data/config.yml +660 -62
  26. data/core/array.rbs +541 -398
  27. data/core/basic_object.rbs +9 -8
  28. data/core/binding.rbs +0 -2
  29. data/core/builtin.rbs +9 -8
  30. data/core/class.rbs +11 -8
  31. data/core/comparable.rbs +55 -34
  32. data/core/complex.rbs +104 -78
  33. data/core/dir.rbs +61 -49
  34. data/core/encoding.rbs +12 -15
  35. data/core/enumerable.rbs +297 -196
  36. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  37. data/core/enumerator/product.rbs +5 -5
  38. data/core/enumerator.rbs +91 -28
  39. data/core/errno.rbs +11 -2
  40. data/core/errors.rbs +58 -29
  41. data/core/exception.rbs +13 -13
  42. data/core/fiber.rbs +74 -54
  43. data/core/file.rbs +260 -1151
  44. data/core/file_constants.rbs +463 -0
  45. data/core/file_stat.rbs +534 -0
  46. data/core/file_test.rbs +3 -3
  47. data/core/float.rbs +257 -116
  48. data/core/gc.rbs +425 -281
  49. data/core/hash.rbs +1151 -829
  50. data/core/integer.rbs +156 -195
  51. data/core/io/buffer.rbs +53 -42
  52. data/core/io/wait.rbs +13 -35
  53. data/core/io.rbs +220 -154
  54. data/core/kernel.rbs +239 -163
  55. data/core/marshal.rbs +4 -4
  56. data/core/match_data.rbs +16 -14
  57. data/core/math.rbs +107 -66
  58. data/core/method.rbs +69 -33
  59. data/core/module.rbs +302 -150
  60. data/core/nil_class.rbs +7 -6
  61. data/core/numeric.rbs +77 -63
  62. data/core/object.rbs +9 -11
  63. data/core/object_space/weak_key_map.rbs +7 -7
  64. data/core/object_space.rbs +30 -23
  65. data/core/pathname.rbs +1312 -0
  66. data/core/proc.rbs +95 -58
  67. data/core/process.rbs +222 -202
  68. data/core/ractor.rbs +364 -518
  69. data/core/random.rbs +21 -3
  70. data/core/range.rbs +181 -79
  71. data/core/rational.rbs +60 -89
  72. data/core/rbs/ops.rbs +154 -0
  73. data/core/rbs/unnamed/argf.rbs +63 -56
  74. data/core/rbs/unnamed/env_class.rbs +19 -14
  75. data/core/rbs/unnamed/main_class.rbs +123 -0
  76. data/core/rbs/unnamed/random.rbs +11 -118
  77. data/core/regexp.rbs +258 -214
  78. data/core/ruby.rbs +53 -0
  79. data/core/ruby_vm.rbs +78 -34
  80. data/core/rubygems/config_file.rbs +5 -5
  81. data/core/rubygems/errors.rbs +6 -70
  82. data/core/rubygems/requirement.rbs +5 -15
  83. data/core/rubygems/rubygems.rbs +18 -81
  84. data/core/rubygems/specification.rbs +8 -0
  85. data/core/rubygems/version.rbs +2 -163
  86. data/core/set.rbs +493 -363
  87. data/core/signal.rbs +26 -16
  88. data/core/string.rbs +3234 -1285
  89. data/core/struct.rbs +43 -42
  90. data/core/symbol.rbs +41 -34
  91. data/core/thread.rbs +139 -83
  92. data/core/time.rbs +81 -50
  93. data/core/trace_point.rbs +41 -35
  94. data/core/true_class.rbs +2 -2
  95. data/core/unbound_method.rbs +24 -16
  96. data/core/warning.rbs +7 -7
  97. data/docs/CONTRIBUTING.md +2 -1
  98. data/docs/aliases.md +79 -0
  99. data/docs/collection.md +3 -3
  100. data/docs/config.md +171 -0
  101. data/docs/encoding.md +56 -0
  102. data/docs/gem.md +0 -1
  103. data/docs/inline.md +634 -0
  104. data/docs/rbs_by_example.md +20 -20
  105. data/docs/release.md +151 -0
  106. data/docs/rust.md +96 -0
  107. data/docs/sigs.md +3 -3
  108. data/docs/syntax.md +48 -18
  109. data/docs/type_fingerprint.md +21 -0
  110. data/docs/wasm_serialization.md +80 -0
  111. data/exe/rbs +1 -1
  112. data/ext/rbs_extension/ast_translation.c +1855 -0
  113. data/ext/rbs_extension/ast_translation.h +41 -0
  114. data/ext/rbs_extension/class_constants.c +187 -0
  115. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +23 -1
  116. data/ext/rbs_extension/compat.h +10 -0
  117. data/ext/rbs_extension/extconf.rb +26 -1
  118. data/ext/rbs_extension/legacy_location.c +299 -0
  119. data/ext/rbs_extension/legacy_location.h +82 -0
  120. data/ext/rbs_extension/main.c +603 -23
  121. data/ext/rbs_extension/rbs_extension.h +6 -21
  122. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  123. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  124. data/include/rbs/ast.h +1047 -0
  125. data/include/rbs/defines.h +99 -0
  126. data/include/rbs/lexer.h +207 -0
  127. data/include/rbs/location.h +40 -0
  128. data/include/rbs/parser.h +153 -0
  129. data/include/rbs/serialize.h +39 -0
  130. data/include/rbs/string.h +47 -0
  131. data/include/rbs/util/rbs_allocator.h +59 -0
  132. data/include/rbs/util/rbs_assert.h +20 -0
  133. data/include/rbs/util/rbs_buffer.h +83 -0
  134. data/include/rbs/util/rbs_constant_pool.h +6 -70
  135. data/include/rbs/util/rbs_encoding.h +282 -0
  136. data/include/rbs/util/rbs_unescape.h +24 -0
  137. data/include/rbs.h +9 -2
  138. data/lib/rbs/annotate/formatter.rb +3 -13
  139. data/lib/rbs/annotate/rdoc_annotator.rb +30 -32
  140. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  141. data/lib/rbs/ast/annotation.rb +1 -1
  142. data/lib/rbs/ast/comment.rb +1 -1
  143. data/lib/rbs/ast/declarations.rb +10 -10
  144. data/lib/rbs/ast/members.rb +14 -14
  145. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  146. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  147. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  148. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  149. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  150. data/lib/rbs/ast/ruby/members.rb +762 -0
  151. data/lib/rbs/ast/type_param.rb +24 -4
  152. data/lib/rbs/buffer.rb +142 -20
  153. data/lib/rbs/cli/diff.rb +16 -15
  154. data/lib/rbs/cli/validate.rb +63 -126
  155. data/lib/rbs/cli.rb +59 -29
  156. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  157. data/lib/rbs/collection/sources/git.rb +7 -0
  158. data/lib/rbs/definition.rb +6 -1
  159. data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
  160. data/lib/rbs/definition_builder/method_builder.rb +74 -33
  161. data/lib/rbs/definition_builder.rb +177 -20
  162. data/lib/rbs/diff.rb +7 -1
  163. data/lib/rbs/environment/class_entry.rb +69 -0
  164. data/lib/rbs/environment/module_entry.rb +66 -0
  165. data/lib/rbs/environment.rb +410 -215
  166. data/lib/rbs/environment_loader.rb +2 -8
  167. data/lib/rbs/errors.rb +31 -21
  168. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  169. data/lib/rbs/inline_parser.rb +568 -0
  170. data/lib/rbs/location_aux.rb +36 -4
  171. data/lib/rbs/locator.rb +5 -1
  172. data/lib/rbs/method_type.rb +5 -3
  173. data/lib/rbs/namespace.rb +47 -18
  174. data/lib/rbs/parser_aux.rb +37 -7
  175. data/lib/rbs/prototype/helpers.rb +57 -0
  176. data/lib/rbs/prototype/rb.rb +3 -28
  177. data/lib/rbs/prototype/rbi.rb +196 -45
  178. data/lib/rbs/prototype/runtime.rb +12 -2
  179. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  180. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  181. data/lib/rbs/rewriter.rb +70 -0
  182. data/lib/rbs/source.rb +99 -0
  183. data/lib/rbs/subtractor.rb +7 -4
  184. data/lib/rbs/test/type_check.rb +25 -3
  185. data/lib/rbs/type_name.rb +34 -21
  186. data/lib/rbs/types.rb +91 -79
  187. data/lib/rbs/unit_test/convertibles.rb +1 -0
  188. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  189. data/lib/rbs/validator.rb +2 -2
  190. data/lib/rbs/version.rb +1 -1
  191. data/lib/rbs/wasm/deserializer.rb +213 -0
  192. data/lib/rbs/wasm/location.rb +61 -0
  193. data/lib/rbs/wasm/parser.rb +137 -0
  194. data/lib/rbs/wasm/runtime.rb +196 -0
  195. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  196. data/lib/rbs.rb +25 -2
  197. data/lib/rbs_jars.rb +39 -0
  198. data/lib/rdoc/discover.rb +1 -1
  199. data/lib/rdoc_plugin/parser.rb +8 -3
  200. data/rbs.gemspec +37 -5
  201. data/schema/typeParam.json +17 -1
  202. data/sig/ancestor_builder.rbs +1 -1
  203. data/sig/annotate/formatter.rbs +2 -2
  204. data/sig/annotate/rdoc_annotater.rbs +13 -10
  205. data/sig/ast/ruby/annotations.rbs +470 -0
  206. data/sig/ast/ruby/comment_block.rbs +127 -0
  207. data/sig/ast/ruby/declarations.rbs +158 -0
  208. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  209. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  210. data/sig/ast/ruby/members.rbs +198 -0
  211. data/sig/buffer.rbs +81 -5
  212. data/sig/cli/diff.rbs +5 -11
  213. data/sig/cli/validate.rbs +12 -8
  214. data/sig/cli.rbs +18 -18
  215. data/sig/collection/config/lockfile_generator.rbs +2 -0
  216. data/sig/definition.rbs +6 -0
  217. data/sig/definition_builder.rbs +3 -1
  218. data/sig/environment/class_entry.rbs +50 -0
  219. data/sig/environment/module_entry.rbs +50 -0
  220. data/sig/environment.rbs +94 -87
  221. data/sig/errors.rbs +26 -20
  222. data/sig/inline_parser/comment_association.rbs +71 -0
  223. data/sig/inline_parser.rbs +126 -0
  224. data/sig/location.rbs +32 -7
  225. data/sig/locator.rbs +0 -2
  226. data/sig/manifest.yaml +0 -2
  227. data/sig/method_builder.rbs +9 -4
  228. data/sig/namespace.rbs +20 -5
  229. data/sig/parser.rbs +77 -13
  230. data/sig/prototype/helpers.rbs +2 -0
  231. data/sig/prototype/rbi.rbs +33 -4
  232. data/sig/resolver/type_name_resolver.rbs +36 -10
  233. data/sig/rewriter.rbs +45 -0
  234. data/sig/source.rbs +48 -0
  235. data/sig/type_param.rbs +13 -8
  236. data/sig/typename.rbs +15 -5
  237. data/sig/types.rbs +10 -8
  238. data/sig/unit_test/spy.rbs +0 -8
  239. data/sig/unit_test/type_assertions.rbs +15 -0
  240. data/sig/wasm/deserializer.rbs +66 -0
  241. data/sig/wasm/serialization_schema.rbs +13 -0
  242. data/src/ast.c +1628 -0
  243. data/src/lexer.c +3221 -0
  244. data/src/lexer.re +155 -0
  245. data/src/lexstate.c +221 -0
  246. data/src/location.c +31 -0
  247. data/src/parser.c +4258 -0
  248. data/src/serialize.c +958 -0
  249. data/src/string.c +41 -0
  250. data/src/util/rbs_allocator.c +171 -0
  251. data/src/util/rbs_assert.c +19 -0
  252. data/src/util/rbs_buffer.c +54 -0
  253. data/src/util/rbs_constant_pool.c +18 -92
  254. data/src/util/rbs_encoding.c +21308 -0
  255. data/src/util/rbs_unescape.c +167 -0
  256. data/stdlib/abbrev/0/array.rbs +1 -1
  257. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  258. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  259. data/stdlib/cgi/0/core.rbs +9 -393
  260. data/stdlib/cgi/0/manifest.yaml +1 -0
  261. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  262. data/stdlib/coverage/0/coverage.rbs +7 -4
  263. data/stdlib/csv/0/csv.rbs +5 -5
  264. data/stdlib/date/0/date.rbs +92 -79
  265. data/stdlib/date/0/date_time.rbs +25 -24
  266. data/stdlib/delegate/0/delegator.rbs +11 -7
  267. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  268. data/stdlib/digest/0/digest.rbs +117 -1
  269. data/stdlib/erb/0/erb.rbs +748 -347
  270. data/stdlib/etc/0/etc.rbs +73 -54
  271. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  272. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  273. data/stdlib/io-console/0/io-console.rbs +2 -2
  274. data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
  275. data/stdlib/json/0/json.rbs +232 -185
  276. data/stdlib/monitor/0/monitor.rbs +5 -5
  277. data/stdlib/net-http/0/net-http.rbs +162 -134
  278. data/stdlib/objspace/0/objspace.rbs +17 -34
  279. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  280. data/stdlib/open3/0/open3.rbs +469 -10
  281. data/stdlib/openssl/0/openssl.rbs +521 -397
  282. data/stdlib/optparse/0/optparse.rbs +26 -17
  283. data/stdlib/pathname/0/pathname.rbs +11 -1381
  284. data/stdlib/pp/0/pp.rbs +9 -8
  285. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  286. data/stdlib/pstore/0/pstore.rbs +35 -30
  287. data/stdlib/psych/0/psych.rbs +65 -12
  288. data/stdlib/psych/0/store.rbs +2 -4
  289. data/stdlib/pty/0/pty.rbs +9 -6
  290. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  291. data/stdlib/rdoc/0/code_object.rbs +4 -3
  292. data/stdlib/rdoc/0/comment.rbs +2 -0
  293. data/stdlib/rdoc/0/options.rbs +76 -0
  294. data/stdlib/rdoc/0/parser.rbs +1 -1
  295. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  296. data/stdlib/rdoc/0/store.rbs +2 -2
  297. data/stdlib/resolv/0/resolv.rbs +26 -69
  298. data/stdlib/ripper/0/ripper.rbs +25 -19
  299. data/stdlib/securerandom/0/manifest.yaml +2 -0
  300. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  301. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  302. data/stdlib/singleton/0/singleton.rbs +3 -0
  303. data/stdlib/socket/0/addrinfo.rbs +9 -9
  304. data/stdlib/socket/0/basic_socket.rbs +3 -3
  305. data/stdlib/socket/0/ip_socket.rbs +10 -8
  306. data/stdlib/socket/0/socket.rbs +23 -10
  307. data/stdlib/socket/0/tcp_server.rbs +1 -1
  308. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  309. data/stdlib/socket/0/udp_socket.rbs +1 -1
  310. data/stdlib/socket/0/unix_server.rbs +1 -1
  311. data/stdlib/stringio/0/stringio.rbs +1209 -95
  312. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  313. data/stdlib/tempfile/0/manifest.yaml +3 -0
  314. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  315. data/stdlib/time/0/time.rbs +8 -6
  316. data/stdlib/timeout/0/timeout.rbs +58 -7
  317. data/stdlib/tsort/0/cyclic.rbs +4 -1
  318. data/stdlib/tsort/0/interfaces.rbs +8 -8
  319. data/stdlib/tsort/0/tsort.rbs +16 -15
  320. data/stdlib/uri/0/common.rbs +42 -20
  321. data/stdlib/uri/0/file.rbs +3 -3
  322. data/stdlib/uri/0/generic.rbs +21 -18
  323. data/stdlib/uri/0/http.rbs +2 -2
  324. data/stdlib/uri/0/ldap.rbs +2 -2
  325. data/stdlib/uri/0/mailto.rbs +3 -3
  326. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  327. data/stdlib/zlib/0/deflate.rbs +4 -3
  328. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  329. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  330. data/stdlib/zlib/0/inflate.rbs +1 -1
  331. data/stdlib/zlib/0/need_dict.rbs +1 -1
  332. data/wasm/README.md +60 -0
  333. data/wasm/rbs_wasm.c +423 -0
  334. metadata +131 -19
  335. data/ext/rbs_extension/lexer.c +0 -2728
  336. data/ext/rbs_extension/lexer.h +0 -179
  337. data/ext/rbs_extension/lexer.re +0 -147
  338. data/ext/rbs_extension/lexstate.c +0 -175
  339. data/ext/rbs_extension/location.c +0 -325
  340. data/ext/rbs_extension/location.h +0 -85
  341. data/ext/rbs_extension/parser.c +0 -2982
  342. data/ext/rbs_extension/parser.h +0 -18
  343. data/ext/rbs_extension/parserstate.c +0 -411
  344. data/ext/rbs_extension/parserstate.h +0 -163
  345. data/ext/rbs_extension/unescape.c +0 -32
  346. data/include/rbs/ruby_objs.h +0 -72
  347. data/src/constants.c +0 -153
  348. data/src/ruby_objs.c +0 -799
data/src/lexer.re ADDED
@@ -0,0 +1,155 @@
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
+ word = [a-zA-Z0-9_];
20
+
21
+ operator = "/" | "~" | "[]=" | "!" | "!=" | "!~" | "-" | "-@" | "+" | "+@"
22
+ | "==" | "===" | "=~" | "<<" | "<=" | "<=>" | ">" | ">=" | ">>" | "%";
23
+
24
+ "(" { return rbs_next_token(lexer, pLPAREN); }
25
+ ")" { return rbs_next_token(lexer, pRPAREN); }
26
+ "[" { return rbs_next_token(lexer, pLBRACKET); }
27
+ "]" { return rbs_next_token(lexer, pRBRACKET); }
28
+ "{" { return rbs_next_token(lexer, pLBRACE); }
29
+ "}" { return rbs_next_token(lexer, pRBRACE); }
30
+ "," { return rbs_next_token(lexer, pCOMMA); }
31
+ "|" { return rbs_next_token(lexer, pBAR); }
32
+ "^" { return rbs_next_token(lexer, pHAT); }
33
+ "&" { return rbs_next_token(lexer, pAMP); }
34
+ "?" { return rbs_next_token(lexer, pQUESTION); }
35
+ "*" { return rbs_next_token(lexer, pSTAR); }
36
+ "**" { return rbs_next_token(lexer, pSTAR2); }
37
+ "." { return rbs_next_token(lexer, pDOT); }
38
+ "..." { return rbs_next_token(lexer, pDOT3); }
39
+ "`" { return rbs_next_token(lexer, tOPERATOR); }
40
+ "`" [^ :\x00] [^`\x00]* "`" { return rbs_next_token(lexer, tQIDENT); }
41
+ "->" { return rbs_next_token(lexer, pARROW); }
42
+ "=>" { return rbs_next_token(lexer, pFATARROW); }
43
+ "=" { return rbs_next_token(lexer, pEQ); }
44
+ ":" { return rbs_next_token(lexer, pCOLON); }
45
+ "::" { return rbs_next_token(lexer, pCOLON2); }
46
+ "<" { return rbs_next_token(lexer, pLT); }
47
+ ">" { return rbs_next_token(lexer, pGT); }
48
+ "[]" { return rbs_next_token(lexer, pAREF_OPR); }
49
+ operator { return rbs_next_token(lexer, tOPERATOR); }
50
+ "--" [^\x00]* { return rbs_next_token(lexer, tINLINECOMMENT); }
51
+
52
+ number = [0-9] [0-9_]*;
53
+ ("-"|"+")? number { return rbs_next_token(lexer, tINTEGER); }
54
+
55
+ "%a{" [^}\x00]* "}" { return rbs_next_token(lexer, tANNOTATION); }
56
+ "%a(" [^)\x00]* ")" { return rbs_next_token(lexer, tANNOTATION); }
57
+ "%a[" [^\]\x00]* "]" { return rbs_next_token(lexer, tANNOTATION); }
58
+ "%a|" [^|\x00]* "|" { return rbs_next_token(lexer, tANNOTATION); }
59
+ "%a<" [^>\x00]* ">" { return rbs_next_token(lexer, tANNOTATION); }
60
+
61
+ "#" (. \ [\x00\uFFFD])* {
62
+ return rbs_next_token(
63
+ lexer,
64
+ lexer->first_token_of_line ? tLINECOMMENT : tCOMMENT
65
+ );
66
+ }
67
+
68
+ "alias" { return rbs_next_token(lexer, kALIAS); }
69
+ "attr_accessor" { return rbs_next_token(lexer, kATTRACCESSOR); }
70
+ "attr_reader" { return rbs_next_token(lexer, kATTRREADER); }
71
+ "attr_writer" { return rbs_next_token(lexer, kATTRWRITER); }
72
+ "bool" { return rbs_next_token(lexer, kBOOL); }
73
+ "bot" { return rbs_next_token(lexer, kBOT); }
74
+ "class" { return rbs_next_token(lexer, kCLASS); }
75
+ "class-alias" { return rbs_next_token(lexer, kCLASSALIAS); }
76
+ "def" { return rbs_next_token(lexer, kDEF); }
77
+ "end" { return rbs_next_token(lexer, kEND); }
78
+ "extend" { return rbs_next_token(lexer, kEXTEND); }
79
+ "false" { return rbs_next_token(lexer, kFALSE); }
80
+ "in" { return rbs_next_token(lexer, kIN); }
81
+ "include" { return rbs_next_token(lexer, kINCLUDE); }
82
+ "instance" { return rbs_next_token(lexer, kINSTANCE); }
83
+ "interface" { return rbs_next_token(lexer, kINTERFACE); }
84
+ "module" { return rbs_next_token(lexer, kMODULE); }
85
+ "module-alias" { return rbs_next_token(lexer, kMODULEALIAS); }
86
+ "module-self" { return rbs_next_token(lexer, kMODULESELF); }
87
+ "nil" { return rbs_next_token(lexer, kNIL); }
88
+ "out" { return rbs_next_token(lexer, kOUT); }
89
+ "prepend" { return rbs_next_token(lexer, kPREPEND); }
90
+ "private" { return rbs_next_token(lexer, kPRIVATE); }
91
+ "public" { return rbs_next_token(lexer, kPUBLIC); }
92
+ "self" { return rbs_next_token(lexer, kSELF); }
93
+ "singleton" { return rbs_next_token(lexer, kSINGLETON); }
94
+ "top" { return rbs_next_token(lexer, kTOP); }
95
+ "true" { return rbs_next_token(lexer, kTRUE); }
96
+ "type" { return rbs_next_token(lexer, kTYPE); }
97
+ "unchecked" { return rbs_next_token(lexer, kUNCHECKED); }
98
+ "untyped" { return rbs_next_token(lexer, kUNTYPED); }
99
+ "void" { return rbs_next_token(lexer, kVOID); }
100
+ "use" { return rbs_next_token(lexer, kUSE); }
101
+ "as" { return rbs_next_token(lexer, kAS); }
102
+ "__todo__" { return rbs_next_token(lexer, k__TODO__); }
103
+ "@rbs" { return rbs_next_token(lexer, kATRBS); }
104
+ "skip" { return rbs_next_token(lexer, kSKIP); }
105
+ "return" { return rbs_next_token(lexer, kRETURN); }
106
+
107
+ unicode_char = "\\u" [0-9a-fA-F]{4};
108
+ oct_char = "\\x" [0-9a-f]{1,2};
109
+ hex_char = "\\" [0-7]{1,3};
110
+
111
+ dqstring = ["] (unicode_char | oct_char | hex_char | "\\" [^xu] | [^\\"\x00])* ["];
112
+ sqstring = ['] ("\\"['\\] | [^'\x00])* ['];
113
+
114
+ dqstring { return rbs_next_token(lexer, tDQSTRING); }
115
+ sqstring { return rbs_next_token(lexer, tSQSTRING); }
116
+ ":" dqstring { return rbs_next_token(lexer, tDQSYMBOL); }
117
+ ":" sqstring { return rbs_next_token(lexer, tSQSYMBOL); }
118
+
119
+ identifier = [a-zA-Z_] word* [!?=]?;
120
+ symbol_opr = ":|" | ":&" | ":/" | ":%" | ":~" | ":`" | ":^"
121
+ | ":==" | ":=~" | ":===" | ":!" | ":!=" | ":!~"
122
+ | ":<" | ":<=" | ":<<" | ":<=>" | ":>" | ":>=" | ":>>"
123
+ | ":-" | ":-@" | ":+" | ":+@" | ":*" | ":**" | ":[]" | ":[]=";
124
+
125
+ global_ident = [0-9]+
126
+ | "-" [a-zA-Z0-9_]
127
+ | [~*$?!@\\/;,.=:<>"&'`+]
128
+ | [^ \t\r\n:;=.,!"$%&()-+~|\\'[\]{}*/<>^\x00]+;
129
+
130
+ ":" identifier { return rbs_next_token(lexer, tSYMBOL); }
131
+ ":@" identifier { return rbs_next_token(lexer, tSYMBOL); }
132
+ ":@@" identifier { return rbs_next_token(lexer, tSYMBOL); }
133
+ ":$" global_ident { return rbs_next_token(lexer, tSYMBOL); }
134
+ symbol_opr { return rbs_next_token(lexer, tSYMBOL); }
135
+
136
+ [a-z] word* { return rbs_next_token(lexer, tLIDENT); }
137
+ [A-Z] word* { return rbs_next_token(lexer, tUIDENT); }
138
+ "_" [a-z0-9_] word* { return rbs_next_token(lexer, tULLIDENT); }
139
+ "_" [A-Z] word* { return rbs_next_token(lexer, tULIDENT); }
140
+ "_" { return rbs_next_token(lexer, tULLIDENT); }
141
+ [a-zA-Z_] word* "!" { return rbs_next_token(lexer, tBANGIDENT); }
142
+ [a-zA-Z_] word* "=" { return rbs_next_token(lexer, tEQIDENT); }
143
+
144
+ "@" [a-zA-Z_] word* { return rbs_next_token(lexer, tAIDENT); }
145
+ "@@" [a-zA-Z_] word* { return rbs_next_token(lexer, tA2IDENT); }
146
+
147
+ "$" global_ident { return rbs_next_token(lexer, tGIDENT); }
148
+
149
+ skip = ([ \t]+|[\r\n]);
150
+
151
+ skip { return rbs_next_token(lexer, tTRIVIA); }
152
+ "\x00" { return rbs_next_eof_token(lexer); }
153
+ * { return rbs_next_token(lexer, ErrorToken); }
154
+ */
155
+ }
data/src/lexstate.c ADDED
@@ -0,0 +1,221 @@
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
+ "tGIDENT", /* Identifiers starting with `$` */
78
+ "tAIDENT", /* Identifiers starting with `@` */
79
+ "tA2IDENT", /* Identifiers starting with `@@` */
80
+ "tBANGIDENT",
81
+ "tEQIDENT",
82
+ "tQIDENT", /* Quoted identifier */
83
+ "pAREF_OPR", /* [] */
84
+ "tOPERATOR", /* Operator identifier */
85
+
86
+ "tCOMMENT",
87
+ "tLINECOMMENT",
88
+ "tINLINECOMMENT",
89
+
90
+ "tTRIVIA",
91
+
92
+ "tDQSTRING", /* Double quoted string */
93
+ "tSQSTRING", /* Single quoted string */
94
+ "tINTEGER", /* Integer */
95
+ "tSYMBOL", /* Symbol */
96
+ "tDQSYMBOL",
97
+ "tSQSYMBOL",
98
+ "tANNOTATION", /* Annotation */
99
+ };
100
+
101
+ const rbs_position_t NullPosition = { -1, -1, -1, -1 };
102
+ const rbs_range_t NULL_RANGE = { { -1, -1, -1, -1 }, { -1, -1, -1, -1 } };
103
+ const rbs_token_t NullToken = { .type = NullType, .range = { { 0 }, { 0 } } };
104
+
105
+ const char *rbs_token_type_str(enum RBSTokenType type) {
106
+ return RBS_TOKENTYPE_NAMES[type];
107
+ }
108
+
109
+ int rbs_token_chars(rbs_token_t tok) {
110
+ return tok.range.end.char_pos - tok.range.start.char_pos;
111
+ }
112
+
113
+ int rbs_token_bytes(rbs_token_t tok) {
114
+ return RBS_RANGE_BYTES(tok.range);
115
+ }
116
+
117
+ unsigned int rbs_peek(rbs_lexer_t *lexer) {
118
+ return lexer->current_code_point;
119
+ }
120
+
121
+ bool rbs_next_char(rbs_lexer_t *lexer, unsigned int *codepoint, size_t *byte_len) {
122
+ if (RBS_UNLIKELY(lexer->current.byte_pos == lexer->end_pos)) {
123
+ return false;
124
+ }
125
+
126
+ const char *start = lexer->string.start + lexer->current.byte_pos;
127
+
128
+ // Fast path for ASCII (single-byte) characters
129
+ if ((unsigned int) *start < 128) {
130
+ *codepoint = (unsigned int) *start;
131
+ *byte_len = 1;
132
+ return true;
133
+ }
134
+
135
+ *byte_len = lexer->encoding->char_width((const uint8_t *) start, (ptrdiff_t) (lexer->string.end - start));
136
+
137
+ if (*byte_len == 0) {
138
+ // Invalid byte under the active encoding. Map it to a sentinel code
139
+ // point (U+FFFD) and advance one byte so the lexer always makes
140
+ // progress. Token rules that scan until a delimiter exclude this
141
+ // sentinel, so an invalid byte surfaces as an ErrorToken instead of
142
+ // being silently swallowed.
143
+ *byte_len = 1;
144
+ *codepoint = 0xFFFD;
145
+ } else if (*byte_len == 1) {
146
+ *codepoint = (unsigned int) *start;
147
+ } else {
148
+ *codepoint = 12523; // Dummy data for "ル" from "ルビー" (Ruby) in Unicode
149
+ }
150
+
151
+ return true;
152
+ }
153
+
154
+ void rbs_skip(rbs_lexer_t *lexer) {
155
+ RBS_ASSERT(lexer->current_character_bytes > 0, "rbs_skip called with current_character_bytes == 0");
156
+
157
+ if (RBS_UNLIKELY(lexer->current_code_point == '\0')) {
158
+ return;
159
+ }
160
+
161
+ unsigned int codepoint;
162
+ size_t byte_len;
163
+
164
+ lexer->current.byte_pos += lexer->current_character_bytes;
165
+ lexer->current.char_pos += 1;
166
+ if (lexer->current_code_point == '\n') {
167
+ lexer->current.line += 1;
168
+ lexer->current.column = 0;
169
+ lexer->first_token_of_line = true;
170
+ } else {
171
+ lexer->current.column += 1;
172
+ }
173
+
174
+ if (rbs_next_char(lexer, &codepoint, &byte_len)) {
175
+ lexer->current_code_point = codepoint;
176
+ lexer->current_character_bytes = byte_len;
177
+ } else {
178
+ lexer->current_character_bytes = 1;
179
+ lexer->current_code_point = '\0';
180
+ }
181
+ }
182
+
183
+ rbs_token_t rbs_next_token(rbs_lexer_t *lexer, enum RBSTokenType type) {
184
+ rbs_token_t t;
185
+
186
+ t.type = type;
187
+ t.range.start = lexer->start;
188
+ t.range.end = lexer->current;
189
+ lexer->start = lexer->current;
190
+ if (type != tTRIVIA) {
191
+ lexer->first_token_of_line = false;
192
+ }
193
+
194
+ return t;
195
+ }
196
+
197
+ rbs_token_t rbs_next_eof_token(rbs_lexer_t *lexer) {
198
+ if ((size_t) lexer->current.byte_pos == rbs_string_len(lexer->string) + 1) {
199
+ // End of String
200
+ rbs_token_t t;
201
+ t.type = pEOF;
202
+ t.range.start = lexer->start;
203
+ t.range.end = lexer->start;
204
+ lexer->start = lexer->current;
205
+
206
+ return t;
207
+ } else {
208
+ // NULL byte in the middle of the string
209
+ return rbs_next_token(lexer, pEOF);
210
+ }
211
+ }
212
+
213
+ void rbs_skipn(rbs_lexer_t *lexer, size_t size) {
214
+ for (size_t i = 0; i < size; i++) {
215
+ rbs_skip(lexer);
216
+ }
217
+ }
218
+
219
+ char *rbs_peek_token(rbs_lexer_t *lexer, rbs_token_t tok) {
220
+ return (char *) lexer->string.start + tok.range.start.byte_pos;
221
+ }
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
+ }