rbs 3.6.1 → 3.9.5

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 (268) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +2 -2
  3. data/.github/workflows/dependabot.yml +1 -1
  4. data/.github/workflows/ruby.yml +34 -10
  5. data/.github/workflows/windows.yml +20 -3
  6. data/.gitignore +1 -0
  7. data/.rubocop.yml +26 -1
  8. data/CHANGELOG.md +241 -0
  9. data/Rakefile +54 -4
  10. data/config.yml +317 -0
  11. data/core/array.rbs +1756 -1591
  12. data/core/basic_object.rbs +38 -35
  13. data/core/comparable.rbs +1 -1
  14. data/core/complex.rbs +166 -94
  15. data/core/data.rbs +2 -2
  16. data/core/dir.rbs +2 -18
  17. data/core/encoding.rbs +12 -32
  18. data/core/enumerable.rbs +270 -266
  19. data/core/enumerator.rbs +14 -4
  20. data/core/env.rbs +1 -1
  21. data/core/errno.rbs +33 -16
  22. data/core/errors.rbs +6 -2
  23. data/core/exception.rbs +342 -167
  24. data/core/fiber.rbs +3 -2
  25. data/core/file.rbs +26 -75
  26. data/core/float.rbs +125 -72
  27. data/core/gc.rbs +158 -42
  28. data/core/hash.rbs +122 -143
  29. data/core/integer.rbs +79 -50
  30. data/core/io/buffer.rbs +49 -43
  31. data/core/io.rbs +108 -151
  32. data/core/kernel.rbs +341 -209
  33. data/core/match_data.rbs +76 -2
  34. data/core/math.rbs +0 -36
  35. data/core/method.rbs +2 -2
  36. data/core/module.rbs +32 -27
  37. data/core/nil_class.rbs +2 -2
  38. data/core/numeric.rbs +101 -104
  39. data/core/object.rbs +1 -5
  40. data/core/object_space/weak_key_map.rbs +3 -4
  41. data/core/object_space.rbs +3 -3
  42. data/core/proc.rbs +82 -14
  43. data/core/process.rbs +110 -58
  44. data/core/ractor.rbs +57 -4
  45. data/core/range.rbs +114 -87
  46. data/core/rational.rbs +0 -2
  47. data/core/rbs/unnamed/argf.rbs +237 -36
  48. data/core/rbs/unnamed/env_class.rbs +35 -53
  49. data/core/rbs/unnamed/random.rbs +1 -2
  50. data/core/regexp.rbs +10 -56
  51. data/core/ruby_vm.rbs +88 -9
  52. data/core/rubygems/config_file.rbs +3 -0
  53. data/core/rubygems/errors.rbs +3 -6
  54. data/core/rubygems/platform.rbs +0 -9
  55. data/core/rubygems/rubygems.rbs +3 -6
  56. data/core/rubygems/version.rbs +8 -8
  57. data/core/set.rbs +4 -16
  58. data/core/string.rbs +271 -264
  59. data/core/struct.rbs +6 -18
  60. data/core/symbol.rbs +14 -21
  61. data/core/thread.rbs +32 -35
  62. data/core/time.rbs +131 -50
  63. data/core/trace_point.rbs +124 -113
  64. data/core/true_class.rbs +0 -1
  65. data/core/unbound_method.rbs +1 -1
  66. data/core/warning.rbs +9 -2
  67. data/docs/architecture.md +1 -1
  68. data/docs/syntax.md +17 -10
  69. data/ext/rbs_extension/extconf.rb +11 -0
  70. data/ext/rbs_extension/location.c +61 -29
  71. data/ext/rbs_extension/location.h +4 -3
  72. data/ext/rbs_extension/main.c +23 -1
  73. data/ext/rbs_extension/parser.c +506 -517
  74. data/ext/rbs_extension/parserstate.c +109 -30
  75. data/ext/rbs_extension/parserstate.h +6 -4
  76. data/ext/rbs_extension/rbs_extension.h +1 -10
  77. data/{ext/rbs_extension → include/rbs}/constants.h +21 -19
  78. data/include/rbs/ruby_objs.h +72 -0
  79. data/include/rbs/util/rbs_constant_pool.h +219 -0
  80. data/include/rbs.h +7 -0
  81. data/lib/rbs/annotate/annotations.rb +3 -3
  82. data/lib/rbs/annotate/rdoc_source.rb +2 -2
  83. data/lib/rbs/ast/declarations.rb +9 -4
  84. data/lib/rbs/ast/directives.rb +10 -0
  85. data/lib/rbs/ast/members.rb +2 -0
  86. data/lib/rbs/ast/type_param.rb +2 -12
  87. data/lib/rbs/cli/diff.rb +3 -3
  88. data/lib/rbs/cli/validate.rb +2 -1
  89. data/lib/rbs/cli.rb +16 -16
  90. data/lib/rbs/collection/config/lockfile_generator.rb +58 -8
  91. data/lib/rbs/collection/config.rb +5 -3
  92. data/lib/rbs/collection/sources/rubygems.rb +1 -1
  93. data/lib/rbs/collection.rb +1 -0
  94. data/lib/rbs/definition.rb +51 -34
  95. data/lib/rbs/definition_builder/ancestor_builder.rb +5 -3
  96. data/lib/rbs/definition_builder.rb +83 -24
  97. data/lib/rbs/environment.rb +33 -18
  98. data/lib/rbs/environment_loader.rb +6 -1
  99. data/lib/rbs/errors.rb +24 -0
  100. data/lib/rbs/locator.rb +2 -0
  101. data/lib/rbs/method_type.rb +2 -0
  102. data/lib/rbs/namespace.rb +1 -0
  103. data/lib/rbs/parser_aux.rb +40 -3
  104. data/lib/rbs/prototype/rb.rb +20 -12
  105. data/lib/rbs/prototype/rbi.rb +11 -6
  106. data/lib/rbs/prototype/runtime/value_object_generator.rb +7 -5
  107. data/lib/rbs/prototype/runtime.rb +7 -5
  108. data/lib/rbs/subtractor.rb +3 -3
  109. data/lib/rbs/test/hook.rb +47 -42
  110. data/lib/rbs/test/type_check.rb +7 -5
  111. data/lib/rbs/type_name.rb +14 -9
  112. data/lib/rbs/types.rb +63 -14
  113. data/lib/rbs/unit_test/spy.rb +4 -2
  114. data/lib/rbs/unit_test/type_assertions.rb +19 -13
  115. data/lib/rbs/unit_test/with_aliases.rb +3 -1
  116. data/lib/rbs/validator.rb +7 -1
  117. data/lib/rbs/version.rb +1 -1
  118. data/lib/rbs/writer.rb +10 -5
  119. data/lib/rbs.rb +1 -0
  120. data/lib/rdoc_plugin/parser.rb +2 -2
  121. data/rbs.gemspec +6 -2
  122. data/sig/ancestor_graph.rbs +5 -5
  123. data/sig/annotate/rdoc_source.rbs +2 -0
  124. data/sig/cli.rbs +2 -0
  125. data/sig/collection/config/lockfile_generator.rbs +9 -1
  126. data/sig/declarations.rbs +10 -3
  127. data/sig/definition.rbs +80 -12
  128. data/sig/definition_builder.rbs +18 -4
  129. data/sig/directives.rbs +17 -1
  130. data/sig/environment.rbs +3 -1
  131. data/sig/errors.rbs +19 -0
  132. data/sig/namespace.rbs +2 -3
  133. data/sig/parser.rbs +5 -1
  134. data/sig/prototype/rb.rbs +1 -1
  135. data/sig/resolver/constant_resolver.rbs +2 -2
  136. data/sig/resolver/context.rbs +1 -1
  137. data/sig/subtractor.rbs +1 -1
  138. data/sig/test/type_check.rbs +2 -2
  139. data/sig/type_alias_dependency.rbs +2 -2
  140. data/sig/type_alias_regularity.rbs +6 -6
  141. data/sig/type_param.rbs +4 -4
  142. data/sig/typename.rbs +8 -5
  143. data/sig/types.rbs +1 -1
  144. data/sig/unit_test/spy.rbs +2 -0
  145. data/sig/unit_test/type_assertions.rbs +2 -0
  146. data/sig/use_map.rbs +1 -1
  147. data/sig/validator.rbs +6 -2
  148. data/sig/vendorer.rbs +1 -1
  149. data/sig/writer.rbs +1 -1
  150. data/{ext/rbs_extension → src}/constants.c +35 -36
  151. data/src/ruby_objs.c +799 -0
  152. data/src/util/rbs_constant_pool.c +342 -0
  153. data/stdlib/base64/0/base64.rbs +0 -9
  154. data/stdlib/benchmark/0/benchmark.rbs +11 -2
  155. data/stdlib/bigdecimal/0/big_decimal.rbs +26 -182
  156. data/stdlib/cgi/0/core.rbs +60 -3
  157. data/stdlib/cgi/0/manifest.yaml +1 -0
  158. data/stdlib/coverage/0/coverage.rbs +0 -3
  159. data/stdlib/csv/0/csv.rbs +18 -58
  160. data/stdlib/csv/0/manifest.yaml +1 -0
  161. data/stdlib/date/0/date.rbs +27 -42
  162. data/stdlib/did_you_mean/0/did_you_mean.rbs +1 -6
  163. data/stdlib/digest/0/digest.rbs +25 -2
  164. data/stdlib/erb/0/erb.rbs +0 -1
  165. data/stdlib/etc/0/etc.rbs +51 -34
  166. data/stdlib/fileutils/0/fileutils.rbs +3 -44
  167. data/stdlib/io-console/0/io-console.rbs +69 -15
  168. data/stdlib/ipaddr/0/ipaddr.rbs +16 -4
  169. data/stdlib/json/0/json.rbs +107 -120
  170. data/stdlib/logger/0/log_device.rbs +1 -1
  171. data/stdlib/logger/0/logger.rbs +3 -18
  172. data/stdlib/minitest/0/kernel.rbs +2 -2
  173. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +4 -1
  174. data/stdlib/minitest/0/minitest/assertion.rbs +1 -0
  175. data/stdlib/minitest/0/minitest/assertions.rbs +58 -13
  176. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +7 -0
  177. data/stdlib/minitest/0/minitest/bench_spec.rbs +8 -8
  178. data/stdlib/minitest/0/minitest/benchmark.rbs +17 -16
  179. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  180. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  181. data/stdlib/minitest/0/minitest/mock.rbs +9 -5
  182. data/stdlib/minitest/0/minitest/parallel/executor.rbs +4 -0
  183. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +0 -1
  184. data/stdlib/minitest/0/minitest/pride_io.rbs +8 -0
  185. data/stdlib/minitest/0/minitest/pride_lol.rbs +2 -0
  186. data/stdlib/minitest/0/minitest/progress_reporter.rbs +1 -1
  187. data/stdlib/minitest/0/minitest/reportable.rbs +2 -0
  188. data/stdlib/minitest/0/minitest/runnable.rbs +33 -1
  189. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +1 -1
  190. data/stdlib/minitest/0/minitest/spec/dsl.rbs +10 -6
  191. data/stdlib/minitest/0/minitest/spec.rbs +1 -1
  192. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +5 -0
  193. data/stdlib/minitest/0/minitest/summary_reporter.rbs +0 -7
  194. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +1 -1
  195. data/stdlib/minitest/0/minitest/test.rbs +7 -14
  196. data/stdlib/minitest/0/minitest/unexpected_error.rbs +2 -0
  197. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  198. data/stdlib/minitest/0/minitest/unit.rbs +1 -2
  199. data/stdlib/minitest/0/minitest.rbs +41 -892
  200. data/stdlib/monitor/0/monitor.rbs +13 -4
  201. data/stdlib/net-http/0/net-http.rbs +42 -109
  202. data/stdlib/nkf/0/nkf.rbs +30 -0
  203. data/stdlib/objspace/0/objspace.rbs +1 -2
  204. data/stdlib/observable/0/observable.rbs +1 -1
  205. data/stdlib/open-uri/0/manifest.yaml +1 -0
  206. data/stdlib/open-uri/0/open-uri.rbs +52 -0
  207. data/stdlib/open3/0/open3.rbs +0 -8
  208. data/stdlib/openssl/0/manifest.yaml +1 -0
  209. data/stdlib/openssl/0/openssl.rbs +235 -143
  210. data/stdlib/optparse/0/optparse.rbs +58 -18
  211. data/stdlib/pathname/0/pathname.rbs +2 -8
  212. data/stdlib/pp/0/pp.rbs +3 -1
  213. data/stdlib/prettyprint/0/prettyprint.rbs +0 -4
  214. data/stdlib/pstore/0/pstore.rbs +0 -6
  215. data/stdlib/psych/0/core_ext.rbs +12 -0
  216. data/stdlib/psych/0/psych.rbs +15 -4
  217. data/stdlib/pty/0/pty.rbs +46 -4
  218. data/stdlib/rdoc/0/code_object.rbs +0 -4
  219. data/stdlib/rdoc/0/markup.rbs +10 -12
  220. data/stdlib/rdoc/0/rdoc.rbs +13 -8
  221. data/stdlib/resolv/0/resolv.rbs +21 -12
  222. data/stdlib/ripper/0/ripper.rbs +0 -2
  223. data/stdlib/securerandom/0/securerandom.rbs +7 -2
  224. data/stdlib/shellwords/0/shellwords.rbs +11 -12
  225. data/stdlib/singleton/0/singleton.rbs +0 -1
  226. data/stdlib/socket/0/addrinfo.rbs +1 -2
  227. data/stdlib/socket/0/basic_socket.rbs +0 -5
  228. data/stdlib/socket/0/socket.rbs +32 -27
  229. data/stdlib/socket/0/tcp_server.rbs +0 -3
  230. data/stdlib/socket/0/tcp_socket.rbs +36 -3
  231. data/stdlib/socket/0/udp_socket.rbs +0 -1
  232. data/stdlib/socket/0/unix_server.rbs +0 -3
  233. data/stdlib/socket/0/unix_socket.rbs +4 -2
  234. data/{core/string_io.rbs → stdlib/stringio/0/stringio.rbs} +1 -1
  235. data/stdlib/strscan/0/string_scanner.rbs +1265 -422
  236. data/stdlib/tempfile/0/tempfile.rbs +135 -28
  237. data/stdlib/time/0/time.rbs +48 -35
  238. data/stdlib/timeout/0/timeout.rbs +11 -8
  239. data/stdlib/tmpdir/0/tmpdir.rbs +10 -3
  240. data/stdlib/tsort/0/tsort.rbs +0 -4
  241. data/stdlib/uri/0/common.rbs +28 -30
  242. data/stdlib/uri/0/ftp.rbs +1 -1
  243. data/stdlib/uri/0/generic.rbs +22 -18
  244. data/stdlib/uri/0/http.rbs +2 -2
  245. data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
  246. data/stdlib/zlib/0/buf_error.rbs +1 -70
  247. data/stdlib/zlib/0/data_error.rbs +1 -70
  248. data/stdlib/zlib/0/deflate.rbs +8 -72
  249. data/stdlib/zlib/0/error.rbs +1 -70
  250. data/stdlib/zlib/0/gzip_file/crc_error.rbs +2 -105
  251. data/stdlib/zlib/0/gzip_file/error.rbs +2 -105
  252. data/stdlib/zlib/0/gzip_file/length_error.rbs +2 -105
  253. data/stdlib/zlib/0/gzip_file/no_footer.rbs +2 -105
  254. data/stdlib/zlib/0/gzip_file.rbs +1 -71
  255. data/stdlib/zlib/0/gzip_reader.rbs +3 -74
  256. data/stdlib/zlib/0/gzip_writer.rbs +1 -70
  257. data/stdlib/zlib/0/inflate.rbs +4 -71
  258. data/stdlib/zlib/0/mem_error.rbs +1 -70
  259. data/stdlib/zlib/0/need_dict.rbs +1 -70
  260. data/stdlib/zlib/0/stream_end.rbs +1 -70
  261. data/stdlib/zlib/0/stream_error.rbs +1 -70
  262. data/stdlib/zlib/0/version_error.rbs +1 -70
  263. data/stdlib/zlib/0/zlib.rbs +0 -2
  264. data/stdlib/zlib/0/zstream.rbs +4 -72
  265. metadata +17 -13
  266. data/ext/rbs_extension/ruby_objs.c +0 -602
  267. data/ext/rbs_extension/ruby_objs.h +0 -51
  268. data/stdlib/minitest/0/manifest.yaml +0 -2
