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
@@ -10,6 +10,8 @@
10
10
  #ifndef RBS_CONSTANT_POOL_H
11
11
  #define RBS_CONSTANT_POOL_H
12
12
 
13
+ #include "rbs/util/rbs_encoding.h"
14
+
13
15
  #include <assert.h>
14
16
  #include <stdbool.h>
15
17
  #include <stdint.h>
@@ -28,70 +30,6 @@
28
30
  */
29
31
  typedef uint32_t rbs_constant_id_t;
30
32
 
31
- /**
32
- * A list of constant IDs. Usually used to represent a set of locals.
33
- */
34
- typedef struct {
35
- /** The number of constant ids in the list. */
36
- size_t size;
37
-
38
- /** The number of constant ids that have been allocated in the list. */
39
- size_t capacity;
40
-
41
- /** The constant ids in the list. */
42
- rbs_constant_id_t *ids;
43
- } rbs_constant_id_list_t;
44
-
45
- /**
46
- * Initialize a list of constant ids.
47
- *
48
- * @param list The list to initialize.
49
- */
50
- void rbs_constant_id_list_init(rbs_constant_id_list_t *list);
51
-
52
- /**
53
- * Initialize a list of constant ids with a given capacity.
54
- *
55
- * @param list The list to initialize.
56
- * @param capacity The initial capacity of the list.
57
- */
58
- void rbs_constant_id_list_init_capacity(rbs_constant_id_list_t *list, size_t capacity);
59
-
60
- /**
61
- * Append a constant id to a list of constant ids. Returns false if any
62
- * potential reallocations fail.
63
- *
64
- * @param list The list to append to.
65
- * @param id The id to append.
66
- * @return Whether the append succeeded.
67
- */
68
- bool rbs_constant_id_list_append(rbs_constant_id_list_t *list, rbs_constant_id_t id);
69
-
70
- /**
71
- * Insert a constant id into a list of constant ids at the specified index.
72
- *
73
- * @param list The list to insert into.
74
- * @param index The index at which to insert.
75
- * @param id The id to insert.
76
- */
77
- void rbs_constant_id_list_insert(rbs_constant_id_list_t *list, size_t index, rbs_constant_id_t id);
78
-
79
- /**
80
- * Checks if the current constant id list includes the given constant id.
81
- *
82
- * @param list The list to check.
83
- * @param id The id to check for.
84
- * @return Whether the list includes the given id.
85
- */
86
- bool rbs_constant_id_list_includes(rbs_constant_id_list_t *list, rbs_constant_id_t id);
87
-
88
- /**
89
- * Free the memory associated with a list of constant ids.
90
- *
91
- * @param list The list to free.
92
- */
93
- void rbs_constant_id_list_free(rbs_constant_id_list_t *list);
94
-
95
33
  /**
96
34
  * The type of bucket in the constant pool hash map. This determines how the
97
35
  * bucket should be freed.
@@ -110,10 +48,10 @@ static const rbs_constant_pool_bucket_type_t RBS_CONSTANT_POOL_BUCKET_CONSTANT =
110
48
  /** A bucket in the hash map. */
