rbs 3.9.5 → 4.0.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 (330) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +74 -0
  3. data/.clangd +2 -0
  4. data/.github/dependabot.yml +14 -14
  5. data/.github/workflows/bundle-update.yml +60 -0
  6. data/.github/workflows/c-check.yml +58 -0
  7. data/.github/workflows/comments.yml +5 -3
  8. data/.github/workflows/dependabot.yml +2 -2
  9. data/.github/workflows/ruby.yml +40 -32
  10. data/.github/workflows/rust.yml +95 -0
  11. data/.github/workflows/typecheck.yml +2 -2
  12. data/.github/workflows/windows.yml +3 -3
  13. data/.gitignore +4 -0
  14. data/.rubocop.yml +2 -2
  15. data/.vscode/extensions.json +5 -0
  16. data/.vscode/settings.json +19 -0
  17. data/CHANGELOG.md +284 -0
  18. data/README.md +38 -1
  19. data/Rakefile +144 -29
  20. data/Steepfile +2 -0
  21. data/config.yml +634 -62
  22. data/core/array.rbs +307 -227
  23. data/core/basic_object.rbs +9 -8
  24. data/core/binding.rbs +0 -2
  25. data/core/builtin.rbs +2 -2
  26. data/core/class.rbs +6 -5
  27. data/core/comparable.rbs +55 -34
  28. data/core/complex.rbs +104 -78
  29. data/core/dir.rbs +61 -49
  30. data/core/encoding.rbs +12 -15
  31. data/core/enumerable.rbs +188 -87
  32. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  33. data/core/enumerator.rbs +65 -2
  34. data/core/errno.rbs +11 -2
  35. data/core/errors.rbs +58 -29
  36. data/core/exception.rbs +13 -13
  37. data/core/fiber.rbs +74 -54
  38. data/core/file.rbs +280 -177
  39. data/core/file_test.rbs +3 -3
  40. data/core/float.rbs +257 -92
  41. data/core/gc.rbs +425 -281
  42. data/core/hash.rbs +1045 -739
  43. data/core/integer.rbs +135 -137
  44. data/core/io/buffer.rbs +53 -42
  45. data/core/io/wait.rbs +13 -35
  46. data/core/io.rbs +196 -148
  47. data/core/kernel.rbs +216 -155
  48. data/core/marshal.rbs +4 -4
  49. data/core/match_data.rbs +15 -13
  50. data/core/math.rbs +107 -66
  51. data/core/method.rbs +69 -33
  52. data/core/module.rbs +244 -106
  53. data/core/nil_class.rbs +7 -6
  54. data/core/numeric.rbs +74 -63
  55. data/core/object.rbs +9 -11
  56. data/core/object_space.rbs +30 -23
  57. data/core/pathname.rbs +1322 -0
  58. data/core/proc.rbs +95 -58
  59. data/core/process.rbs +222 -202
  60. data/core/ractor.rbs +371 -515
  61. data/core/random.rbs +21 -3
  62. data/core/range.rbs +159 -57
  63. data/core/rational.rbs +60 -89
  64. data/core/rbs/unnamed/argf.rbs +60 -53
  65. data/core/rbs/unnamed/env_class.rbs +19 -14
  66. data/core/rbs/unnamed/main_class.rbs +123 -0
  67. data/core/rbs/unnamed/random.rbs +11 -118
  68. data/core/regexp.rbs +258 -214
  69. data/core/ruby.rbs +53 -0
  70. data/core/ruby_vm.rbs +38 -34
  71. data/core/rubygems/config_file.rbs +5 -5
  72. data/core/rubygems/errors.rbs +4 -71
  73. data/core/rubygems/requirement.rbs +5 -5
  74. data/core/rubygems/rubygems.rbs +16 -82
  75. data/core/rubygems/version.rbs +2 -3
  76. data/core/set.rbs +490 -360
  77. data/core/signal.rbs +26 -16
  78. data/core/string.rbs +3303 -1365
  79. data/core/struct.rbs +27 -26
  80. data/core/symbol.rbs +41 -34
  81. data/core/thread.rbs +135 -74
  82. data/core/time.rbs +81 -50
  83. data/core/trace_point.rbs +41 -35
  84. data/core/true_class.rbs +2 -2
  85. data/core/unbound_method.rbs +24 -16
  86. data/core/warning.rbs +7 -7
  87. data/docs/aliases.md +79 -0
  88. data/docs/collection.md +3 -3
  89. data/docs/config.md +171 -0
  90. data/docs/encoding.md +56 -0
  91. data/docs/gem.md +0 -1
  92. data/docs/inline.md +576 -0
  93. data/docs/sigs.md +3 -3
  94. data/docs/syntax.md +46 -16
  95. data/docs/type_fingerprint.md +21 -0
  96. data/exe/rbs +1 -1
  97. data/ext/rbs_extension/ast_translation.c +1513 -0
  98. data/ext/rbs_extension/ast_translation.h +37 -0
  99. data/ext/rbs_extension/class_constants.c +185 -0
  100. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +22 -1
  101. data/ext/rbs_extension/compat.h +10 -0
  102. data/ext/rbs_extension/extconf.rb +25 -1
  103. data/ext/rbs_extension/legacy_location.c +294 -0
  104. data/ext/rbs_extension/legacy_location.h +82 -0
  105. data/ext/rbs_extension/main.c +468 -24
  106. data/ext/rbs_extension/rbs_extension.h +6 -21
  107. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  108. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  109. data/include/rbs/ast.h +1022 -0
  110. data/include/rbs/defines.h +86 -0
  111. data/include/rbs/lexer.h +206 -0
  112. data/include/rbs/location.h +40 -0
  113. data/include/rbs/parser.h +153 -0
  114. data/include/rbs/string.h +47 -0
  115. data/include/rbs/util/rbs_allocator.h +59 -0
  116. data/include/rbs/util/rbs_assert.h +20 -0
  117. data/include/rbs/util/rbs_buffer.h +83 -0
  118. data/include/rbs/util/rbs_constant_pool.h +6 -70
  119. data/include/rbs/util/rbs_encoding.h +282 -0
  120. data/include/rbs/util/rbs_unescape.h +24 -0
  121. data/include/rbs.h +9 -2
  122. data/lib/rbs/annotate/formatter.rb +3 -13
  123. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  124. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  125. data/lib/rbs/ast/annotation.rb +1 -1
  126. data/lib/rbs/ast/comment.rb +1 -1
  127. data/lib/rbs/ast/declarations.rb +10 -10
  128. data/lib/rbs/ast/members.rb +14 -14
  129. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  130. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  131. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  132. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  133. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  134. data/lib/rbs/ast/ruby/members.rb +723 -0
  135. data/lib/rbs/ast/type_param.rb +24 -4
  136. data/lib/rbs/buffer.rb +105 -20
  137. data/lib/rbs/cli/diff.rb +16 -15
  138. data/lib/rbs/cli/validate.rb +63 -126
  139. data/lib/rbs/cli.rb +56 -24
  140. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  141. data/lib/rbs/collection/sources/git.rb +1 -0
  142. data/lib/rbs/collection.rb +0 -1
  143. data/lib/rbs/definition.rb +6 -1
  144. data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
  145. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  146. data/lib/rbs/definition_builder.rb +177 -20
  147. data/lib/rbs/diff.rb +7 -1
  148. data/lib/rbs/environment/class_entry.rb +69 -0
  149. data/lib/rbs/environment/module_entry.rb +66 -0
  150. data/lib/rbs/environment.rb +402 -214
  151. data/lib/rbs/environment_loader.rb +2 -8
  152. data/lib/rbs/errors.rb +31 -21
  153. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  154. data/lib/rbs/inline_parser.rb +542 -0
  155. data/lib/rbs/location_aux.rb +36 -4
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +0 -7
  159. data/lib/rbs/parser_aux.rb +35 -7
  160. data/lib/rbs/prototype/helpers.rb +57 -0
  161. data/lib/rbs/prototype/rb.rb +3 -28
  162. data/lib/rbs/prototype/rbi.rb +3 -20
  163. data/lib/rbs/prototype/runtime.rb +10 -2
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  166. data/lib/rbs/source.rb +99 -0
  167. data/lib/rbs/subtractor.rb +7 -4
  168. data/lib/rbs/test/type_check.rb +19 -2
  169. data/lib/rbs/type_name.rb +1 -8
  170. data/lib/rbs/types.rb +91 -79
  171. data/lib/rbs/unit_test/convertibles.rb +1 -0
  172. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  173. data/lib/rbs/validator.rb +2 -2
  174. data/lib/rbs/version.rb +1 -1
  175. data/lib/rbs.rb +13 -2
  176. data/lib/rdoc/discover.rb +1 -1
  177. data/lib/rdoc_plugin/parser.rb +3 -3
  178. data/rbs.gemspec +4 -2
  179. data/rust/.gitignore +1 -0
  180. data/rust/Cargo.lock +378 -0
  181. data/rust/Cargo.toml +7 -0
  182. data/rust/ruby-rbs/Cargo.toml +22 -0
  183. data/rust/ruby-rbs/build.rs +764 -0
  184. data/rust/ruby-rbs/examples/locations.rs +60 -0
  185. data/rust/ruby-rbs/src/lib.rs +1 -0
  186. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  187. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  188. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  189. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  190. data/rust/ruby-rbs-sys/build.rs +204 -0
  191. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  192. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  193. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  194. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  195. data/schema/typeParam.json +17 -1
  196. data/sig/ancestor_builder.rbs +1 -1
  197. data/sig/annotate/formatter.rbs +2 -2
  198. data/sig/annotate/rdoc_annotater.rbs +1 -1
  199. data/sig/ast/ruby/annotations.rbs +421 -0
  200. data/sig/ast/ruby/comment_block.rbs +127 -0
  201. data/sig/ast/ruby/declarations.rbs +158 -0
  202. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  203. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  204. data/sig/ast/ruby/members.rbs +178 -0
  205. data/sig/buffer.rbs +63 -5
  206. data/sig/cli/diff.rbs +5 -11
  207. data/sig/cli/validate.rbs +12 -8
  208. data/sig/cli.rbs +18 -18
  209. data/sig/definition.rbs +6 -0
  210. data/sig/definition_builder.rbs +3 -1
  211. data/sig/environment/class_entry.rbs +50 -0
  212. data/sig/environment/module_entry.rbs +50 -0
  213. data/sig/environment.rbs +94 -87
  214. data/sig/errors.rbs +26 -20
  215. data/sig/inline_parser/comment_association.rbs +71 -0
  216. data/sig/inline_parser.rbs +124 -0
  217. data/sig/location.rbs +32 -7
  218. data/sig/locator.rbs +0 -2
  219. data/sig/manifest.yaml +0 -1
  220. data/sig/method_builder.rbs +9 -4
  221. data/sig/namespace.rbs +0 -5
  222. data/sig/parser.rbs +67 -13
  223. data/sig/prototype/helpers.rbs +2 -0
  224. data/sig/resolver/type_name_resolver.rbs +35 -7
  225. data/sig/source.rbs +48 -0
  226. data/sig/type_param.rbs +13 -8
  227. data/sig/typename.rbs +0 -5
  228. data/sig/types.rbs +10 -8
  229. data/sig/unit_test/spy.rbs +0 -8
  230. data/sig/unit_test/type_assertions.rbs +11 -0
  231. data/src/ast.c +1604 -0
  232. data/src/lexer.c +3194 -0
  233. data/src/lexer.re +154 -0
  234. data/src/lexstate.c +212 -0
  235. data/src/location.c +31 -0
  236. data/src/parser.c +4205 -0
  237. data/src/string.c +41 -0
  238. data/src/util/rbs_allocator.c +165 -0
  239. data/src/util/rbs_assert.c +19 -0
  240. data/src/util/rbs_buffer.c +54 -0
  241. data/src/util/rbs_constant_pool.c +18 -92
  242. data/src/util/rbs_encoding.c +21308 -0
  243. data/src/util/rbs_unescape.c +167 -0
  244. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  245. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  246. data/stdlib/cgi/0/core.rbs +9 -393
  247. data/stdlib/cgi/0/manifest.yaml +1 -0
  248. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  249. data/stdlib/coverage/0/coverage.rbs +7 -4
  250. data/stdlib/date/0/date.rbs +92 -79
  251. data/stdlib/date/0/date_time.rbs +25 -24
  252. data/stdlib/delegate/0/delegator.rbs +10 -7
  253. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  254. data/stdlib/digest/0/digest.rbs +110 -0
  255. data/stdlib/erb/0/erb.rbs +748 -347
  256. data/stdlib/etc/0/etc.rbs +55 -50
  257. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  258. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  259. data/stdlib/io-console/0/io-console.rbs +2 -2
  260. data/stdlib/json/0/json.rbs +226 -179
  261. data/stdlib/monitor/0/monitor.rbs +3 -3
  262. data/stdlib/net-http/0/net-http.rbs +162 -134
  263. data/stdlib/objspace/0/objspace.rbs +17 -34
  264. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  265. data/stdlib/open3/0/open3.rbs +469 -10
  266. data/stdlib/openssl/0/openssl.rbs +475 -357
  267. data/stdlib/optparse/0/optparse.rbs +26 -17
  268. data/stdlib/pathname/0/pathname.rbs +11 -1381
  269. data/stdlib/pp/0/pp.rbs +9 -8
  270. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  271. data/stdlib/pstore/0/pstore.rbs +35 -30
  272. data/stdlib/psych/0/psych.rbs +65 -12
  273. data/stdlib/psych/0/store.rbs +2 -4
  274. data/stdlib/pty/0/pty.rbs +9 -6
  275. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  276. data/stdlib/rdoc/0/code_object.rbs +4 -3
  277. data/stdlib/rdoc/0/comment.rbs +2 -0
  278. data/stdlib/rdoc/0/options.rbs +76 -0
  279. data/stdlib/rdoc/0/parser.rbs +1 -1
  280. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  281. data/stdlib/rdoc/0/store.rbs +2 -2
  282. data/stdlib/resolv/0/resolv.rbs +25 -68
  283. data/stdlib/ripper/0/ripper.rbs +25 -19
  284. data/stdlib/securerandom/0/manifest.yaml +2 -0
  285. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  286. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  287. data/stdlib/singleton/0/singleton.rbs +3 -0
  288. data/stdlib/socket/0/addrinfo.rbs +9 -9
  289. data/stdlib/socket/0/basic_socket.rbs +3 -3
  290. data/stdlib/socket/0/ip_socket.rbs +10 -8
  291. data/stdlib/socket/0/socket.rbs +23 -10
  292. data/stdlib/socket/0/tcp_server.rbs +1 -1
  293. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  294. data/stdlib/socket/0/udp_socket.rbs +1 -1
  295. data/stdlib/socket/0/unix_server.rbs +1 -1
  296. data/stdlib/stringio/0/stringio.rbs +1177 -85
  297. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  298. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  299. data/stdlib/time/0/time.rbs +8 -6
  300. data/stdlib/timeout/0/timeout.rbs +63 -7
  301. data/stdlib/tsort/0/cyclic.rbs +3 -0
  302. data/stdlib/tsort/0/tsort.rbs +7 -6
  303. data/stdlib/uri/0/common.rbs +42 -20
  304. data/stdlib/uri/0/file.rbs +3 -3
  305. data/stdlib/uri/0/generic.rbs +26 -18
  306. data/stdlib/uri/0/http.rbs +2 -2
  307. data/stdlib/uri/0/ldap.rbs +2 -2
  308. data/stdlib/uri/0/mailto.rbs +3 -3
  309. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  310. data/stdlib/zlib/0/deflate.rbs +4 -3
  311. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  312. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  313. data/stdlib/zlib/0/inflate.rbs +1 -1
  314. data/stdlib/zlib/0/need_dict.rbs +1 -1
  315. data/stdlib/zlib/0/zstream.rbs +1 -0
  316. metadata +121 -18
  317. data/ext/rbs_extension/lexer.c +0 -2728
  318. data/ext/rbs_extension/lexer.h +0 -179
  319. data/ext/rbs_extension/lexer.re +0 -147
  320. data/ext/rbs_extension/lexstate.c +0 -175
  321. data/ext/rbs_extension/location.c +0 -325
  322. data/ext/rbs_extension/location.h +0 -85
  323. data/ext/rbs_extension/parser.c +0 -2982
  324. data/ext/rbs_extension/parser.h +0 -18
  325. data/ext/rbs_extension/parserstate.c +0 -411
  326. data/ext/rbs_extension/parserstate.h +0 -163
  327. data/ext/rbs_extension/unescape.c +0 -32
  328. data/include/rbs/ruby_objs.h +0 -72
  329. data/src/constants.c +0 -153
  330. data/src/ruby_objs.c +0 -799
