rbs 4.0.0.dev.4 → 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 (281) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +18 -11
  5. data/.github/workflows/comments.yml +5 -3
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +27 -34
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +2 -2
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +1 -1
  12. data/CHANGELOG.md +323 -0
  13. data/README.md +1 -1
  14. data/Rakefile +43 -33
  15. data/Steepfile +1 -0
  16. data/config.yml +426 -24
  17. data/core/array.rbs +307 -227
  18. data/core/basic_object.rbs +9 -8
  19. data/core/binding.rbs +0 -2
  20. data/core/builtin.rbs +2 -2
  21. data/core/class.rbs +6 -5
  22. data/core/comparable.rbs +55 -34
  23. data/core/complex.rbs +104 -78
  24. data/core/dir.rbs +61 -49
  25. data/core/encoding.rbs +12 -15
  26. data/core/enumerable.rbs +179 -87
  27. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  28. data/core/enumerator.rbs +65 -2
  29. data/core/errno.rbs +11 -2
  30. data/core/errors.rbs +58 -29
  31. data/core/exception.rbs +13 -13
  32. data/core/fiber.rbs +74 -54
  33. data/core/file.rbs +280 -177
  34. data/core/file_test.rbs +3 -3
  35. data/core/float.rbs +257 -92
  36. data/core/gc.rbs +425 -281
  37. data/core/hash.rbs +1045 -739
  38. data/core/integer.rbs +135 -137
  39. data/core/io/buffer.rbs +53 -42
  40. data/core/io/wait.rbs +13 -35
  41. data/core/io.rbs +192 -144
  42. data/core/kernel.rbs +216 -155
  43. data/core/marshal.rbs +4 -4
  44. data/core/match_data.rbs +15 -13
  45. data/core/math.rbs +107 -66
  46. data/core/method.rbs +69 -33
  47. data/core/module.rbs +244 -106
  48. data/core/nil_class.rbs +7 -6
  49. data/core/numeric.rbs +74 -63
  50. data/core/object.rbs +9 -11
  51. data/core/object_space.rbs +30 -23
  52. data/core/pathname.rbs +1322 -0
  53. data/core/proc.rbs +95 -58
  54. data/core/process.rbs +222 -202
  55. data/core/ractor.rbs +371 -515
  56. data/core/random.rbs +21 -3
  57. data/core/range.rbs +159 -57
  58. data/core/rational.rbs +60 -89
  59. data/core/rbs/unnamed/argf.rbs +60 -53
  60. data/core/rbs/unnamed/env_class.rbs +19 -14
  61. data/core/rbs/unnamed/main_class.rbs +123 -0
  62. data/core/rbs/unnamed/random.rbs +11 -118
  63. data/core/regexp.rbs +258 -214
  64. data/core/ruby.rbs +53 -0
  65. data/core/ruby_vm.rbs +38 -34
  66. data/core/rubygems/config_file.rbs +5 -5
  67. data/core/rubygems/errors.rbs +4 -71
  68. data/core/rubygems/requirement.rbs +5 -5
  69. data/core/rubygems/rubygems.rbs +16 -82
  70. data/core/rubygems/version.rbs +2 -3
  71. data/core/set.rbs +490 -360
  72. data/core/signal.rbs +26 -16
  73. data/core/string.rbs +3234 -1285
  74. data/core/struct.rbs +27 -26
  75. data/core/symbol.rbs +41 -34
  76. data/core/thread.rbs +135 -67
  77. data/core/time.rbs +81 -50
  78. data/core/trace_point.rbs +41 -35
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +24 -16
  81. data/core/warning.rbs +7 -7
  82. data/docs/aliases.md +79 -0
  83. data/docs/collection.md +3 -3
  84. data/docs/config.md +171 -0
  85. data/docs/encoding.md +56 -0
  86. data/docs/gem.md +0 -1
  87. data/docs/inline.md +576 -0
  88. data/docs/sigs.md +3 -3
  89. data/docs/syntax.md +46 -16
  90. data/docs/type_fingerprint.md +21 -0
  91. data/exe/rbs +1 -1
  92. data/ext/rbs_extension/ast_translation.c +544 -116
  93. data/ext/rbs_extension/ast_translation.h +3 -0
  94. data/ext/rbs_extension/class_constants.c +16 -2
  95. data/ext/rbs_extension/class_constants.h +8 -0
  96. data/ext/rbs_extension/extconf.rb +5 -1
  97. data/ext/rbs_extension/legacy_location.c +33 -56
  98. data/ext/rbs_extension/legacy_location.h +37 -0
  99. data/ext/rbs_extension/main.c +44 -35
  100. data/include/rbs/ast.h +448 -173
  101. data/include/rbs/defines.h +27 -0
  102. data/include/rbs/lexer.h +30 -11
  103. data/include/rbs/location.h +25 -44
  104. data/include/rbs/parser.h +6 -6
  105. data/include/rbs/string.h +0 -2
  106. data/include/rbs/util/rbs_allocator.h +34 -13
  107. data/include/rbs/util/rbs_assert.h +12 -1
  108. data/include/rbs/util/rbs_constant_pool.h +0 -3
  109. data/include/rbs/util/rbs_encoding.h +2 -0
  110. data/include/rbs/util/rbs_unescape.h +2 -1
  111. data/include/rbs.h +8 -0
  112. data/lib/rbs/ast/annotation.rb +1 -1
  113. data/lib/rbs/ast/comment.rb +1 -1
  114. data/lib/rbs/ast/declarations.rb +10 -10
  115. data/lib/rbs/ast/members.rb +14 -14
  116. data/lib/rbs/ast/ruby/annotations.rb +293 -3
  117. data/lib/rbs/ast/ruby/comment_block.rb +24 -0
  118. data/lib/rbs/ast/ruby/declarations.rb +198 -3
  119. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  120. data/lib/rbs/ast/ruby/members.rb +532 -22
  121. data/lib/rbs/ast/type_param.rb +24 -4
  122. data/lib/rbs/buffer.rb +20 -15
  123. data/lib/rbs/cli/diff.rb +16 -15
  124. data/lib/rbs/cli/validate.rb +38 -106
  125. data/lib/rbs/cli.rb +52 -19
  126. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  127. data/lib/rbs/collection/sources/git.rb +1 -0
  128. data/lib/rbs/definition.rb +1 -1
  129. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  130. data/lib/rbs/definition_builder/method_builder.rb +20 -0
  131. data/lib/rbs/definition_builder.rb +147 -25
  132. data/lib/rbs/diff.rb +7 -1
  133. data/lib/rbs/environment.rb +227 -74
  134. data/lib/rbs/environment_loader.rb +0 -6
  135. data/lib/rbs/errors.rb +27 -18
  136. data/lib/rbs/inline_parser.rb +342 -6
  137. data/lib/rbs/location_aux.rb +1 -1
  138. data/lib/rbs/locator.rb +5 -1
  139. data/lib/rbs/method_type.rb +5 -3
  140. data/lib/rbs/parser_aux.rb +20 -7
  141. data/lib/rbs/prototype/helpers.rb +57 -0
  142. data/lib/rbs/prototype/rb.rb +3 -28
  143. data/lib/rbs/prototype/rbi.rb +3 -20
  144. data/lib/rbs/prototype/runtime.rb +8 -0
  145. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  146. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  147. data/lib/rbs/subtractor.rb +3 -1
  148. data/lib/rbs/test/type_check.rb +19 -2
  149. data/lib/rbs/type_name.rb +1 -1
  150. data/lib/rbs/types.rb +88 -78
  151. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  152. data/lib/rbs/validator.rb +2 -2
  153. data/lib/rbs/version.rb +1 -1
  154. data/lib/rbs.rb +1 -2
  155. data/lib/rdoc/discover.rb +1 -1
  156. data/lib/rdoc_plugin/parser.rb +1 -1
  157. data/rbs.gemspec +4 -3
  158. data/rust/.gitignore +1 -0
  159. data/rust/Cargo.lock +378 -0
  160. data/rust/Cargo.toml +7 -0
  161. data/rust/ruby-rbs/Cargo.toml +22 -0
  162. data/rust/ruby-rbs/build.rs +764 -0
  163. data/rust/ruby-rbs/examples/locations.rs +60 -0
  164. data/rust/ruby-rbs/src/lib.rs +1 -0
  165. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  166. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  167. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  168. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  169. data/rust/ruby-rbs-sys/build.rs +204 -0
  170. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  171. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  172. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  173. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  174. data/schema/typeParam.json +17 -1
  175. data/sig/ast/ruby/annotations.rbs +315 -4
  176. data/sig/ast/ruby/comment_block.rbs +8 -0
  177. data/sig/ast/ruby/declarations.rbs +102 -4
  178. data/sig/ast/ruby/members.rbs +108 -2
  179. data/sig/cli/diff.rbs +5 -11
  180. data/sig/cli/validate.rbs +12 -8
  181. data/sig/cli.rbs +18 -18
  182. data/sig/definition.rbs +6 -1
  183. data/sig/definition_builder.rbs +2 -0
  184. data/sig/environment.rbs +70 -12
  185. data/sig/errors.rbs +13 -14
  186. data/sig/inline_parser.rbs +39 -2
  187. data/sig/locator.rbs +0 -2
  188. data/sig/manifest.yaml +0 -1
  189. data/sig/method_builder.rbs +3 -1
  190. data/sig/parser.rbs +31 -13
  191. data/sig/prototype/helpers.rbs +2 -0
  192. data/sig/resolver/type_name_resolver.rbs +35 -7
  193. data/sig/source.rbs +3 -3
  194. data/sig/type_param.rbs +13 -8
  195. data/sig/types.rbs +6 -7
  196. data/sig/unit_test/spy.rbs +0 -8
  197. data/sig/unit_test/type_assertions.rbs +11 -0
  198. data/src/ast.c +410 -153
  199. data/src/lexer.c +1392 -1313
  200. data/src/lexer.re +3 -0
  201. data/src/lexstate.c +58 -37
  202. data/src/location.c +8 -48
  203. data/src/parser.c +977 -516
  204. data/src/string.c +0 -48
  205. data/src/util/rbs_allocator.c +89 -71
  206. data/src/util/rbs_assert.c +1 -1
  207. data/src/util/rbs_buffer.c +2 -2
  208. data/src/util/rbs_constant_pool.c +10 -14
  209. data/src/util/rbs_encoding.c +4 -8
  210. data/src/util/rbs_unescape.c +56 -20
  211. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  212. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  213. data/stdlib/cgi/0/core.rbs +9 -393
  214. data/stdlib/cgi/0/manifest.yaml +1 -0
  215. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  216. data/stdlib/coverage/0/coverage.rbs +7 -4
  217. data/stdlib/date/0/date.rbs +92 -79
  218. data/stdlib/date/0/date_time.rbs +25 -24
  219. data/stdlib/delegate/0/delegator.rbs +10 -7
  220. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  221. data/stdlib/digest/0/digest.rbs +110 -0
  222. data/stdlib/erb/0/erb.rbs +748 -347
  223. data/stdlib/etc/0/etc.rbs +55 -50
  224. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  225. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  226. data/stdlib/io-console/0/io-console.rbs +2 -2
  227. data/stdlib/json/0/json.rbs +217 -136
  228. data/stdlib/monitor/0/monitor.rbs +3 -3
  229. data/stdlib/net-http/0/net-http.rbs +162 -134
  230. data/stdlib/objspace/0/objspace.rbs +17 -34
  231. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  232. data/stdlib/open3/0/open3.rbs +469 -10
  233. data/stdlib/openssl/0/openssl.rbs +475 -357
  234. data/stdlib/optparse/0/optparse.rbs +26 -17
  235. data/stdlib/pathname/0/pathname.rbs +11 -1381
  236. data/stdlib/pp/0/pp.rbs +9 -8
  237. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  238. data/stdlib/pstore/0/pstore.rbs +35 -30
  239. data/stdlib/psych/0/psych.rbs +65 -12
  240. data/stdlib/psych/0/store.rbs +2 -4
  241. data/stdlib/pty/0/pty.rbs +9 -6
  242. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  243. data/stdlib/rdoc/0/code_object.rbs +2 -1
  244. data/stdlib/rdoc/0/parser.rbs +1 -1
  245. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  246. data/stdlib/rdoc/0/store.rbs +1 -1
  247. data/stdlib/resolv/0/resolv.rbs +25 -68
  248. data/stdlib/ripper/0/ripper.rbs +22 -19
  249. data/stdlib/securerandom/0/manifest.yaml +2 -0
  250. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  251. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  252. data/stdlib/singleton/0/singleton.rbs +3 -0
  253. data/stdlib/socket/0/addrinfo.rbs +7 -7
  254. data/stdlib/socket/0/basic_socket.rbs +3 -3
  255. data/stdlib/socket/0/ip_socket.rbs +10 -8
  256. data/stdlib/socket/0/socket.rbs +23 -10
  257. data/stdlib/socket/0/tcp_server.rbs +1 -1
  258. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  259. data/stdlib/socket/0/udp_socket.rbs +1 -1
  260. data/stdlib/socket/0/unix_server.rbs +1 -1
  261. data/stdlib/stringio/0/stringio.rbs +1177 -85
  262. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  263. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  264. data/stdlib/time/0/time.rbs +8 -6
  265. data/stdlib/timeout/0/timeout.rbs +63 -7
  266. data/stdlib/tsort/0/cyclic.rbs +3 -0
  267. data/stdlib/tsort/0/tsort.rbs +7 -6
  268. data/stdlib/uri/0/common.rbs +42 -20
  269. data/stdlib/uri/0/file.rbs +3 -3
  270. data/stdlib/uri/0/generic.rbs +26 -18
  271. data/stdlib/uri/0/http.rbs +2 -2
  272. data/stdlib/uri/0/ldap.rbs +2 -2
  273. data/stdlib/uri/0/mailto.rbs +3 -3
  274. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  275. data/stdlib/zlib/0/deflate.rbs +4 -3
  276. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  277. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  278. data/stdlib/zlib/0/inflate.rbs +1 -1
  279. data/stdlib/zlib/0/need_dict.rbs +1 -1
  280. data/stdlib/zlib/0/zstream.rbs +1 -0
  281. metadata +50 -6