111
49
  typedef struct {
112
50
  /** The incremental ID used for indexing back into the pool. */
113
- unsigned int id: 30;
51
+ unsigned int id : 30;
114
52
 
115
53
  /** The type of the bucket, which determines how to free it. */
116
- rbs_constant_pool_bucket_type_t type: 2;
54
+ rbs_constant_pool_bucket_type_t type : 2;
117
55
 
118
56
  /** The hash of the bucket. */
119
57
  uint32_t hash;
@@ -143,9 +81,6 @@ typedef struct {
143
81
  uint32_t capacity;
144
82
  } rbs_constant_pool_t;
145
83
 
146
- // A global constant pool for storing permenant keywords, such as the names of location children in `parser.c`.
147
- extern rbs_constant_pool_t *RBS_GLOBAL_CONSTANT_POOL;
148
-
149
84
  /**
150
85
  * Initialize a new constant pool with a given capacity.
151
86
  *
@@ -162,7 +97,7 @@ bool rbs_constant_pool_init(rbs_constant_pool_t *pool, uint32_t capacity);
162
97
  * @param constant_id The id of the constant to get.
163
98
  * @return A pointer to the constant.
164
99
  */
165
- rbs_constant_t * rbs_constant_pool_id_to_constant(const rbs_constant_pool_t *pool, rbs_constant_id_t constant_id);
100
+ rbs_constant_t *rbs_constant_pool_id_to_constant(const rbs_constant_pool_t *pool, rbs_constant_id_t constant_id);
166
101
 
167
102
  /**
168
103
  * Find a constant in a constant pool. Returns the id of the constant, or 0 if
@@ -185,6 +120,7 @@ rbs_constant_id_t rbs_constant_pool_find(const rbs_constant_pool_t *pool, const
185
120
  * @return The id of the constant.
186
121
  */
187
122
  rbs_constant_id_t rbs_constant_pool_insert_shared(rbs_constant_pool_t *pool, const uint8_t *start, size_t length);
123
+ rbs_constant_id_t rbs_constant_pool_insert_shared_with_encoding(rbs_constant_pool_t *pool, const uint8_t *start, size_t length, const rbs_encoding_t *encoding);
188
124
 
189
125
  /**
190
126
  * Insert a constant into a constant pool from memory that is now owned by the
@@ -0,0 +1,282 @@
1
+ /**
2
+ * @file encoding.h
3
+ *
4
+ * The encoding interface and implementations used by the parser.
5
+ */
6
+ #ifndef RBS_RBS_ENCODING_H
7
+ #define RBS_RBS_ENCODING_H
8
+
9
+ #include "rbs/defines.h"
10
+
11
+ #include <assert.h>
12
+ #include <stdbool.h>
13
+ #include <stddef.h>
14
+ #include <stdint.h>
15
+
16
+ /**
17
+ * This struct defines the functions necessary to implement the encoding
18
+ * interface so we can determine how many bytes the subsequent character takes.
19
+ * Each callback should return the number of bytes, or 0 if the next bytes are
20
+ * invalid for the encoding and type.
21
+ */
22
+ typedef struct {
23
+ /**
24
+ * Return the number of bytes that the next character takes if it is valid
25
+ * in the encoding. Does not read more than n bytes. It is assumed that n is
26
+ * at least 1.
27
+ */
28
+ size_t (*char_width)(const uint8_t *b, ptrdiff_t n);
29
+
30
+ /**
31
+ * Return the number of bytes that the next character takes if it is valid
32
+ * in the encoding and is alphabetical. Does not read more than n bytes. It
33
+ * is assumed that n is at least 1.
34
+ */
35
+ size_t (*alpha_char)(const uint8_t *b, ptrdiff_t n);
36
+
37
+ /**
38
+ * Return the number of bytes that the next character takes if it is valid
39
+ * in the encoding and is alphanumeric. Does not read more than n bytes. It
40
+ * is assumed that n is at least 1.
41
+ */
42
+ size_t (*alnum_char)(const uint8_t *b, ptrdiff_t n);
43
+
44
+ /**
45
+ * Return true if the next character is valid in the encoding and is an
46
+ * uppercase character. Does not read more than n bytes. It is assumed that
47
+ * n is at least 1.
48
+ */
49
+ bool (*isupper_char)(const uint8_t *b, ptrdiff_t n);
50
+
51
+ /**
52
+ * The name of the encoding. This should correspond to a value that can be
53
+ * passed to Encoding.find in Ruby.
54
+ */
55
+ const char *name;
56
+
57
+ /**
58
+ * Return true if the encoding is a multibyte encoding.
59
+ */
60
+ bool multibyte;
61
+ } rbs_encoding_t;
62
+
63
+ /**
64
+ * All of the lookup tables use the first bit of each embedded byte to indicate
65
+ * whether the codepoint is alphabetical.
66
+ */
67
+ #define RBS_ENCODING_ALPHABETIC_BIT 1 << 0
68
+
69
+ /**
70
+ * All of the lookup tables use the second bit of each embedded byte to indicate
71
+ * whether the codepoint is alphanumeric.
72
+ */
73
+ #define RBS_ENCODING_ALPHANUMERIC_BIT 1 << 1
74
+
75
+ /**
76
+ * All of the lookup tables use the third bit of each embedded byte to indicate
77
+ * whether the codepoint is uppercase.
78
+ */
79
+ #define RBS_ENCODING_UPPERCASE_BIT 1 << 2
80
+
81
+ /**
82
+ * Return the size of the next character in the UTF-8 encoding.
83
+ *
84
+ * @param b The bytes to read.
85
+ * @param n The number of bytes that can be read.
86
+ * @returns The number of bytes that the next character takes if it is valid in
87
+ * the encoding, or 0 if it is not.
88
+ */
89
+ size_t rbs_encoding_utf_8_char_width(const uint8_t *b, ptrdiff_t n);
90
+
91
+ /**
92
+ * Return the size of the next character in the UTF-8 encoding if it is an
93
+ * alphabetical character.
94
+ *
95
+ * @param b The bytes to read.
96
+ * @param n The number of bytes that can be read.
97
+ * @returns The number of bytes that the next character takes if it is valid in
98
+ * the encoding, or 0 if it is not.
99
+ */
100
+ size_t rbs_encoding_utf_8_alpha_char(const uint8_t *b, ptrdiff_t n);
101
+
102
+ /**
103
+ * Return the size of the next character in the UTF-8 encoding if it is an
104
+ * alphanumeric character.
105
+ *
106
+ * @param b The bytes to read.
107
+ * @param n The number of bytes that can be read.
108
+ * @returns The number of bytes that the next character takes if it is valid in
109
+ * the encoding, or 0 if it is not.
110
+ */
111
+ size_t rbs_encoding_utf_8_alnum_char(const uint8_t *b, ptrdiff_t n);
112
+
113
+ /**
114
+ * Return true if the next character in the UTF-8 encoding if it is an uppercase
115
+ * character.
116
+ *
117
+ * @param b The bytes to read.
118
+ * @param n The number of bytes that can be read.
119
+ * @returns True if the next character is valid in the encoding and is an
120
+ * uppercase character, or false if it is not.
121
+ */
122
+ bool rbs_encoding_utf_8_isupper_char(const uint8_t *b, ptrdiff_t n);
123
+
124
+ /**
125
+ * This lookup table is referenced in both the UTF-8 encoding file and the
126
+ * parser directly in order to speed up the default encoding processing. It is
127
+ * used to indicate whether a character is alphabetical, alphanumeric, or
128
+ * uppercase in unicode mappings.
129
+ */
130
+ extern const uint8_t rbs_encoding_unicode_table[256];
131
+
132
+ /**
133
+ * These are all of the encodings that prism supports.
134
+ */
135
+ typedef enum {
136
+ RBS_ENCODING_UTF_8 = 0,
137
+ RBS_ENCODING_US_ASCII,
138
+ RBS_ENCODING_ASCII_8BIT,
139
+ RBS_ENCODING_EUC_JP,
140
+ RBS_ENCODING_WINDOWS_31J,
141
+
142
+ // We optionally support excluding the full set of encodings to only support the
143
+ // minimum necessary to process Ruby code without encoding comments.
144
+ #ifndef RBS_ENCODING_EXCLUDE_FULL
145
+ RBS_ENCODING_BIG5,
146
+ RBS_ENCODING_BIG5_HKSCS,
147
+ RBS_ENCODING_BIG5_UAO,
148
+ RBS_ENCODING_CESU_8,
149
+ RBS_ENCODING_CP51932,
150
+ RBS_ENCODING_CP850,
151
+ RBS_ENCODING_CP852,
152
+ RBS_ENCODING_CP855,
153
+ RBS_ENCODING_CP949,
154
+ RBS_ENCODING_CP950,
155
+ RBS_ENCODING_CP951,
156
+ RBS_ENCODING_EMACS_MULE,
157
+ RBS_ENCODING_EUC_JP_MS,
158
+ RBS_ENCODING_EUC_JIS_2004,
159
+ RBS_ENCODING_EUC_KR,
160
+ RBS_ENCODING_EUC_TW,
161
+ RBS_ENCODING_GB12345,
162
+ RBS_ENCODING_GB18030,
163
+ RBS_ENCODING_GB1988,
164
+ RBS_ENCODING_GB2312,
165
+ RBS_ENCODING_GBK,
166
+ RBS_ENCODING_IBM437,
167
+ RBS_ENCODING_IBM720,
168
+ RBS_ENCODING_IBM737,
169
+ RBS_ENCODING_IBM775,
170
+ RBS_ENCODING_IBM852,
171
+ RBS_ENCODING_IBM855,
172
+ RBS_ENCODING_IBM857,
173
+ RBS_ENCODING_IBM860,
174
+ RBS_ENCODING_IBM861,
175
+ RBS_ENCODING_IBM862,
176
+ RBS_ENCODING_IBM863,
177
+ RBS_ENCODING_IBM864,
178
+ RBS_ENCODING_IBM865,
179
+ RBS_ENCODING_IBM866,
180
+ RBS_ENCODING_IBM869,
181
+ RBS_ENCODING_ISO_8859_1,
182
+ RBS_ENCODING_ISO_8859_2,
183
+ RBS_ENCODING_ISO_8859_3,
184
+ RBS_ENCODING_ISO_8859_4,
185
+ RBS_ENCODING_ISO_8859_5,
186
+ RBS_ENCODING_ISO_8859_6,
187
+ RBS_ENCODING_ISO_8859_7,
188
+ RBS_ENCODING_ISO_8859_8,
189
+ RBS_ENCODING_ISO_8859_9,
190
+ RBS_ENCODING_ISO_8859_10,
191
+ RBS_ENCODING_ISO_8859_11,
192
+ RBS_ENCODING_ISO_8859_13,
193
+ RBS_ENCODING_ISO_8859_14,
194
+ RBS_ENCODING_ISO_8859_15,
195
+ RBS_ENCODING_ISO_8859_16,
196
+ RBS_ENCODING_KOI8_R,
197
+ RBS_ENCODING_KOI8_U,
198
+ RBS_ENCODING_MAC_CENT_EURO,
199
+ RBS_ENCODING_MAC_CROATIAN,
200
+ RBS_ENCODING_MAC_CYRILLIC,
201
+ RBS_ENCODING_MAC_GREEK,
202
+ RBS_ENCODING_MAC_ICELAND,
203
+ RBS_ENCODING_MAC_JAPANESE,
204
+ RBS_ENCODING_MAC_ROMAN,
205
+ RBS_ENCODING_MAC_ROMANIA,
206
+ RBS_ENCODING_MAC_THAI,
207
+ RBS_ENCODING_MAC_TURKISH,
208
+ RBS_ENCODING_MAC_UKRAINE,
209
+ RBS_ENCODING_SHIFT_JIS,
210
+ RBS_ENCODING_SJIS_DOCOMO,
211
+ RBS_ENCODING_SJIS_KDDI,
212
+ RBS_ENCODING_SJIS_SOFTBANK,
213
+ RBS_ENCODING_STATELESS_ISO_2022_JP,
214
+ RBS_ENCODING_STATELESS_ISO_2022_JP_KDDI,
215
+ RBS_ENCODING_TIS_620,
216
+ RBS_ENCODING_UTF8_MAC,
217
+ RBS_ENCODING_UTF8_DOCOMO,
218
+ RBS_ENCODING_UTF8_KDDI,
219
+ RBS_ENCODING_UTF8_SOFTBANK,
220
+ RBS_ENCODING_WINDOWS_1250,
221
+ RBS_ENCODING_WINDOWS_1251,
222
+ RBS_ENCODING_WINDOWS_1252,
223
+ RBS_ENCODING_WINDOWS_1253,
224
+ RBS_ENCODING_WINDOWS_1254,
225
+ RBS_ENCODING_WINDOWS_1255,
226
+ RBS_ENCODING_WINDOWS_1256,
227
+ RBS_ENCODING_WINDOWS_1257,
228
+ RBS_ENCODING_WINDOWS_1258,
229
+ RBS_ENCODING_WINDOWS_874,
230
+ #endif
231
+
232
+ RBS_ENCODING_MAXIMUM
233
+ } rbs_encoding_type_t;
234
+
235
+ /**
236
+ * This is the table of all of the encodings that prism supports.
237
+ */
238
+ extern const rbs_encoding_t rbs_encodings[RBS_ENCODING_MAXIMUM];
239
+
240
+ /**
241
+ * This is the default UTF-8 encoding. We need a reference to it to quickly
242
+ * create parsers.
243
+ */
244
+ #define RBS_ENCODING_UTF_8_ENTRY (&rbs_encodings[RBS_ENCODING_UTF_8])
245
+
246
+ /**
247
+ * This is the US-ASCII encoding. We need a reference to it to be able to
248
+ * compare against it when a string is being created because it could possibly
249
+ * need to fall back to ASCII-8BIT.
250
+ */
251
+ #define RBS_ENCODING_US_ASCII_ENTRY (&rbs_encodings[RBS_ENCODING_US_ASCII])
252
+
253
+ /**
254
+ * This is the ASCII-8BIT encoding. We need a reference to it so that rbs_strpbrk
255
+ * can compare against it because invalid multibyte characters are not a thing
256
+ * in this encoding. It is also needed for handling Regexp encoding flags.
257
+ */
258
+ #define RBS_ENCODING_ASCII_8BIT_ENTRY (&rbs_encodings[RBS_ENCODING_ASCII_8BIT])
259
+
260
+ /**
261
+ * This is the EUC-JP encoding. We need a reference to it to quickly process
262
+ * regular expression modifiers.
263
+ */
264
+ #define RBS_ENCODING_EUC_JP_ENTRY (&rbs_encodings[RBS_ENCODING_EUC_JP])
265
+
266
+ /**
267
+ * This is the Windows-31J encoding. We need a reference to it to quickly
268
+ * process regular expression modifiers.
269
+ */
270
+ #define RBS_ENCODING_WINDOWS_31J_ENTRY (&rbs_encodings[RBS_ENCODING_WINDOWS_31J])
271
+
272
+ /**
273
+ * Parse the given name of an encoding and return a pointer to the corresponding
274
+ * encoding struct if one can be found, otherwise return NULL.
275
+ *
276
+ * @param start A pointer to the first byte of the name.
277
+ * @param end A pointer to the last byte of the name.
278
+ * @returns A pointer to the encoding struct if one is found, otherwise NULL.
279
+ */
280
+ const rbs_encoding_t *rbs_encoding_find(const uint8_t *start, const uint8_t *end);
281
+
282
+ #endif
@@ -0,0 +1,24 @@
1
+ #ifndef RBS_RBS_UNESCAPE_H
2
+ #define RBS_RBS_UNESCAPE_H
3
+
4
+ #include <stddef.h>
5
+ #include "rbs/util/rbs_allocator.h"
6
+ #include "rbs/string.h"
7
+ #include "rbs/util/rbs_encoding.h"
8
+
9
+ /**
10
+ * Receives `rbs_parser_t` and `range`, which represents a string token or symbol token, and returns a string VALUE.
11
+ *
12
+ * Input token | Output string
13
+ * ------------+-------------
14
+ * "foo\\n" | foo\n
15
+ * 'foo' | foo
16
+ * `bar` | bar
17
+ * :"baz\\t" | baz\t
18
+ * :'baz' | baz
19
+ *
20
+ * @returns A new owned string that will be freed when the allocator is freed.
21
+ * */
22
+ rbs_string_t rbs_unquote_string(rbs_allocator_t *, const rbs_string_t input, const rbs_encoding_t *encoding);
23
+
24
+ #endif // RBS_RBS_UNESCAPE_H
data/include/rbs.h CHANGED
@@ -1,7 +1,14 @@
1
1
  #ifndef RBS_H
2
2
  #define RBS_H
3
3
 
4
- #include "rbs/constants.h"
5
- #include "rbs/ruby_objs.h"
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include "rbs/parser.h"
9
+
10
+ #ifdef __cplusplus
11
+ }
12
+ #endif
6
13
 