data/src/lexer.re ADDED
@@ -0,0 +1,154 @@
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])* {
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
+ "nil" { return rbs_next_token(lexer, kNIL); }
87
+ "out" { return rbs_next_token(lexer, kOUT); }
88
+ "prepend" { return rbs_next_token(lexer, kPREPEND); }
89
+ "private" { return rbs_next_token(lexer, kPRIVATE); }
90
+ "public" { return rbs_next_token(lexer, kPUBLIC); }
91
+ "self" { return rbs_next_token(lexer, kSELF); }
92
+ "singleton" { return rbs_next_token(lexer, kSINGLETON); }
93
+ "top" { return rbs_next_token(lexer, kTOP); }
94
+ "true" { return rbs_next_token(lexer, kTRUE); }
95
+ "type" { return rbs_next_token(lexer, kTYPE); }
96
+ "unchecked" { return rbs_next_token(lexer, kUNCHECKED); }
97
+ "untyped" { return rbs_next_token(lexer, kUNTYPED); }
98
+ "void" { return rbs_next_token(lexer, kVOID); }
99
+ "use" { return rbs_next_token(lexer, kUSE); }
100
+ "as" { return rbs_next_token(lexer, kAS); }
101
+ "__todo__" { return rbs_next_token(lexer, k__TODO__); }
102
+ "@rbs" { return rbs_next_token(lexer, kATRBS); }
103
+ "skip" { return rbs_next_token(lexer, kSKIP); }
104
+ "return" { return rbs_next_token(lexer, kRETURN); }
105
+
106
+ unicode_char = "\\u" [0-9a-fA-F]{4};
107
+ oct_char = "\\x" [0-9a-f]{1,2};
108
+ hex_char = "\\" [0-7]{1,3};
109
+
110
+ dqstring = ["] (unicode_char | oct_char | hex_char | "\\" [^xu] | [^\\"\x00])* ["];
111
+ sqstring = ['] ("\\"['\\] | [^'\x00])* ['];
112
+
113
+ dqstring { return rbs_next_token(lexer, tDQSTRING); }
114
+ sqstring { return rbs_next_token(lexer, tSQSTRING); }
115
+ ":" dqstring { return rbs_next_token(lexer, tDQSYMBOL); }
116
+ ":" sqstring { return rbs_next_token(lexer, tSQSYMBOL); }
117
+
118
+ identifier = [a-zA-Z_] word* [!?=]?;
119
+ symbol_opr = ":|" | ":&" | ":/" | ":%" | ":~" | ":`" | ":^"
120
+ | ":==" | ":=~" | ":===" | ":!" | ":!=" | ":!~"
121
+ | ":<" | ":<=" | ":<<" | ":<=>" | ":>" | ":>=" | ":>>"
122
+ | ":-" | ":-@" | ":+" | ":+@" | ":*" | ":**" | ":[]" | ":[]=";
123
+
124
+ global_ident = [0-9]+
125
+ | "-" [a-zA-Z0-9_]
126
+ | [~*$?!@\\/;,.=:<>"&'`+]
127
+ | [^ \t\r\n:;=.,!"$%&()-+~|\\'[\]{}*/<>^\x00]+;
128
+
129
+ ":" identifier { return rbs_next_token(lexer, tSYMBOL); }
130
+ ":@" identifier { return rbs_next_token(lexer, tSYMBOL); }
131
+ ":@@" identifier { return rbs_next_token(lexer, tSYMBOL); }
132
+ ":$" global_ident { return rbs_next_token(lexer, tSYMBOL); }
133
+ symbol_opr { return rbs_next_token(lexer, tSYMBOL); }
134
+
135
+ [a-z] word* { return rbs_next_token(lexer, tLIDENT); }
136
+ [A-Z] word* { return rbs_next_token(lexer, tUIDENT); }
137
+ "_" [a-z0-9_] word* { return rbs_next_token(lexer, tULLIDENT); }
138
+ "_" [A-Z] word* { return rbs_next_token(lexer, tULIDENT); }
139
+ "_" { return rbs_next_token(lexer, tULLIDENT); }
140
+ [a-zA-Z_] word* "!" { return rbs_next_token(lexer, tBANGIDENT); }
141
+ [a-zA-Z_] word* "=" { return rbs_next_token(lexer, tEQIDENT); }
142
+
143
+ "@" [a-zA-Z_] word* { return rbs_next_token(lexer, tAIDENT); }
144
+ "@@" [a-zA-Z_] word* { return rbs_next_token(lexer, tA2IDENT); }
145
+
146
+ "$" global_ident { return rbs_next_token(lexer, tGIDENT); }
147
+
148
+ skip = ([ \t]+|[\r\n]);
149
+
150
+ skip { return rbs_next_token(lexer, tTRIVIA); }
151
+ "\x00" { return rbs_next_eof_token(lexer); }
152
+ * { return rbs_next_token(lexer, ErrorToken); }
153
+ */
154
+ }
data/src/lexstate.c ADDED
@@ -0,0 +1,212 @@
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
+
72
+ "tLIDENT", /* Identifiers starting with lower case */
73
+ "tUIDENT", /* Identifiers starting with upper case */
74
+ "tULIDENT", /* Identifiers starting with `_` */
75
+ "tULLIDENT",
76
+ "tGIDENT", /* Identifiers starting with `$` */
77
+ "tAIDENT", /* Identifiers starting with `@` */
78
+ "tA2IDENT", /* Identifiers starting with `@@` */
79
+ "tBANGIDENT",
80
+ "tEQIDENT",
81
+ "tQIDENT", /* Quoted identifier */
82
+ "pAREF_OPR", /* [] */
83
+ "tOPERATOR", /* Operator identifier */
84
+
85
+ "tCOMMENT",
86
+ "tLINECOMMENT",
87
+ "tINLINECOMMENT",
88
+
89
+ "tTRIVIA",
90
+
91
+ "tDQSTRING", /* Double quoted string */
92
+ "tSQSTRING", /* Single quoted string */
93
+ "tINTEGER", /* Integer */
94
+ "tSYMBOL", /* Symbol */
95
+ "tDQSYMBOL",
96
+ "tSQSYMBOL",
97
+ "tANNOTATION", /* Annotation */
98
+ };
99
+
100
+ const rbs_position_t NullPosition = { -1, -1, -1, -1 };
101
+ const rbs_range_t NULL_RANGE = { { -1, -1, -1, -1 }, { -1, -1, -1, -1 } };
102
+ const rbs_token_t NullToken = { .type = NullType, .range = { { 0 }, { 0 } } };
103
+
104
+ const char *rbs_token_type_str(enum RBSTokenType type) {
105
+ return RBS_TOKENTYPE_NAMES[type];
106
+ }
107
+
108
+ int rbs_token_chars(rbs_token_t tok) {
109
+ return tok.range.end.char_pos - tok.range.start.char_pos;
110
+ }
111
+
112
+ int rbs_token_bytes(rbs_token_t tok) {
113
+ return RBS_RANGE_BYTES(tok.range);
114
+ }
115
+
116
+ unsigned int rbs_peek(rbs_lexer_t *lexer) {
117
+ return lexer->current_code_point;
118
+ }
119
+
120
+ bool rbs_next_char(rbs_lexer_t *lexer, unsigned int *codepoint, size_t *byte_len) {
121
+ if (RBS_UNLIKELY(lexer->current.byte_pos == lexer->end_pos)) {
122
+ return false;
123
+ }
124
+
125
+ const char *start = lexer->string.start + lexer->current.byte_pos;
126
+
127
+ // Fast path for ASCII (single-byte) characters
128
+ if ((unsigned int) *start < 128) {
129
+ *codepoint = (unsigned int) *start;
130
+ *byte_len = 1;
131
+ return true;
132
+ }
133
+
134
+ *byte_len = lexer->encoding->char_width((const uint8_t *) start, (ptrdiff_t) (lexer->string.end - start));
135
+
136
+ if (*byte_len == 1) {
137
+ *codepoint = (unsigned int) *start;
138
+ } else {
139
+ *codepoint = 12523; // Dummy data for "ル" from "ルビー" (Ruby) in Unicode
140
+ }
141
+
142
+ return true;
143
+ }
144
+
145
+ void rbs_skip(rbs_lexer_t *lexer) {
146
+ RBS_ASSERT(lexer->current_character_bytes > 0, "rbs_skip called with current_character_bytes == 0");
147
+
148
+ if (RBS_UNLIKELY(lexer->current_code_point == '\0')) {
149
+ return;
150
+ }
151
+
152
+ unsigned int codepoint;
153
+ size_t byte_len;
154
+
155
+ lexer->current.byte_pos += lexer->current_character_bytes;
156
+ lexer->current.char_pos += 1;
157
+ if (lexer->current_code_point == '\n') {
158
+ lexer->current.line += 1;
159
+ lexer->current.column = 0;
160
+ lexer->first_token_of_line = true;
161
+ } else {
162
+ lexer->current.column += 1;
163
+ }
164
+
165
+ if (rbs_next_char(lexer, &codepoint, &byte_len)) {
166
+ lexer->current_code_point = codepoint;
167
+ lexer->current_character_bytes = byte_len;
168
+ } else {
169
+ lexer->current_character_bytes = 1;
170
+ lexer->current_code_point = '\0';
171
+ }
172
+ }
173
+
174
+ rbs_token_t rbs_next_token(rbs_lexer_t *lexer, enum RBSTokenType type) {
175
+ rbs_token_t t;
176
+
177
+ t.type = type;
178
+ t.range.start = lexer->start;
179
+ t.range.end = lexer->current;
180
+ lexer->start = lexer->current;
181
+ if (type != tTRIVIA) {
182
+ lexer->first_token_of_line = false;
183
+ }
184
+
185
+ return t;
186
+ }
187
+
188
+ rbs_token_t rbs_next_eof_token(rbs_lexer_t *lexer) {
189
+ if ((size_t) lexer->current.byte_pos == rbs_string_len(lexer->string) + 1) {
190
+ // End of String
191
+ rbs_token_t t;
192
+ t.type = pEOF;
193
+ t.range.start = lexer->start;
194
+ t.range.end = lexer->start;
195
+ lexer->start = lexer->current;
196
+
197
+ return t;
198
+ } else {
199
+ // NULL byte in the middle of the string
200
+ return rbs_next_token(lexer, pEOF);
201
+ }
202
+ }
203
+
204
+ void rbs_skipn(rbs_lexer_t *lexer, size_t size) {
205
+ for (size_t i = 0; i < size; i++) {
206
+ rbs_skip(lexer);
207
+ }
208
+ }
209
+
210
+ char *rbs_peek_token(rbs_lexer_t *lexer, rbs_token_t tok) {
211
+ return (char *) lexer->string.start + tok.range.start.byte_pos;
212
+ }
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
+ }