@@ -31,4 +31,7 @@ VALUE rbs_node_list_to_ruby_array(rbs_translation_context_t, rbs_node_list_t *li
31
31
  VALUE rbs_hash_to_ruby_hash(rbs_translation_context_t, rbs_hash_t *hash);
32
32
  VALUE rbs_struct_to_ruby_value(rbs_translation_context_t, rbs_node_t *instance);
33
33
 
34
+ extern VALUE EMPTY_ARRAY;
35
+ extern VALUE EMPTY_HASH;
36
+
34
37
  #endif
@@ -7,8 +7,6 @@
7
7
 
8
8
  #include "rbs_extension.h"
9
9
 
10
- VALUE RBS_Parser;
11
-
12
10
  VALUE RBS;
13
11
  VALUE RBS_AST;
14
12
  VALUE RBS_AST_Declarations;
@@ -49,11 +47,19 @@ VALUE RBS_AST_Members_MethodDefinition_Overload;
49
47
  VALUE RBS_AST_Members_Prepend;
50
48
  VALUE RBS_AST_Members_Private;
51
49
  VALUE RBS_AST_Members_Public;
50
+ VALUE RBS_AST_Ruby_Annotations_BlockParamTypeAnnotation;
51
+ VALUE RBS_AST_Ruby_Annotations_ClassAliasAnnotation;
52
52
  VALUE RBS_AST_Ruby_Annotations_ColonMethodTypeAnnotation;
53
+ VALUE RBS_AST_Ruby_Annotations_DoubleSplatParamTypeAnnotation;
54
+ VALUE RBS_AST_Ruby_Annotations_InstanceVariableAnnotation;
53
55
  VALUE RBS_AST_Ruby_Annotations_MethodTypesAnnotation;
56
+ VALUE RBS_AST_Ruby_Annotations_ModuleAliasAnnotation;
54
57
  VALUE RBS_AST_Ruby_Annotations_NodeTypeAssertion;
58
+ VALUE RBS_AST_Ruby_Annotations_ParamTypeAnnotation;
55
59
  VALUE RBS_AST_Ruby_Annotations_ReturnTypeAnnotation;
56
60
  VALUE RBS_AST_Ruby_Annotations_SkipAnnotation;
61
+ VALUE RBS_AST_Ruby_Annotations_SplatParamTypeAnnotation;
62
+ VALUE RBS_AST_Ruby_Annotations_TypeApplicationAnnotation;
57
63
  VALUE RBS_AST_TypeParam;
58
64
  VALUE RBS_MethodType;
59
65
  VALUE RBS_Namespace;
@@ -134,11 +140,19 @@ void rbs__init_constants(void) {
134
140
  IMPORT_CONSTANT(RBS_AST_Members_Prepend, RBS_AST_Members, "Prepend");
135
141
  IMPORT_CONSTANT(RBS_AST_Members_Private, RBS_AST_Members, "Private");
136
142
  IMPORT_CONSTANT(RBS_AST_Members_Public, RBS_AST_Members, "Public");
143
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_BlockParamTypeAnnotation, RBS_AST_Ruby_Annotations, "BlockParamTypeAnnotation");
144
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ClassAliasAnnotation, RBS_AST_Ruby_Annotations, "ClassAliasAnnotation");
137
145
  IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ColonMethodTypeAnnotation, RBS_AST_Ruby_Annotations, "ColonMethodTypeAnnotation");