7
14
  #endif
@@ -59,20 +59,10 @@ module RBS
59
59
 
60
60
  def self.each_part(doc, &block)
61
61
  if block
62
- document =
63
- case doc
64
- when String
65
- raise
66
- when RDoc::Comment
67
- document = doc.parse
68
- when RDoc::Markup::Document
69
- document = doc
70
- end
71
-
72
- if document.file
73
- yield document
62
+ if doc.file
63
+ yield doc
74
64
  else
75
- document.each do |d|
65
+ doc.each do |d|
76
66
  each_part(d, &block)
77
67
  end
78
68
  end
@@ -39,7 +39,9 @@ module RBS
39
39
  def each_part(subjects, tester:)
40
40
  if block_given?
41
41
  subjects.each do |subject, docs|
42
- Formatter.each_part(subject.comment) do |doc|
42
+ comment = subject.comment
43
+ raise if comment.is_a?(String)
44
+ Formatter.each_part(comment.parse) do |doc|
43
45
  if tester.test_path(doc.file || raise)
44
46
  yield [doc, subject]
45
47
  end
@@ -23,7 +23,7 @@ module RBS
23
23
  @stores.clear()
24
24
 
25
25
  RDoc::RI::Paths.each(with_system_dir, with_site_dir, with_home_dir, with_gems_dir ? :latest : false, *extra_dirs.map(&:to_s)) do |path, type|