@@ -36,9 +36,12 @@ void rbs_loc_alloc_children(rbs_loc *loc, unsigned short cap) {
36
36
  size_t s = RBS_LOC_CHILDREN_SIZE(cap);
37
37
  loc->children = malloc(s);
38
38
 
39
- loc->children->len = 0;
40
- loc->children->required_p = 0;
41
- loc->children->cap = cap;
39
+ *loc->children = (rbs_loc_children) {
40
+ .len = 0,
41
+ .required_p = 0,
42
+ .cap = cap,
43
+ .entries = {{ 0 }},
44
+ };
42
45
  }
43
46
 
44
47
  static void check_children_cap(rbs_loc *loc) {
@@ -53,28 +56,29 @@ static void check_children_cap(rbs_loc *loc) {
53
56
  }
54
57
  }
55
58
 
56
- void rbs_loc_add_required_child(rbs_loc *loc, ID name, range r) {
57
- check_children_cap(loc);
58
-
59
- unsigned short i = loc->children->len++;
60
- loc->children->entries[i].name = name;
61
- loc->children->entries[i].rg = rbs_new_loc_range(r);
59
+ void rbs_loc_add_required_child(rbs_loc *loc, rbs_constant_id_t name, range r) {
60
+ rbs_loc_add_optional_child(loc, name, r);
62
61
 
63
- loc->children->required_p |= 1 << i;
62
+ unsigned short last_index = loc->children->len - 1;
63
+ loc->children->required_p |= 1 << last_index;
64
64
  }
65
65
 
66
- void rbs_loc_add_optional_child(rbs_loc *loc, ID name, range r) {
66
+ void rbs_loc_add_optional_child(rbs_loc *loc, rbs_constant_id_t name, range r) {
67
67
  check_children_cap(loc);
68
68
 
69
69
  unsigned short i = loc->children->len++;
70
- loc->children->entries[i].name = name;
71
- loc->children->entries[i].rg = rbs_new_loc_range(r);
70
+ loc->children->entries[i] = (rbs_loc_entry) {
71
+ .name = name,
72
+ .rg = rbs_new_loc_range(r),
73
+ };
72
74
  }
73
75
 
74
76
  void rbs_loc_init(rbs_loc *loc, VALUE buffer, rbs_loc_range rg) {
75
- loc->buffer = buffer;
76
- loc->rg = rg;
77
- loc->children = NULL;
77
+ *loc = (rbs_loc) {
78
+ .buffer = buffer,
79
+ .rg = rg,
80
+ .children = NULL,
81
+ };
78
82
  }
79
83
 
80
84
  void rbs_loc_free(rbs_loc *loc) {
@@ -122,9 +126,11 @@ static VALUE location_initialize(VALUE self, VALUE buffer, VALUE start_pos, VALU
122
126
  int start = FIX2INT(start_pos);
123
127
  int end = FIX2INT(end_pos);
124
128
 
125
- loc->buffer = buffer;
126
- loc->rg.start = start;
127
- loc->rg.end = end;
129
+ *loc = (rbs_loc) {
130
+ .buffer = buffer,
131
+ .rg = (rbs_loc_range) { start, end },
132
+ .children = NULL,
133
+ };
128
134
 
129
135
  return Qnil;
130
136
  }
@@ -133,8 +139,12 @@ static VALUE location_initialize_copy(VALUE self, VALUE other) {
133
139
  rbs_loc *self_loc = rbs_check_location(self);
134
140
  rbs_loc *other_loc = rbs_check_location(other);
135
141
 
136
- self_loc->buffer = other_loc->buffer;
137
- self_loc->rg = other_loc->rg;
142
+ *self_loc = (rbs_loc) {
143
+ .buffer = other_loc->buffer,
144
+ .rg = other_loc->rg,
145
+ .children = NULL,
146
+ };
147
+
138
148
  if (other_loc->children != NULL) {
139
149
  rbs_loc_alloc_children(self_loc, other_loc->children->cap);
140
150
  memcpy(self_loc->children, other_loc->children, RBS_LOC_CHILDREN_SIZE(other_loc->children->cap));
@@ -158,6 +168,15 @@ static VALUE location_end_pos(VALUE self) {
158
168
  return INT2FIX(loc->rg.end);
159
169
  }
160
170
 
171
+ static rbs_constant_id_t rbs_constant_pool_insert_ruby_symbol(VALUE symbol) {
172
+ VALUE name = rb_sym2str(symbol);
173
+
174
+ // Constants inserted here will never be freed, but that's acceptable because:
175
+ // 1. Most symbols passed into here will be the ones already inserted into the constant pool by `parser.c`.
176
+ // 2. Methods like `add_required_child` and `add_optional_child` will usually only get called with a few different symbols.
177
+ return rbs_constant_pool_insert_constant(RBS_GLOBAL_CONSTANT_POOL, (const uint8_t *) RSTRING_PTR(name), RSTRING_LEN(name));
178
+ }
179
+
161
180
  static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VALUE end) {
162
181
  rbs_loc *loc = rbs_check_location(self);
163
182
 
@@ -165,7 +184,7 @@ static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VA
165
184
  rg.start = rbs_loc_position(FIX2INT(start));
166
185
  rg.end = rbs_loc_position(FIX2INT(end));
167
186
 
168
- rbs_loc_add_required_child(loc, SYM2ID(name), rg);
187
+ rbs_loc_add_required_child(loc, rbs_constant_pool_insert_ruby_symbol(name), rg);
169
188
 
170
189
  return Qnil;
171
190
  }
@@ -177,7 +196,7 @@ static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VA
177
196
  rg.start = rbs_loc_position(FIX2INT(start));
178
197
  rg.end = rbs_loc_position(FIX2INT(end));
179
198
 
180
- rbs_loc_add_optional_child(loc, SYM2ID(name), rg);
199
+ rbs_loc_add_optional_child(loc, rbs_constant_pool_insert_ruby_symbol(name), rg);
181
200
 
182
201
  return Qnil;
183
202
  }
@@ -185,7 +204,7 @@ static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VA
185
204
  static VALUE location_add_optional_no_child(VALUE self, VALUE name) {
186
205
  rbs_loc *loc = rbs_check_location(self);
187
206
 
188
- rbs_loc_add_optional_child(loc, SYM2ID(name), NULL_RANGE);
207
+ rbs_loc_add_optional_child(loc, rbs_constant_pool_insert_ruby_symbol(name), NULL_RANGE);
189
208
 
190
209
  return Qnil;
191
210
  }
@@ -208,12 +227,18 @@ static VALUE rbs_new_location_from_loc_range(VALUE buffer, rbs_loc_range rg) {
208
227
  return obj;
209
228
  }
210
229
 
230
+ static rbs_constant_id_t rbs_constant_pool_find_ruby_symbol(VALUE symbol) {
231
+ VALUE name = rb_sym2str(symbol);
232
+
233
+ return rbs_constant_pool_find(RBS_GLOBAL_CONSTANT_POOL, (const uint8_t *) RSTRING_PTR(name), RSTRING_LEN(name));
234
+ }
235
+
211
236
  static VALUE location_aref(VALUE self, VALUE name) {
212
237
  rbs_loc *loc = rbs_check_location(self);
213
238
 
214
- ID id = SYM2ID(name);
239
+ rbs_constant_id_t id = rbs_constant_pool_find_ruby_symbol(name);
215
240
 
216
- if (loc->children != NULL) {
241
+ if (loc->children != NULL && id != RBS_CONSTANT_ID_UNSET) {
217
242
  for (unsigned short i = 0; i < loc->children->len; i++) {
218
243
  if (loc->children->entries[i].name == id) {
219
244
  rbs_loc_range result = loc->children->entries[i].rg;
@@ -231,6 +256,10 @@ static VALUE location_aref(VALUE self, VALUE name) {
231
256
  rb_raise(rb_eRuntimeError, "Unknown child name given: %s", RSTRING_PTR(string));
232
257
  }
233
258
 
259
+ static VALUE rbs_constant_to_ruby_symbol(rbs_constant_t *constant) {
260
+ return ID2SYM(rb_intern2((const char *) constant->start, constant->length));
261
+ }
262
+
234
263
  static VALUE location_optional_keys(VALUE self) {
235
264
  VALUE keys = rb_ary_new();
236
265
 
@@ -242,8 +271,9 @@ static VALUE location_optional_keys(VALUE self) {
242
271
 
243
272
  for (unsigned short i = 0; i < children->len; i++) {
244
273
  if (RBS_LOC_OPTIONAL_P(loc, i)) {
245
- rb_ary_push(keys, ID2SYM(children->entries[i].name));
246
-
274
+ rbs_constant_t *key_id = rbs_constant_pool_id_to_constant(RBS_GLOBAL_CONSTANT_POOL, children->entries[i].name);
275
+ VALUE key_sym = rbs_constant_to_ruby_symbol(key_id);
276
+ rb_ary_push(keys, key_sym);
247
277
  }
248
278
  }
249
279
 
@@ -261,7 +291,9 @@ static VALUE location_required_keys(VALUE self) {
261
291
 
262
292
  for (unsigned short i = 0; i < children->len; i++) {
263
293
  if (RBS_LOC_REQUIRED_P(loc, i)) {
264
- rb_ary_push(keys, ID2SYM(children->entries[i].name));
294
+ rbs_constant_t *key_id = rbs_constant_pool_id_to_constant(RBS_GLOBAL_CONSTANT_POOL, children->entries[i].name);
295
+ VALUE key_sym = rbs_constant_to_ruby_symbol(key_id);
296
+ rb_ary_push(keys, key_sym);
265
297
  }
266
298
  }
267
299
 
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include "ruby.h"
5
5
  #include "lexer.h"
6
+ #include "rbs/util/rbs_constant_pool.h"
6
7
 
7
8
  /**
8
9
  * RBS::Location class
@@ -15,7 +16,7 @@ typedef struct {
15
16
  } rbs_loc_range;
16
17
 
17
18
  typedef struct {
18
- ID name;
19
+ rbs_constant_id_t name;
19
20
  rbs_loc_range rg;
20
21
  } rbs_loc_entry;
21
22
 
@@ -58,14 +59,14 @@ void rbs_loc_alloc_children(rbs_loc *loc, unsigned short cap);
58
59
  *
59
60
  * Allocate memory for children with rbs_loc_alloc_children before calling this function.
60
61
  * */
61
- void rbs_loc_add_required_child(rbs_loc *loc, ID name, range r);
62
+ void rbs_loc_add_required_child(rbs_loc *loc, rbs_constant_id_t name, range r);
62
63
 
63
64
  /**
64
65
  * Add an optional child range with given name.
65
66
  *
66
67
  * Allocate memory for children with rbs_loc_alloc_children before calling this function.
67
68
  * */
68
- void rbs_loc_add_optional_child(rbs_loc *loc, ID name, range r);
69
+ void rbs_loc_add_optional_child(rbs_loc *loc, rbs_constant_id_t name, range r);
69
70
 
70
71
  /**
71
72
  * Returns RBS::Location object with start/end positions.
@@ -1,12 +1,34 @@
1
1
  #include "rbs_extension.h"
2
+ #include "rbs/util/rbs_constant_pool.h"
3
+
4
+ #include "ruby/vm.h"
5
+
6
+ static
7
+ void Deinit_rbs_extension(ruby_vm_t *_) {
8
+ rbs_constant_pool_free(RBS_GLOBAL_CONSTANT_POOL);
9
+ }
2
10
 
3
11
  void
4
12
  Init_rbs_extension(void)
5
13
  {
6
14
  #ifdef HAVE_RB_EXT_RACTOR_SAFE
7
15
  rb_ext_ractor_safe(true);
8
- #endif
16
+ #endif
9
17
  rbs__init_constants();
10
18
  rbs__init_location();
11
19
  rbs__init_parser();
20
+
21
+ /* Calculated based on the number of unique strings used with the `INTERN` macro in `parser.c`.
22
+ *
23
+ * ```bash
24
+ * grep -o 'INTERN("\([^"]*\)")' ext/rbs_extension/parser.c \
25
+ * | sed 's/INTERN("\(.*\)")/\1/' \
26
+ * | sort -u \
27
+ * | wc -l
28
+ * ```
29
+ */
30
+ const size_t num_uniquely_interned_strings = 26;
31
+ rbs_constant_pool_init(RBS_GLOBAL_CONSTANT_POOL, num_uniquely_interned_strings);
32
+
33
+ ruby_vm_at_exit(Deinit_rbs_extension);
12
34
  }