146
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_DoubleSplatParamTypeAnnotation, RBS_AST_Ruby_Annotations, "DoubleSplatParamTypeAnnotation");
147
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_InstanceVariableAnnotation, RBS_AST_Ruby_Annotations, "InstanceVariableAnnotation");
138
148
  IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_MethodTypesAnnotation, RBS_AST_Ruby_Annotations, "MethodTypesAnnotation");
149
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ModuleAliasAnnotation, RBS_AST_Ruby_Annotations, "ModuleAliasAnnotation");
139
150
  IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_NodeTypeAssertion, RBS_AST_Ruby_Annotations, "NodeTypeAssertion");
151
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ParamTypeAnnotation, RBS_AST_Ruby_Annotations, "ParamTypeAnnotation");
140
152
  IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_ReturnTypeAnnotation, RBS_AST_Ruby_Annotations, "ReturnTypeAnnotation");
141
153
  IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_SkipAnnotation, RBS_AST_Ruby_Annotations, "SkipAnnotation");
154
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_SplatParamTypeAnnotation, RBS_AST_Ruby_Annotations, "SplatParamTypeAnnotation");
155
+ IMPORT_CONSTANT(RBS_AST_Ruby_Annotations_TypeApplicationAnnotation, RBS_AST_Ruby_Annotations, "TypeApplicationAnnotation");
142
156
  IMPORT_CONSTANT(RBS_AST_TypeParam, RBS_AST, "TypeParam");