26
- store = RDoc::Store.new(path, type)
26
+ store = RDoc::Store.new(RDoc::Options.new, path:, type:)
27
27
  store.load_all
28
28
 
29
29
  @stores << store
@@ -21,7 +21,7 @@ module RBS
21
21
  self.class.hash ^ string.hash
22
22
  end
23
23
 
24
- def to_json(state = _ = nil)
24
+ def to_json(state = nil)
25
25
  { string: string, location: location }.to_json(state)
26
26
  end
27
27
  end
@@ -21,7 +21,7 @@ module RBS
21
21
  self.class.hash ^ string.hash
22
22
  end
23
23
 
24
- def to_json(state = _ = nil)
24
+ def to_json(state = nil)
25
25
  { string: string, location: location }.to_json(state)
26
26
  end
27
27
  end
@@ -74,7 +74,7 @@ module RBS
74
74
  self.class.hash ^ name.hash ^ args.hash
75
75
  end
76
76
 
77
- def to_json(state = _ = nil)
77
+ def to_json(state = nil)
78
78
  {
79
79
  name: name,
80
80
  args: args,
@@ -130,7 +130,7 @@ module RBS
130
130
  self.class.hash ^ name.hash ^ type_params.hash ^ super_class.hash ^ members.hash
131
131
  end
132
132
 
133
- def to_json(state = _ = nil)
133
+ def to_json(state = nil)
134
134
  {
135
135
  declaration: :class,
136
136
  name: name,
@@ -166,7 +166,7 @@ module RBS
166
166
  self.class.hash ^ name.hash ^ args.hash ^ location.hash
167
167
  end
168
168
 
169
- def to_json(state = _ = nil)
169
+ def to_json(state = nil)
170
170
  {
171
171
  name: name,
172
172
  args: args,
@@ -231,7 +231,7 @@ module RBS
231
231
  self.class.hash ^ name.hash ^ type_params.hash ^ self_types.hash ^ members.hash
232
232
  end
233
233
 
234
- def to_json(state = _ = nil)
234
+ def to_json(state = nil)
235
235
  {
236
236
  declaration: :module,
237
237
  name: name,
@@ -288,7 +288,7 @@ module RBS
288
288
  self.class.hash ^ type_params.hash ^ members.hash
289
289
  end
290
290
 
291
- def to_json(state = _ = nil)
291
+ def to_json(state = nil)
292
292
  {
293
293
  declaration: :interface,
294
294
  name: name,
@@ -331,7 +331,7 @@ module RBS
331
331
  self.class.hash ^ name.hash ^ type_params.hash ^ type.hash
332
332
  end
333
333
 
334
- def to_json(state = _ = nil)
334
+ def to_json(state = nil)
335
335
  {
336
336
  declaration: :alias,
337
337
  name: name,
@@ -371,7 +371,7 @@ module RBS
371
371
  self.class.hash ^ name.hash ^ type.hash
372
372
  end
373
373
 
374
- def to_json(state = _ = nil)
374
+ def to_json(state = nil)
375
375
  {
376
376
  declaration: :constant,
377
377
  name: name,
@@ -409,7 +409,7 @@ module RBS
409
409
  self.class.hash ^ name.hash ^ type.hash
410
410
  end
411
411
 
412
- def to_json(state = _ = nil)
412
+ def to_json(state = nil)
413
413
  {
414
414
  declaration: :global,
415
415
  name: name,
@@ -445,7 +445,7 @@ module RBS
445
445
  end
446
446
 
447
447
  class ClassAlias < AliasDecl
448
- def to_json(state = _ = nil)
448
+ def to_json(state = nil)
449
449
  {
450
450
  declaration: :class_alias,
451
451
  new_name: new_name,
@@ -457,7 +457,7 @@ module RBS
457
457
  end
458
458
 
459
459
  class ModuleAlias < AliasDecl
460
- def to_json(state = _ = nil)
460
+ def to_json(state = nil)
461
461
  {
462
462
  declaration: :module_alias,
463
463
  new_name: new_name,