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
@@ -1,179 +0,0 @@
1
- #ifndef RBS__LEXER_H
2
- #define RBS__LEXER_H
3
-
4
- enum TokenType {
5
- NullType, /* (Nothing) */
6
- pEOF, /* EOF */
7
- ErrorToken, /* Error */
8
-
9
- pLPAREN, /* ( */
10
- pRPAREN, /* ) */
11
- pCOLON, /* : */
12
- pCOLON2, /* :: */
13
- pLBRACKET, /* [ */
14
- pRBRACKET, /* ] */
15
- pLBRACE, /* { */
16
- pRBRACE, /* } */
17
- pHAT, /* ^ */
18
- pARROW, /* -> */
19
- pFATARROW, /* => */
20
- pCOMMA, /* , */
21
- pBAR, /* | */
22
- pAMP, /* & */
23
- pSTAR, /* * */
24
- pSTAR2, /* ** */
25
- pDOT, /* . */
26
- pDOT3, /* ... */
27
- pBANG, /* ! */
28
- pQUESTION, /* ? */
29
- pLT, /* < */
30
- pEQ, /* = */
31
-
32
- kALIAS, /* alias */
33
- kATTRACCESSOR, /* attr_accessor */
34
- kATTRREADER, /* attr_reader */
35
- kATTRWRITER, /* attr_writer */
36
- kBOOL, /* bool */
37
- kBOT, /* bot */
38
- kCLASS, /* class */
39
- kDEF, /* def */
40
- kEND, /* end */
41
- kEXTEND, /* extend */
42
- kFALSE, /* false */
43
- kIN, /* in */
44
- kINCLUDE, /* include */
45
- kINSTANCE, /* instance */
46
- kINTERFACE, /* interface */
47
- kMODULE, /* module */
48
- kNIL, /* nil */
49
- kOUT, /* out */
50
- kPREPEND, /* prepend */
51
- kPRIVATE, /* private */
52
- kPUBLIC, /* public */
53
- kSELF, /* self */
54
- kSINGLETON, /* singleton */
55
- kTOP, /* top */
56
- kTRUE, /* true */
57
- kTYPE, /* type */
58
- kUNCHECKED, /* unchecked */
59
- kUNTYPED, /* untyped */
60
- kVOID, /* void */
61
- kUSE, /* use */
62
- kAS, /* as */
63
- k__TODO__, /* __todo__ */
64
-
65
- tLIDENT, /* Identifiers starting with lower case */
66
- tUIDENT, /* Identifiers starting with upper case */
67
- tULIDENT, /* Identifiers starting with `_` followed by upper case */
68
- tULLIDENT, /* Identifiers starting with `_` followed by lower case */
69
- tGIDENT, /* Identifiers starting with `$` */
70
- tAIDENT, /* Identifiers starting with `@` */
71
- tA2IDENT, /* Identifiers starting with `@@` */
72
- tBANGIDENT, /* Identifiers ending with `!` */
73
- tEQIDENT, /* Identifiers ending with `=` */
74
- tQIDENT, /* Quoted identifier */
75
- pAREF_OPR, /* [] */
76
- tOPERATOR, /* Operator identifier */
77
-
78
- tCOMMENT, /* Comment */
79
- tLINECOMMENT, /* Comment of all line */
80
-
81
- tTRIVIA, /* Trivia tokens -- space and new line */
82
-
83
- tDQSTRING, /* Double quoted string */
84
- tSQSTRING, /* Single quoted string */
85
- tINTEGER, /* Integer */
86
- tSYMBOL, /* Symbol */
87
- tDQSYMBOL, /* Double quoted symbol */
88
- tSQSYMBOL, /* Single quoted symbol */
89
- tANNOTATION, /* Annotation */
90
- };
91
-
92
- /**
93
- * The `byte_pos` (or `char_pos`) is the primary data.
94
- * The rest are cache.
95
- *
96
- * They can be computed from `byte_pos` (or `char_pos`), but it needs full scan from the beginning of the string (depending on the encoding).
97
- * */
98
- typedef struct {
99
- int byte_pos;
100
- int char_pos;
101
- int line;
102
- int column;
103
- } position;
104
-
105
- typedef struct {
106
- position start;
107
- position end;
108
- } range;
109
-
110
- typedef struct {
111
- enum TokenType type;
112
- range range;
113
- } token;
114
-
115
- /**
116
- * The lexer state is the curren token.
117
- *
118
- * ```
119
- * ... "a string token"
120
- * ^ start position
121
- * ^ current position
122
- * ~~~~~~ Token => "a str
123
- * ```
124
- * */
125
- typedef struct {
126
- VALUE string;
127
- int start_pos; /* The character position that defines the start of the input */
128
- int end_pos; /* The character position that defines the end of the input */
129
- position current; /* The current position */
130
- position start; /* The start position of the current token */
131
- bool first_token_of_line; /* This flag is used for tLINECOMMENT */
132
- unsigned int last_char; /* Last peeked character */
133
- } lexstate;
134
-
135
- extern token NullToken;
136
- extern position NullPosition;
137
- extern range NULL_RANGE;
138
-
139
- char *peek_token(lexstate *state, token tok);
140
- int token_chars(token tok);
141
- int token_bytes(token tok);
142
-
143
- #define null_position_p(pos) (pos.byte_pos == -1)
144
- #define null_range_p(range) (range.start.byte_pos == -1)
145
- #define nonnull_pos_or(pos1, pos2) (null_position_p(pos1) ? pos2 : pos1)
146
- #define RANGE_BYTES(range) (range.end.byte_pos - range.start.byte_pos)
147
-
148
- const char *token_type_str(enum TokenType type);
149
-
150
- /**
151
- * Read next character.
152
- * */
153
- unsigned int peek(lexstate *state);
154
-
155
- /**
156
- * Skip one character.
157
- * */
158
- void rbs_skip(lexstate *state);
159
-
160
- /**
161
- * Skip n characters.
162
- * */
163
- void skipn(lexstate *state, size_t size);
164
-
165
- /**
166
- * Return new token with given type.
167
- * */
168
- token next_token(lexstate *state, enum TokenType type);
169
-
170
- /**
171
- * Return new token with EOF type.
172
- * */
173
- token next_eof_token(lexstate *state);
174
-
175
- token rbsparser_next_token(lexstate *state);
176
-
177
- void print_token(token tok);
178
-
179
- #endif
@@ -1,147 +0,0 @@
1
- #include "rbs_extension.h"
2
-
3
- token rbsparser_next_token(lexstate *state) {
4
- lexstate backup;
5
-
6
- backup = *state;
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 = "peek(state)";
14
- re2c:define:YYSKIP = "rbs_skip(state);";
15
- re2c:define:YYBACKUP = "backup = *state;";
16
- re2c:define:YYRESTORE = "*state = backup;";
17
- re2c:yyfill:enable = 0;
18
-
19
- word = [a-zA-Z0-9_];
20
-
21
- operator = "/" | "~" | "[]=" | "!" | "!=" | "!~" | "-" | "-@" | "+" | "+@"
22
- | "==" | "===" | "=~" | "<<" | "<=" | "<=>" | ">" | ">=" | ">>" | "%";
23
-
24
- "(" { return next_token(state, pLPAREN); }
25
- ")" { return next_token(state, pRPAREN); }
26
- "[" { return next_token(state, pLBRACKET); }
27
- "]" { return next_token(state, pRBRACKET); }
28
- "{" { return next_token(state, pLBRACE); }
29
- "}" { return next_token(state, pRBRACE); }
30
- "," { return next_token(state, pCOMMA); }
31
- "|" { return next_token(state, pBAR); }
32
- "^" { return next_token(state, pHAT); }
33
- "&" { return next_token(state, pAMP); }
34
- "?" { return next_token(state, pQUESTION); }
35
- "*" { return next_token(state, pSTAR); }
36
- "**" { return next_token(state, pSTAR2); }
37
- "." { return next_token(state, pDOT); }
38
- "..." { return next_token(state, pDOT3); }
39
- "`" { return next_token(state, tOPERATOR); }
40
- "`" [^ :\x00] [^`\x00]* "`" { return next_token(state, tQIDENT); }
41
- "->" { return next_token(state, pARROW); }
42
- "=>" { return next_token(state, pFATARROW); }
43
- "=" { return next_token(state, pEQ); }
44
- ":" { return next_token(state, pCOLON); }
45
- "::" { return next_token(state, pCOLON2); }
46
- "<" { return next_token(state, pLT); }
47
- "[]" { return next_token(state, pAREF_OPR); }
48
- operator { return next_token(state, tOPERATOR); }
49
-
50
- number = [0-9] [0-9_]*;
51
- ("-"|"+")? number { return next_token(state, tINTEGER); }
52
-
53
- "%a{" [^}\x00]* "}" { return next_token(state, tANNOTATION); }
54
- "%a(" [^)\x00]* ")" { return next_token(state, tANNOTATION); }
55
- "%a[" [^\]\x00]* "]" { return next_token(state, tANNOTATION); }
56
- "%a|" [^|\x00]* "|" { return next_token(state, tANNOTATION); }
57
- "%a<" [^>\x00]* ">" { return next_token(state, tANNOTATION); }
58
-
59
- "#" (. \ [\x00])* {
60
- return next_token(
61
- state,
62
- state->first_token_of_line ? tLINECOMMENT : tCOMMENT
63
- );
64
- }
65
-
66
- "alias" { return next_token(state, kALIAS); }
67
- "attr_accessor" { return next_token(state, kATTRACCESSOR); }
68
- "attr_reader" { return next_token(state, kATTRREADER); }
69
- "attr_writer" { return next_token(state, kATTRWRITER); }
70
- "bool" { return next_token(state, kBOOL); }
71
- "bot" { return next_token(state, kBOT); }
72
- "class" { return next_token(state, kCLASS); }
73
- "def" { return next_token(state, kDEF); }
74
- "end" { return next_token(state, kEND); }
75
- "extend" { return next_token(state, kEXTEND); }
76
- "false" { return next_token(state, kFALSE); }
77
- "in" { return next_token(state, kIN); }
78
- "include" { return next_token(state, kINCLUDE); }
79
- "instance" { return next_token(state, kINSTANCE); }
80
- "interface" { return next_token(state, kINTERFACE); }
81
- "module" { return next_token(state, kMODULE); }
82
- "nil" { return next_token(state, kNIL); }
83
- "out" { return next_token(state, kOUT); }
84
- "prepend" { return next_token(state, kPREPEND); }
85
- "private" { return next_token(state, kPRIVATE); }
86
- "public" { return next_token(state, kPUBLIC); }
87
- "self" { return next_token(state, kSELF); }
88
- "singleton" { return next_token(state, kSINGLETON); }
89
- "top" { return next_token(state, kTOP); }
90
- "true" { return next_token(state, kTRUE); }
91
- "type" { return next_token(state, kTYPE); }
92
- "unchecked" { return next_token(state, kUNCHECKED); }
93
- "untyped" { return next_token(state, kUNTYPED); }
94
- "void" { return next_token(state, kVOID); }
95
- "use" { return next_token(state, kUSE); }
96
- "as" { return next_token(state, kAS); }
97
- "__todo__" { return next_token(state, k__TODO__); }
98
-
99
- unicode_char = "\\u" [0-9a-fA-F]{4};
100
- oct_char = "\\x" [0-9a-f]{1,2};
101
- hex_char = "\\" [0-7]{1,3};
102
-
103
- dqstring = ["] (unicode_char | oct_char | hex_char | "\\" [^xu] | [^\\"\x00])* ["];
104
- sqstring = ['] ("\\"['\\] | [^'\x00])* ['];
105
-
106
- dqstring { return next_token(state, tDQSTRING); }
107
- sqstring { return next_token(state, tSQSTRING); }
108
- ":" dqstring { return next_token(state, tDQSYMBOL); }
109
- ":" sqstring { return next_token(state, tSQSYMBOL); }
110
-
111
- identifier = [a-zA-Z_] word* [!?=]?;
112
- symbol_opr = ":|" | ":&" | ":/" | ":%" | ":~" | ":`" | ":^"
113
- | ":==" | ":=~" | ":===" | ":!" | ":!=" | ":!~"
114
- | ":<" | ":<=" | ":<<" | ":<=>" | ":>" | ":>=" | ":>>"
115
- | ":-" | ":-@" | ":+" | ":+@" | ":*" | ":**" | ":[]" | ":[]=";
116
-
117
- global_ident = [0-9]+
118
- | "-" [a-zA-Z0-9_]
119
- | [~*$?!@\\/;,.=:<>"&'`+]
120
- | [^ \t\r\n:;=.,!"$%&()-+~|\\'[\]{}*/<>^\x00]+;
121
-
122
- ":" identifier { return next_token(state, tSYMBOL); }
123
- ":@" identifier { return next_token(state, tSYMBOL); }
124
- ":@@" identifier { return next_token(state, tSYMBOL); }
125
- ":$" global_ident { return next_token(state, tSYMBOL); }
126
- symbol_opr { return next_token(state, tSYMBOL); }
127
-
128
- [a-z] word* { return next_token(state, tLIDENT); }
129
- [A-Z] word* { return next_token(state, tUIDENT); }
130
- "_" [a-z0-9_] word* { return next_token(state, tULLIDENT); }
131
- "_" [A-Z] word* { return next_token(state, tULIDENT); }
132
- "_" { return next_token(state, tULLIDENT); }
133
- [a-zA-Z_] word* "!" { return next_token(state, tBANGIDENT); }
134
- [a-zA-Z_] word* "=" { return next_token(state, tEQIDENT); }
135
-
136
- "@" [a-zA-Z_] word* { return next_token(state, tAIDENT); }
137
- "@@" [a-zA-Z_] word* { return next_token(state, tA2IDENT); }
138
-
139
- "$" global_ident { return next_token(state, tGIDENT); }
140
-
141
- skip = ([ \t]+|[\r\n]);
142
-
143
- skip { return next_token(state, tTRIVIA); }
144
- "\x00" { return next_eof_token(state); }
145
- * { return next_token(state, ErrorToken); }
146
- */
147
- }
@@ -1,175 +0,0 @@
1
- #include "rbs_extension.h"
2
-
3
- static const char *RBS_TOKENTYPE_NAMES[] = {
4
- "NullType",
5
- "pEOF",
6
- "ErrorToken",
7
-
8
- "pLPAREN", /* ( */
9
- "pRPAREN", /* ) */
10
- "pCOLON", /* : */
11
- "pCOLON2", /* :: */
12
- "pLBRACKET", /* [ */
13
- "pRBRACKET", /* ] */
14
- "pLBRACE", /* { */
15
- "pRBRACE", /* } */
16
- "pHAT", /* ^ */
17
- "pARROW", /* -> */
18
- "pFATARROW", /* => */
19
- "pCOMMA", /* , */
20
- "pBAR", /* | */
21
- "pAMP", /* & */
22
- "pSTAR", /* * */
23
- "pSTAR2", /* ** */
24
- "pDOT", /* . */
25
- "pDOT3", /* ... */
26
- "pBANG", /* ! */
27
- "pQUESTION", /* ? */
28
- "pLT", /* < */
29
- "pEQ", /* = */
30
-
31
- "kALIAS", /* alias */
32
- "kATTRACCESSOR", /* attr_accessor */
33
- "kATTRREADER", /* attr_reader */
34
- "kATTRWRITER", /* attr_writer */
35
- "kBOOL", /* bool */
36
- "kBOT", /* bot */
37
- "kCLASS", /* class */
38
- "kDEF", /* def */
39
- "kEND", /* end */
40
- "kEXTEND", /* extend */
41
- "kFALSE", /* kFALSE */
42
- "kIN", /* in */
43
- "kINCLUDE", /* include */
44
- "kINSTANCE", /* instance */
45
- "kINTERFACE", /* interface */
46
- "kMODULE", /* module */
47
- "kNIL", /* nil */
48
- "kOUT", /* out */
49
- "kPREPEND", /* prepend */
50
- "kPRIVATE", /* private */
51
- "kPUBLIC", /* public */
52
- "kSELF", /* self */
53
- "kSINGLETON", /* singleton */
54
- "kTOP", /* top */
55
- "kTRUE", /* true */
56
- "kTYPE", /* type */
57
- "kUNCHECKED", /* unchecked */
58
- "kUNTYPED", /* untyped */
59
- "kVOID", /* void */
60
- "kUSE", /* use */
61
- "kAS", /* as */
62
- "k__TODO__", /* __todo__ */
63
-
64
- "tLIDENT", /* Identifiers starting with lower case */
65
- "tUIDENT", /* Identifiers starting with upper case */
66
- "tULIDENT", /* Identifiers starting with `_` */
67
- "tULLIDENT",
68
- "tGIDENT", /* Identifiers starting with `$` */
69
- "tAIDENT", /* Identifiers starting with `@` */
70
- "tA2IDENT", /* Identifiers starting with `@@` */
71
- "tBANGIDENT",
72
- "tEQIDENT",
73
- "tQIDENT", /* Quoted identifier */
74
- "pAREF_OPR", /* [] */
75
- "tOPERATOR", /* Operator identifier */
76
-
77
- "tCOMMENT",
78
- "tLINECOMMENT",
79
-
80
- "tTRIVIA",
81
-
82
- "tDQSTRING", /* Double quoted string */
83
- "tSQSTRING", /* Single quoted string */
84
- "tINTEGER", /* Integer */
85
- "tSYMBOL", /* Symbol */
86
- "tDQSYMBOL",
87
- "tSQSYMBOL",
88
- "tANNOTATION", /* Annotation */
89
- };
90
-
91
- token NullToken = { NullType };
92
- position NullPosition = { -1, -1, -1, -1 };
93
- range NULL_RANGE = { { -1, -1, -1, -1 }, { -1, -1, -1, -1 } };
94
-
95
- const char *token_type_str(enum TokenType type) {
96
- return RBS_TOKENTYPE_NAMES[type];
97
- }
98
-
99
- int token_chars(token tok) {
100
- return tok.range.end.char_pos - tok.range.start.char_pos;
101
- }
102
-
103
- int token_bytes(token tok) {
104
- return RANGE_BYTES(tok.range);
105
- }
106
-
107
- unsigned int peek(lexstate *state) {
108
- if (state->current.char_pos == state->end_pos) {
109
- state->last_char = '\0';
110
- return 0;
111
- } else {
112
- unsigned int c = rb_enc_mbc_to_codepoint(RSTRING_PTR(state->string) + state->current.byte_pos, RSTRING_END(state->string), rb_enc_get(state->string));
113
- state->last_char = c;
114
- return c;
115
- }
116
- }
117
-
118
- token next_token(lexstate *state, enum TokenType type) {
119
- token t;
120
-
121
- t.type = type;
122
- t.range.start = state->start;
123
- t.range.end = state->current;
124
- state->start = state->current;
125
- if (type != tTRIVIA) {
126
- state->first_token_of_line = false;
127
- }
128
-
129
- return t;
130
- }
131
-
132
- token next_eof_token(lexstate *state) {
133
- if (state->current.byte_pos == RSTRING_LEN(state->string)+1) {
134
- // End of String
135
- token t;
136
- t.type = pEOF;
137
- t.range.start = state->start;
138
- t.range.end = state->start;
139
- state->start = state->current;
140
-
141
- return t;
142
- } else {
143
- // NULL byte in the middle of the string
144
- return next_token(state, pEOF);
145
- }
146
- }
147
-
148
- void rbs_skip(lexstate *state) {
149
- if (!state->last_char) {
150
- peek(state);
151
- }
152
- int byte_len = rb_enc_codelen(state->last_char, rb_enc_get(state->string));
153
-
154
- state->current.char_pos += 1;
155
- state->current.byte_pos += byte_len;
156
-
157
- if (state->last_char == '\n') {
158
- state->current.line += 1;
159
- state->current.column = 0;
160
- state->first_token_of_line = true;
161
- } else {
162
- state->current.column += 1;
163
- }
164
- }
165
-
166
- void skipn(lexstate *state, size_t size) {
167
- for (size_t i = 0; i < size; i ++) {
168
- peek(state);
169
- rbs_skip(state);
170
- }
171
- }
172
-
173
- char *peek_token(lexstate *state, token tok) {
174
- return RSTRING_PTR(state->string) + tok.range.start.byte_pos;
175
- }