143
157
  IMPORT_CONSTANT(RBS_MethodType, RBS, "MethodType");
144
158
  IMPORT_CONSTANT(RBS_Namespace, RBS, "Namespace");
@@ -55,11 +55,19 @@ extern VALUE RBS_AST_Members_MethodDefinition_Overload;
55
55
  extern VALUE RBS_AST_Members_Prepend;
56
56
  extern VALUE RBS_AST_Members_Private;
57
57
  extern VALUE RBS_AST_Members_Public;
58
+ extern VALUE RBS_AST_Ruby_Annotations_BlockParamTypeAnnotation;
59
+ extern VALUE RBS_AST_Ruby_Annotations_ClassAliasAnnotation;
58
60
  extern VALUE RBS_AST_Ruby_Annotations_ColonMethodTypeAnnotation;
61
+ extern VALUE RBS_AST_Ruby_Annotations_DoubleSplatParamTypeAnnotation;
62
+ extern VALUE RBS_AST_Ruby_Annotations_InstanceVariableAnnotation;
59
63
  extern VALUE RBS_AST_Ruby_Annotations_MethodTypesAnnotation;
64
+ extern VALUE RBS_AST_Ruby_Annotations_ModuleAliasAnnotation;
60
65
  extern VALUE RBS_AST_Ruby_Annotations_NodeTypeAssertion;
66
+ extern VALUE RBS_AST_Ruby_Annotations_ParamTypeAnnotation;
61
67
  extern VALUE RBS_AST_Ruby_Annotations_ReturnTypeAnnotation;
62
68
  extern VALUE RBS_AST_Ruby_Annotations_SkipAnnotation;
69
+ extern VALUE RBS_AST_Ruby_Annotations_SplatParamTypeAnnotation;
70
+ extern VALUE RBS_AST_Ruby_Annotations_TypeApplicationAnnotation;
63
71
  extern VALUE RBS_AST_TypeParam;
64
72
  extern VALUE RBS_MethodType;
65
73
  extern VALUE RBS_Namespace;
@@ -18,7 +18,11 @@ append_cflags [
18
18
  '-Wc++-compat',
19
19
  ]
20
20
 
21
- append_cflags ['-O0', '-g'] if ENV['DEBUG']
21
+ if ENV['DEBUG']
22
+ append_cflags ['-O0', '-pg']
23
+ else
24
+ append_cflags ['-DNDEBUG']
25
+ end
22
26
  if ENV["TEST_NO_C23"]
23
27
  puts "Adding -Wc2x-extensions to CFLAGS"
24
28
  $CFLAGS << " -Werror -Wc2x-extensions"
@@ -1,5 +1,6 @@
1
1
  #include "legacy_location.h"
2
2
  #include "rbs_extension.h"
3
+ #include "ruby/internal/symbol.h"
3
4
 
4
5
  #define RBS_LOC_REQUIRED_P(loc, i) ((loc)->children->required_p & (1 << (i)))
5
6
  #define RBS_LOC_OPTIONAL_P(loc, i) (!RBS_LOC_REQUIRED_P((loc), (i)))
@@ -9,19 +10,6 @@
9
10
  rbs_loc_range RBS_LOC_NULL_RANGE = { -1, -1 };
10
11
  VALUE RBS_Location;
11
12
 
12
- rbs_position_t rbs_loc_position(int char_pos) {
13
- return (rbs_position_t) { 0, char_pos, -1, -1 };
14
- }
15
-
16
- rbs_position_t rbs_loc_position3(int char_pos, int line, int column) {
17
- return (rbs_position_t) { 0, char_pos, line, column };
18
- }
19
-
20
- static rbs_loc_range rbs_new_loc_range(rbs_range_t rg) {
21
- rbs_loc_range r = { rg.start.char_pos, rg.end.char_pos };
22
- return r;
23
- }
24
-
25
13
  static void check_children_max(unsigned short n) {
26
14
  size_t max = sizeof(rbs_loc_entry_bitmap) * 8;
27
15
  if (n > max) {
@@ -33,8 +21,7 @@ void rbs_loc_legacy_alloc_children(rbs_loc *loc, unsigned short cap) {
33
21
  check_children_max(cap);
34
22
 
35
23
  size_t s = RBS_LOC_CHILDREN_SIZE(cap);
36
- loc->children = malloc(s);
37
-
24
+ loc->children = (rbs_loc_children *) malloc(s);
38
25
  *loc->children = (rbs_loc_children) {
39
26
  .len = 0,
40
27
  .required_p = 0,
@@ -50,22 +37,22 @@ static void check_children_cap(rbs_loc *loc) {
50
37
  if (loc->children->len == loc->children->cap) {
51
38
  check_children_max(loc->children->cap + 1);
52
39
  size_t s = RBS_LOC_CHILDREN_SIZE(++loc->children->cap);
53
- loc->children = realloc(loc->children, s);
40
+ loc->children = (rbs_loc_children *) realloc(loc->children, s);
54
41
  }
55
42
  }
56
43
  }
57
44
 
58
- void rbs_loc_legacy_add_optional_child(rbs_loc *loc, rbs_constant_id_t name, rbs_range_t r) {
45
+ void rbs_loc_legacy_add_optional_child(rbs_loc *loc, ID name, rbs_loc_range r) {
59
46
  check_children_cap(loc);
60
47
 
61
48
  unsigned short i = loc->children->len++;
62
49
  loc->children->entries[i] = (rbs_loc_entry) {
63
50
  .name = name,
64
- .rg = rbs_new_loc_range(r),
51
+ .rg = r,
65
52
  };
66
53
  }
67
54
 
68
- void rbs_loc_legacy_add_required_child(rbs_loc *loc, rbs_constant_id_t name, rbs_range_t r) {
55
+ void rbs_loc_legacy_add_required_child(rbs_loc *loc, ID name, rbs_loc_range r) {
69
56
  rbs_loc_legacy_add_optional_child(loc, name, r);
70
57
 
71
58
  unsigned short last_index = loc->children->len - 1;
@@ -86,12 +73,12 @@ void rbs_loc_free(rbs_loc *loc) {
86
73
  }
87
74
 
88
75
  static void rbs_loc_mark(void *ptr) {
89
- rbs_loc *loc = ptr;
76
+ rbs_loc *loc = (rbs_loc *) ptr;
90
77
  rb_gc_mark(loc->buffer);
91
78
  }
92
79
 
93
80
  static size_t rbs_loc_memsize(const void *ptr) {
94
- const rbs_loc *loc = ptr;
81
+ const rbs_loc *loc = (const rbs_loc *) ptr;
95
82
  if (loc->children == NULL) {
96
83
  return sizeof(rbs_loc);
97
84
  } else {
@@ -117,7 +104,7 @@ static VALUE location_s_allocate(VALUE klass) {
117
104
  }
118
105
 
119
106
  rbs_loc *rbs_check_location(VALUE obj) {
120
- return rb_check_typeddata(obj, &location_type);
107
+ return (rbs_loc *) rb_check_typeddata(obj, &location_type);
121
108
  }
122
109
 
123
110
  static VALUE location_initialize(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos) {
@@ -168,23 +155,15 @@ static VALUE location_end_pos(VALUE self) {
168
155
  return INT2FIX(loc->rg.end);
169
156
  }
170
157
 
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
-
180
158
  static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VALUE end) {
181
159
  rbs_loc *loc = rbs_check_location(self);
182
160
 
183
- rbs_range_t rg;
184
- rg.start = rbs_loc_position(FIX2INT(start));
185
- rg.end = rbs_loc_position(FIX2INT(end));
161
+ rbs_loc_range rg = {
162
+ .start = FIX2INT(start),
163
+ .end = FIX2INT(end),
164
+ };
186
165
 
187
- rbs_loc_legacy_add_required_child(loc, rbs_constant_pool_insert_ruby_symbol(name), rg);
166
+ rbs_loc_legacy_add_required_child(loc, rb_sym2id(name), rg);
188
167
 
189
168
  return Qnil;
190
169
  }
@@ -192,11 +171,12 @@ static VALUE location_add_required_child(VALUE self, VALUE name, VALUE start, VA
192
171
  static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VALUE end) {
193
172
  rbs_loc *loc = rbs_check_location(self);
194
173
 
195
- rbs_range_t rg;
196
- rg.start = rbs_loc_position(FIX2INT(start));
197
- rg.end = rbs_loc_position(FIX2INT(end));
174
+ rbs_loc_range rg = {
175
+ .start = FIX2INT(start),
176
+ .end = FIX2INT(end),
177
+ };
198
178
 
199
- rbs_loc_legacy_add_optional_child(loc, rbs_constant_pool_insert_ruby_symbol(name), rg);
179
+ rbs_loc_legacy_add_optional_child(loc, rb_sym2id(name), rg);
200
180
 
201
181
  return Qnil;
202
182
  }
@@ -204,7 +184,7 @@ static VALUE location_add_optional_child(VALUE self, VALUE name, VALUE start, VA
204
184
  static VALUE location_add_optional_no_child(VALUE self, VALUE name) {
205
185
  rbs_loc *loc = rbs_check_location(self);
206
186
 
207
- rbs_loc_legacy_add_optional_child(loc, rbs_constant_pool_insert_ruby_symbol(name), NULL_RANGE);
187
+ rbs_loc_legacy_add_optional_child(loc, rb_sym2id(name), RBS_LOC_NULL_RANGE);
208
188
 
209
189
  return Qnil;
210
190
  }
@@ -213,32 +193,35 @@ VALUE rbs_new_location(VALUE buffer, rbs_range_t rg) {
213
193
  rbs_loc *loc;
214
194
  VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
215
195
 
216
- rbs_loc_init(loc, buffer, rbs_new_loc_range(rg));
196
+ rbs_loc_init(loc, buffer, (rbs_loc_range) { rg.start.char_pos, rg.end.char_pos });
217
197
 
218
198
  return obj;
219
199
  }
220
200
 
221
- static VALUE rbs_new_location_from_loc_range(VALUE buffer, rbs_loc_range rg) {
201
+ VALUE rbs_new_location2(VALUE buffer, int start_char, int end_char) {
222
202
  rbs_loc *loc;
223
203
  VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
224
204
 
225
- rbs_loc_init(loc, buffer, rg);
205
+ rbs_loc_init(loc, buffer, (rbs_loc_range) { .start = start_char, .end = end_char });
226
206
 
227
207
  return obj;
228
208
  }
229
209
 
230
- static rbs_constant_id_t rbs_constant_pool_find_ruby_symbol(VALUE symbol) {
231
- VALUE name = rb_sym2str(symbol);
210
+ static VALUE rbs_new_location_from_loc_range(VALUE buffer, rbs_loc_range rg) {
211
+ rbs_loc *loc;
212
+ VALUE obj = TypedData_Make_Struct(RBS_Location, rbs_loc, &location_type, loc);
232
213
 
233
- return rbs_constant_pool_find(RBS_GLOBAL_CONSTANT_POOL, (const uint8_t *) RSTRING_PTR(name), RSTRING_LEN(name));
214
+ rbs_loc_init(loc, buffer, rg);
215
+
216
+ return obj;
234
217
  }
235
218
 
236
219
  static VALUE location_aref(VALUE self, VALUE name) {
237
220
  rbs_loc *loc = rbs_check_location(self);
238
221
 
239
- rbs_constant_id_t id = rbs_constant_pool_find_ruby_symbol(name);
222
+ ID id = rb_sym2id(name);
240
223
 
241
- if (loc->children != NULL && id != RBS_CONSTANT_ID_UNSET) {
224
+ if (loc->children != NULL) {
242
225
  for (unsigned short i = 0; i < loc->children->len; i++) {
243
226
  if (loc->children->entries[i].name == id) {
244
227
  rbs_loc_range result = loc->children->entries[i].rg;
@@ -256,10 +239,6 @@ static VALUE location_aref(VALUE self, VALUE name) {
256
239
  rb_raise(rb_eRuntimeError, "Unknown child name given: %s", RSTRING_PTR(string));
257
240
  }
258
241
 
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
-
263
242
  static VALUE location_optional_keys(VALUE self) {
264
243
  VALUE keys = rb_ary_new();
265
244
 
@@ -271,8 +250,7 @@ static VALUE location_optional_keys(VALUE self) {
271
250
 
272
251
  for (unsigned short i = 0; i < children->len; i++) {
273
252
  if (RBS_LOC_OPTIONAL_P(loc, i)) {
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);
253
+ VALUE key_sym = rb_id2sym(children->entries[i].name);
276
254
  rb_ary_push(keys, key_sym);
277
255
  }
278
256
  }
@@ -291,8 +269,7 @@ static VALUE location_required_keys(VALUE self) {
291
269
 
292
270
  for (unsigned short i = 0; i < children->len; i++) {
293
271
  if (RBS_LOC_REQUIRED_P(loc, i)) {
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);
272
+ VALUE key_sym = rb_id2sym(children->entries[i].name);
296
273
  rb_ary_push(keys, key_sym);
297
274
  }
298
275
  }
@@ -9,11 +9,43 @@ SUPPRESS_RUBY_HEADER_DIAGNOSTICS_END
9
9
 
10
10
  #include "rbs.h"
11
11
 
12
+ /**
13
+ * Data structures for implementing RBS::Location class in Ruby.
14
+ *
15
+ * These structs support hierarchical locations, allowing sub-locations (children)
16
+ * to be stored under a main location. Each sub-location is identified by its
17
+ * name (Ruby Symbol ID).
18
+ */
19
+
12
20
  /**
13
21
  * RBS::Location class
14
22
  * */
15
23
  extern VALUE RBS_Location;
16
24
 
25
+ /**
26
+ * Range of character index for `rbs_loc` locations.
27
+ */
28
+ typedef struct {
29
+ int start;
30
+ int end;
31
+ } rbs_loc_range;
32
+
33
+ typedef struct {
34
+ ID name; /* Ruby ID for the name of the entry */
35
+ rbs_loc_range rg;
36
+ } rbs_loc_entry;
37
+
38
+ typedef unsigned int rbs_loc_entry_bitmap;
39
+
40
+ // The flexible array always allocates, but it's okay.
41
+ // This struct is not allocated when the `rbs_loc` doesn't have children.
42
+ typedef struct {
43
+ unsigned short len;
44
+ unsigned short cap;
45
+ rbs_loc_entry_bitmap required_p;
46
+ rbs_loc_entry entries[1];
47
+ } rbs_loc_children;
48
+
17
49
  typedef struct {
18
50
  VALUE buffer;
19
51
  rbs_loc_range rg;
@@ -25,6 +57,8 @@ typedef struct {
25
57
  * */
26
58
  VALUE rbs_new_location(VALUE buffer, rbs_range_t rg);
27
59
 
60
+ VALUE rbs_new_location2(VALUE buffer, int start_char, int end_char);
61
+
28
62
  /**
29
63
  * Return rbs_loc associated with the RBS::Location object.
30
64
  * */
@@ -37,6 +71,9 @@ rbs_loc *rbs_check_location(VALUE location);
37
71
  * */
38
72
  void rbs_loc_legacy_alloc_children(rbs_loc *loc, unsigned short cap);
39
73
 
74
+ void rbs_loc_legacy_add_optional_child(rbs_loc *loc, ID name, rbs_loc_range r);
75
+ void rbs_loc_legacy_add_required_child(rbs_loc *loc, ID name, rbs_loc_range r);
76
+
40
77
  /**
41
78
  * Define RBS::Location class.
42
79
  * */
@@ -16,7 +16,7 @@
16
16
  * ```
17
17
  * */
18
18
  static NORETURN(void) raise_error(rbs_error_t *error, VALUE buffer) {
19
- rbs_assert(error != NULL, "raise_error() called with NULL error");
19
+ RBS_ASSERT(error != NULL, "raise_error() called with NULL error");
20
20
 
21
21
  if (!error->syntax_error) {
22
22
  rb_raise(rb_eRuntimeError, "Unexpected error");
@@ -67,10 +67,12 @@ static void declare_type_variables(rbs_parser_t *parser, VALUE variables, VALUE
67
67
  }
68
68
 
69
69
  VALUE name_str = rb_sym2str(symbol);
70
+ uint8_t *copied_name = (uint8_t *) malloc((size_t) RSTRING_LEN(name_str));
71
+ memcpy((void *) copied_name, RSTRING_PTR(name_str), RSTRING_LEN(name_str));
70
72
 
71
- rbs_constant_id_t id = rbs_constant_pool_insert_shared(
73
+ rbs_constant_id_t id = rbs_constant_pool_insert_owned(
72
74
  &parser->constant_pool,
73
- (const uint8_t *) RSTRING_PTR(name_str),
75
+ copied_name,
74
76
  RSTRING_LEN(name_str)
75
77
  );
76
78
 
@@ -85,6 +87,23 @@ struct parse_type_arg {
85
87
  rb_encoding *encoding;
86
88
  rbs_parser_t *parser;
87
89
  VALUE require_eof;
90
+ VALUE void_allowed;
91
+ VALUE self_allowed;
92
+ VALUE classish_allowed;
93
+ };
94
+
95
+ struct parse_method_type_arg {
96
+ VALUE buffer;
97
+ rb_encoding *encoding;
98
+ rbs_parser_t *parser;
99
+ VALUE require_eof;
100
+ };
101
+
102
+ struct parse_signature_arg {
103
+ VALUE buffer;
104
+ rb_encoding *encoding;
105
+ rbs_parser_t *parser;
106
+ VALUE require_eof;
88
107
  };
89
108
 
90
109
  static VALUE ensure_free_parser(VALUE parser) {
@@ -100,8 +119,12 @@ static VALUE parse_type_try(VALUE a) {
100
119
  return Qnil;
101
120
  }
102
121
 
122
+ bool void_allowed = RTEST(arg->void_allowed);
123
+ bool self_allowed = RTEST(arg->self_allowed);
124
+ bool classish_allowed = RTEST(arg->classish_allowed);
125
+
103
126
  rbs_node_t *type;
104
- rbs_parse_type(parser, &type);
127
+ rbs_parse_type(parser, &type, void_allowed, self_allowed, classish_allowed);
105
128
 
106
129
  raise_error_if_any(parser, arg->buffer);
107
130
 
@@ -157,7 +180,7 @@ static rbs_parser_t *alloc_parser_from_buffer(VALUE buffer, int start_pos, int e
157
180
  );
158
181
  }
159
182
 
160
- static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof) {
183
+ static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VALUE end_pos, VALUE variables, VALUE require_eof, VALUE void_allowed, VALUE self_allowed, VALUE classish_allowed) {
161
184
  VALUE string = rb_funcall(buffer, rb_intern("content"), 0);
162
185
  StringValue(string);
163
186
  rb_encoding *encoding = rb_enc_get(string);
@@ -168,7 +191,10 @@ static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VAL
168
191
  .buffer = buffer,
169
192
  .encoding = encoding,
170
193
  .parser = parser,
171
- .require_eof = require_eof
194
+ .require_eof = require_eof,
195
+ .void_allowed = void_allowed,
196
+ .self_allowed = self_allowed,
197
+ .classish_allowed = classish_allowed
172
198
  };
173
199
 
174
200
  VALUE result = rb_ensure(parse_type_try, (VALUE) &arg, ensure_free_parser, (VALUE) parser);
@@ -179,7 +205,7 @@ static VALUE rbsparser_parse_type(VALUE self, VALUE buffer, VALUE start_pos, VAL
179
205
  }
180
206
 
181
207
  static VALUE parse_method_type_try(VALUE a) {
182
- struct parse_type_arg *arg = (struct parse_type_arg *) a;
208
+ struct parse_method_type_arg *arg = (struct parse_method_type_arg *) a;
183
209
  rbs_parser_t *parser = arg->parser;
184
210
 
185
211
  if (parser->next_token.type == pEOF) {
@@ -187,18 +213,10 @@ static VALUE parse_method_type_try(VALUE a) {
187
213
  }
188
214
 
189
215
  rbs_method_type_t *method_type = NULL;
190
- rbs_parse_method_type(parser, &method_type);
216
+ rbs_parse_method_type(parser, &method_type, RB_TEST(arg->require_eof), true);
191
217
 
192
218
  raise_error_if_any(parser, arg->buffer);
193
219
 
194
- if (RB_TEST(arg->require_eof)) {
195
- rbs_parser_advance(parser);
196
- if (parser->current_token.type != pEOF) {
197
- rbs_parser_set_error(parser, parser->current_token, true, "expected a token `%s`", rbs_token_type_str(pEOF));
198
- raise_error(parser->error, arg->buffer);
199
- }
200
- }
201
-
202
220
  rbs_translation_context_t ctx = rbs_translation_context_create(
203
221
  &parser->constant_pool,
204
222
  arg->buffer,
@@ -215,7 +233,7 @@ static VALUE rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_p
215
233
 
216
234
  rbs_parser_t *parser = alloc_parser_from_buffer(buffer, FIX2INT(start_pos), FIX2INT(end_pos));
217
235
  declare_type_variables(parser, variables, buffer);
218
- struct parse_type_arg arg = {
236
+ struct parse_method_type_arg arg = {
219
237
  .buffer = buffer,
220
238
  .encoding = encoding,
221
239
  .parser = parser,
@@ -230,7 +248,7 @@ static VALUE rbsparser_parse_method_type(VALUE self, VALUE buffer, VALUE start_p
230
248
  }
231
249
 
232
250
  static VALUE parse_signature_try(VALUE a) {
233
- struct parse_type_arg *arg = (struct parse_type_arg *) a;
251
+ struct parse_signature_arg *arg = (struct parse_signature_arg *) a;
234
252
  rbs_parser_t *parser = arg->parser;
235
253
 
236
254
  rbs_signature_t *signature = NULL;
@@ -253,7 +271,7 @@ static VALUE rbsparser_parse_signature(VALUE self, VALUE buffer, VALUE start_pos
253
271
  rb_encoding *encoding = rb_enc_get(string);
254
272
 
255
273
  rbs_parser_t *parser = alloc_parser_from_buffer(buffer, FIX2INT(start_pos), FIX2INT(end_pos));
256
- struct parse_type_arg arg = {
274
+ struct parse_signature_arg arg = {
257
275
  .buffer = buffer,
258
276
  .encoding = encoding,
259
277
  .parser = parser,
@@ -429,10 +447,14 @@ static VALUE rbsparser_lex(VALUE self, VALUE buffer, VALUE end_pos) {
429
447
  void rbs__init_parser(void) {
430
448
  RBS_Parser = rb_define_class_under(RBS, "Parser", rb_cObject);
431
449
  rb_gc_register_mark_object(RBS_Parser);
432
- VALUE empty_array = rb_obj_freeze(rb_ary_new());
433
- rb_gc_register_mark_object(empty_array);
434
450
 
435
- rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 5);
451
+ EMPTY_ARRAY = rb_obj_freeze(rb_ary_new());
452
+ rb_gc_register_mark_object(EMPTY_ARRAY);
453
+
454
+ EMPTY_HASH = rb_obj_freeze(rb_hash_new());
455
+ rb_gc_register_mark_object(EMPTY_HASH);
456
+
457
+ rb_define_singleton_method(RBS_Parser, "_parse_type", rbsparser_parse_type, 8);
436
458
  rb_define_singleton_method(RBS_Parser, "_parse_method_type", rbsparser_parse_method_type, 5);
437
459
  rb_define_singleton_method(RBS_Parser, "_parse_signature", rbsparser_parse_signature, 3);
438
460
  rb_define_singleton_method(RBS_Parser, "_parse_type_params", rbsparser_parse_type_params, 4);
@@ -442,7 +464,6 @@ void rbs__init_parser(void) {
442
464
  }
443
465
 
444
466
  static void Deinit_rbs_extension(ruby_vm_t *_) {
445
- rbs_constant_pool_free(RBS_GLOBAL_CONSTANT_POOL);
446
467
  }
447
468
 
448
469
  void Init_rbs_extension(void) {
@@ -453,17 +474,5 @@ void Init_rbs_extension(void) {
453
474
  rbs__init_location();
454
475
  rbs__init_parser();
455
476
 
456
- /* Calculated based on the number of unique strings used with the `INTERN` macro in `parser.c`.
457
- *
458
- * ```bash
459
- * grep -o 'INTERN("\([^"]*\)")' ext/rbs_extension/parser.c \
460
- * | sed 's/INTERN("\(.*\)")/\1/' \
461
- * | sort -u \
462
- * | wc -l
463
- * ```
464
- */
465
- const size_t num_uniquely_interned_strings = 26;
466
- rbs_constant_pool_init(RBS_GLOBAL_CONSTANT_POOL, num_uniquely_interned_strings);
467
-
468
477
  ruby_vm_at_exit(Deinit_rbs_extension);
469
478
  }