rbs 4.0.0.dev.4 → 4.1.0.pre.2

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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +1 -0
  3. data/.github/dependabot.yml +16 -14
  4. data/.github/workflows/bundle-update.yml +63 -0
  5. data/.github/workflows/c-check.yml +21 -11
  6. data/.github/workflows/comments.yml +5 -3
  7. data/.github/workflows/dependabot.yml +2 -2
  8. data/.github/workflows/jruby.yml +67 -0
  9. data/.github/workflows/milestone.yml +83 -0
  10. data/.github/workflows/ruby.yml +63 -24
  11. data/.github/workflows/rust.yml +184 -0
  12. data/.github/workflows/truffleruby.yml +54 -0
  13. data/.github/workflows/typecheck.yml +5 -2
  14. data/.github/workflows/wasm.yml +53 -0
  15. data/.github/workflows/windows.yml +8 -2
  16. data/.gitignore +11 -0
  17. data/.rubocop.yml +1 -1
  18. data/CHANGELOG.md +357 -0
  19. data/README.md +4 -4
  20. data/Rakefile +365 -33
  21. data/Steepfile +8 -0
  22. data/config.yml +450 -24
  23. data/core/array.rbs +443 -363
  24. data/core/basic_object.rbs +9 -8
  25. data/core/binding.rbs +0 -2
  26. data/core/builtin.rbs +9 -8
  27. data/core/class.rbs +11 -8
  28. data/core/comparable.rbs +55 -34
  29. data/core/complex.rbs +104 -78
  30. data/core/dir.rbs +61 -49
  31. data/core/encoding.rbs +12 -15
  32. data/core/enumerable.rbs +288 -196
  33. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  34. data/core/enumerator/product.rbs +5 -5
  35. data/core/enumerator.rbs +91 -28
  36. data/core/errno.rbs +11 -2
  37. data/core/errors.rbs +58 -29
  38. data/core/exception.rbs +13 -13
  39. data/core/fiber.rbs +74 -54
  40. data/core/file.rbs +260 -1151
  41. data/core/file_constants.rbs +463 -0
  42. data/core/file_stat.rbs +534 -0
  43. data/core/file_test.rbs +3 -3
  44. data/core/float.rbs +257 -92
  45. data/core/gc.rbs +425 -281
  46. data/core/hash.rbs +1151 -829
  47. data/core/integer.rbs +156 -195
  48. data/core/io/buffer.rbs +53 -42
  49. data/core/io/wait.rbs +13 -35
  50. data/core/io.rbs +216 -150
  51. data/core/kernel.rbs +239 -163
  52. data/core/marshal.rbs +4 -4
  53. data/core/match_data.rbs +15 -13
  54. data/core/math.rbs +107 -66
  55. data/core/method.rbs +69 -33
  56. data/core/module.rbs +302 -150
  57. data/core/nil_class.rbs +7 -6
  58. data/core/numeric.rbs +77 -63
  59. data/core/object.rbs +9 -11
  60. data/core/object_space/weak_key_map.rbs +7 -7
  61. data/core/object_space.rbs +30 -23
  62. data/core/pathname.rbs +1322 -0
  63. data/core/proc.rbs +95 -58
  64. data/core/process.rbs +222 -202
  65. data/core/ractor.rbs +371 -515
  66. data/core/random.rbs +21 -3
  67. data/core/range.rbs +181 -79
  68. data/core/rational.rbs +60 -89
  69. data/core/rbs/ops.rbs +154 -0
  70. data/core/rbs/unnamed/argf.rbs +63 -56
  71. data/core/rbs/unnamed/env_class.rbs +19 -14
  72. data/core/rbs/unnamed/main_class.rbs +123 -0
  73. data/core/rbs/unnamed/random.rbs +11 -118
  74. data/core/regexp.rbs +258 -214
  75. data/core/ruby.rbs +53 -0
  76. data/core/ruby_vm.rbs +78 -34
  77. data/core/rubygems/config_file.rbs +5 -5
  78. data/core/rubygems/errors.rbs +4 -71
  79. data/core/rubygems/requirement.rbs +5 -5
  80. data/core/rubygems/rubygems.rbs +16 -82
  81. data/core/rubygems/version.rbs +2 -3
  82. data/core/set.rbs +493 -363
  83. data/core/signal.rbs +26 -16
  84. data/core/string.rbs +3234 -1285
  85. data/core/struct.rbs +43 -42
  86. data/core/symbol.rbs +41 -34
  87. data/core/thread.rbs +141 -73
  88. data/core/time.rbs +81 -50
  89. data/core/trace_point.rbs +41 -35
  90. data/core/true_class.rbs +2 -2
  91. data/core/unbound_method.rbs +24 -16
  92. data/core/warning.rbs +7 -7
  93. data/docs/CONTRIBUTING.md +2 -1
  94. data/docs/aliases.md +79 -0
  95. data/docs/collection.md +3 -3
  96. data/docs/config.md +171 -0
  97. data/docs/encoding.md +56 -0
  98. data/docs/gem.md +0 -1
  99. data/docs/inline.md +634 -0
  100. data/docs/rbs_by_example.md +20 -20
  101. data/docs/rust.md +96 -0
  102. data/docs/sigs.md +3 -3
  103. data/docs/syntax.md +48 -18
  104. data/docs/type_fingerprint.md +21 -0
  105. data/docs/wasm_serialization.md +80 -0
  106. data/exe/rbs +1 -1
  107. data/ext/rbs_extension/ast_translation.c +1441 -671
  108. data/ext/rbs_extension/ast_translation.h +7 -0
  109. data/ext/rbs_extension/class_constants.c +18 -2
  110. data/ext/rbs_extension/class_constants.h +9 -0
  111. data/ext/rbs_extension/extconf.rb +6 -1
  112. data/ext/rbs_extension/legacy_location.c +33 -56
  113. data/ext/rbs_extension/legacy_location.h +37 -0
  114. data/ext/rbs_extension/main.c +183 -39
  115. data/include/rbs/ast.h +597 -297
  116. data/include/rbs/defines.h +40 -0
  117. data/include/rbs/lexer.h +31 -11
  118. data/include/rbs/location.h +25 -44
  119. data/include/rbs/parser.h +6 -6
  120. data/include/rbs/serialize.h +39 -0
  121. data/include/rbs/string.h +0 -2
  122. data/include/rbs/util/rbs_allocator.h +34 -13
  123. data/include/rbs/util/rbs_assert.h +12 -1
  124. data/include/rbs/util/rbs_constant_pool.h +0 -3
  125. data/include/rbs/util/rbs_encoding.h +2 -0
  126. data/include/rbs/util/rbs_unescape.h +2 -1
  127. data/include/rbs.h +8 -0
  128. data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
  129. data/lib/rbs/ast/annotation.rb +1 -1
  130. data/lib/rbs/ast/comment.rb +1 -1
  131. data/lib/rbs/ast/declarations.rb +10 -10
  132. data/lib/rbs/ast/members.rb +14 -14
  133. data/lib/rbs/ast/ruby/annotations.rb +335 -3
  134. data/lib/rbs/ast/ruby/comment_block.rb +30 -4
  135. data/lib/rbs/ast/ruby/declarations.rb +209 -4
  136. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  137. data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
  138. data/lib/rbs/ast/ruby/members.rb +571 -22
  139. data/lib/rbs/ast/type_param.rb +24 -4
  140. data/lib/rbs/buffer.rb +66 -24
  141. data/lib/rbs/cli/diff.rb +16 -15
  142. data/lib/rbs/cli/validate.rb +38 -106
  143. data/lib/rbs/cli.rb +55 -24
  144. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  145. data/lib/rbs/collection/sources/git.rb +7 -0
  146. data/lib/rbs/definition.rb +1 -1
  147. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  148. data/lib/rbs/definition_builder/method_builder.rb +32 -6
  149. data/lib/rbs/definition_builder.rb +147 -25
  150. data/lib/rbs/diff.rb +7 -1
  151. data/lib/rbs/environment.rb +235 -75
  152. data/lib/rbs/environment_loader.rb +0 -6
  153. data/lib/rbs/errors.rb +27 -18
  154. data/lib/rbs/inline_parser.rb +377 -15
  155. data/lib/rbs/location_aux.rb +1 -1
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +47 -11
  159. data/lib/rbs/parser_aux.rb +20 -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 -0
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  166. data/lib/rbs/rewriter.rb +70 -0
  167. data/lib/rbs/subtractor.rb +3 -1
  168. data/lib/rbs/test/type_check.rb +25 -3
  169. data/lib/rbs/type_name.rb +34 -14
  170. data/lib/rbs/types.rb +88 -78
  171. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  172. data/lib/rbs/validator.rb +2 -2
  173. data/lib/rbs/version.rb +1 -1
  174. data/lib/rbs/wasm/deserializer.rb +213 -0
  175. data/lib/rbs/wasm/location.rb +61 -0
  176. data/lib/rbs/wasm/parser.rb +137 -0
  177. data/lib/rbs/wasm/runtime.rb +217 -0
  178. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  179. data/lib/rbs.rb +13 -2
  180. data/lib/rdoc/discover.rb +1 -1
  181. data/lib/rdoc_plugin/parser.rb +1 -1
  182. data/rbs.gemspec +24 -6
  183. data/schema/typeParam.json +17 -1
  184. data/sig/annotate/rdoc_annotater.rbs +12 -9
  185. data/sig/ast/ruby/annotations.rbs +364 -4
  186. data/sig/ast/ruby/comment_block.rbs +8 -0
  187. data/sig/ast/ruby/declarations.rbs +102 -4
  188. data/sig/ast/ruby/members.rbs +128 -2
  189. data/sig/buffer.rbs +19 -1
  190. data/sig/cli/diff.rbs +5 -11
  191. data/sig/cli/validate.rbs +12 -8
  192. data/sig/cli.rbs +18 -18
  193. data/sig/collection/config/lockfile_generator.rbs +2 -0
  194. data/sig/definition.rbs +6 -1
  195. data/sig/definition_builder.rbs +2 -0
  196. data/sig/environment.rbs +70 -12
  197. data/sig/errors.rbs +13 -14
  198. data/sig/inline_parser.rbs +41 -2
  199. data/sig/locator.rbs +0 -2
  200. data/sig/manifest.yaml +0 -2
  201. data/sig/method_builder.rbs +3 -1
  202. data/sig/namespace.rbs +20 -0
  203. data/sig/parser.rbs +41 -13
  204. data/sig/prototype/helpers.rbs +2 -0
  205. data/sig/resolver/type_name_resolver.rbs +36 -10
  206. data/sig/rewriter.rbs +45 -0
  207. data/sig/source.rbs +3 -3
  208. data/sig/type_param.rbs +13 -8
  209. data/sig/typename.rbs +15 -0
  210. data/sig/types.rbs +6 -7
  211. data/sig/unit_test/spy.rbs +0 -8
  212. data/sig/unit_test/type_assertions.rbs +15 -0
  213. data/sig/wasm/deserializer.rbs +66 -0
  214. data/sig/wasm/serialization_schema.rbs +13 -0
  215. data/src/ast.c +443 -162
  216. data/src/lexer.c +1415 -1313
  217. data/src/lexer.re +4 -0
  218. data/src/lexstate.c +63 -37
  219. data/src/location.c +7 -47
  220. data/src/parser.c +1032 -521
  221. data/src/serialize.c +958 -0
  222. data/src/string.c +0 -48
  223. data/src/util/rbs_allocator.c +89 -74
  224. data/src/util/rbs_assert.c +1 -1
  225. data/src/util/rbs_buffer.c +2 -2
  226. data/src/util/rbs_constant_pool.c +10 -14
  227. data/src/util/rbs_encoding.c +4 -8
  228. data/src/util/rbs_unescape.c +56 -20
  229. data/stdlib/abbrev/0/array.rbs +1 -1
  230. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  231. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  232. data/stdlib/cgi/0/core.rbs +9 -393
  233. data/stdlib/cgi/0/manifest.yaml +1 -0
  234. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  235. data/stdlib/coverage/0/coverage.rbs +7 -4
  236. data/stdlib/csv/0/csv.rbs +5 -5
  237. data/stdlib/date/0/date.rbs +92 -79
  238. data/stdlib/date/0/date_time.rbs +25 -24
  239. data/stdlib/delegate/0/delegator.rbs +10 -7
  240. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  241. data/stdlib/digest/0/digest.rbs +111 -1
  242. data/stdlib/erb/0/erb.rbs +748 -347
  243. data/stdlib/etc/0/etc.rbs +73 -54
  244. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  245. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  246. data/stdlib/io-console/0/io-console.rbs +2 -2
  247. data/stdlib/json/0/json.rbs +223 -142
  248. data/stdlib/monitor/0/monitor.rbs +3 -3
  249. data/stdlib/net-http/0/net-http.rbs +162 -134
  250. data/stdlib/objspace/0/objspace.rbs +17 -34
  251. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  252. data/stdlib/open3/0/open3.rbs +469 -10
  253. data/stdlib/openssl/0/openssl.rbs +482 -364
  254. data/stdlib/optparse/0/optparse.rbs +26 -17
  255. data/stdlib/pathname/0/pathname.rbs +11 -1381
  256. data/stdlib/pp/0/pp.rbs +9 -8
  257. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  258. data/stdlib/pstore/0/pstore.rbs +35 -30
  259. data/stdlib/psych/0/psych.rbs +65 -12
  260. data/stdlib/psych/0/store.rbs +2 -4
  261. data/stdlib/pty/0/pty.rbs +9 -6
  262. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  263. data/stdlib/rdoc/0/code_object.rbs +2 -1
  264. data/stdlib/rdoc/0/parser.rbs +1 -1
  265. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  266. data/stdlib/rdoc/0/store.rbs +1 -1
  267. data/stdlib/resolv/0/resolv.rbs +26 -69
  268. data/stdlib/ripper/0/ripper.rbs +22 -19
  269. data/stdlib/securerandom/0/manifest.yaml +2 -0
  270. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  271. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  272. data/stdlib/singleton/0/singleton.rbs +3 -0
  273. data/stdlib/socket/0/addrinfo.rbs +7 -7
  274. data/stdlib/socket/0/basic_socket.rbs +3 -3
  275. data/stdlib/socket/0/ip_socket.rbs +10 -8
  276. data/stdlib/socket/0/socket.rbs +23 -10
  277. data/stdlib/socket/0/tcp_server.rbs +1 -1
  278. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  279. data/stdlib/socket/0/udp_socket.rbs +1 -1
  280. data/stdlib/socket/0/unix_server.rbs +1 -1
  281. data/stdlib/stringio/0/stringio.rbs +1209 -95
  282. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  283. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  284. data/stdlib/time/0/time.rbs +8 -6
  285. data/stdlib/timeout/0/timeout.rbs +63 -7
  286. data/stdlib/tsort/0/cyclic.rbs +4 -1
  287. data/stdlib/tsort/0/interfaces.rbs +8 -8
  288. data/stdlib/tsort/0/tsort.rbs +16 -15
  289. data/stdlib/uri/0/common.rbs +42 -20
  290. data/stdlib/uri/0/file.rbs +3 -3
  291. data/stdlib/uri/0/generic.rbs +26 -18
  292. data/stdlib/uri/0/http.rbs +2 -2
  293. data/stdlib/uri/0/ldap.rbs +2 -2
  294. data/stdlib/uri/0/mailto.rbs +3 -3
  295. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  296. data/stdlib/zlib/0/deflate.rbs +4 -3
  297. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  298. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  299. data/stdlib/zlib/0/inflate.rbs +1 -1
  300. data/stdlib/zlib/0/need_dict.rbs +1 -1
  301. data/stdlib/zlib/0/zstream.rbs +1 -0
  302. data/wasm/README.md +59 -0
  303. data/wasm/rbs_wasm.c +411 -0
  304. metadata +56 -8
  305. data/.vscode/extensions.json +0 -5
  306. data/.vscode/settings.json +0 -19
@@ -9,6 +9,8 @@ module RBS
9
9
  attr_reader diagnostics: Array[Diagnostic::t]
10
10
 
11
11
  def initialize: (Buffer, Prism::ParseResult) -> void
12
+
13
+ def type_fingerprint: () -> untyped
12
14
  end
13
15
 
14
16
  module Diagnostic
@@ -29,19 +31,44 @@ module RBS
29
31
  class NonConstantModuleName < Base
30
32
  end
31
33
 
34
+ class NonConstantSuperClassName < Base
35
+ end
36
+
32
37
  class TopLevelMethodDefinition < Base
33
38
  end
34
39
 
40
+ class TopLevelAttributeDefinition < Base
41
+ end
42
+
35
43
  class UnusedInlineAnnotation < Base
36
44
  end
37
45
 
38
46
  class AnnotationSyntaxError < Base
39
47
  end
40
48
 
49
+ class MixinMultipleArguments < Base
50
+ end
51
+
52
+ class MixinNonConstantModule < Base
53
+ end
54
+
55
+ class AttributeNonSymbolName < Base
56
+ end
57
+
58
+ class NonConstantConstantDeclaration < Base
59
+ end
60
+
61
+ class ClassModuleAliasDeclarationMissingTypeName < Base
62
+ end
63
+
41
64
  type t = NotImplementedYet
42
- | NonConstantClassName | NonConstantModuleName
43
- | TopLevelMethodDefinition
65
+ | NonConstantClassName | NonConstantModuleName | NonConstantSuperClassName
66
+ | TopLevelMethodDefinition | TopLevelAttributeDefinition
44
67
  | UnusedInlineAnnotation | AnnotationSyntaxError
68
+ | MixinMultipleArguments | MixinNonConstantModule
69
+ | AttributeNonSymbolName
70
+ | NonConstantConstantDeclaration
71
+ | ClassModuleAliasDeclarationMissingTypeName
45
72
  end
46
73
 
47
74
  def self.parse: (Buffer, Prism::ParseResult) -> Result
@@ -82,6 +109,18 @@ module RBS
82
109
  def report_unused_annotation: (*AST::Ruby::Annotations::t | nil | AST::Ruby::CommentBlock::AnnotationSyntaxError) -> void
83
110
 
84
111
  def report_unused_block: (AST::Ruby::CommentBlock) -> void
112
+
113
+ def visit_class_or_module_body: (module_context, Prism::ClassNode | Prism::ModuleNode) -> void
114
+
115
+ private
116
+
117
+ def parse_mixin_call: (Prism::CallNode) -> void
118
+
119
+ def parse_attribute_call: (Prism::CallNode) -> void
120
+
121
+ def parse_constant_declaration: (Prism::ConstantWriteNode | Prism::ConstantPathWriteNode) -> void
122
+
123
+ def parse_super_class: (Prism::node, Prism::Location) -> Declarations::ClassDecl::SuperClass?
85
124
  end
86
125
  end
87
126
  end
data/sig/locator.rbs CHANGED
@@ -37,8 +37,6 @@ module RBS
37
37
  #
38
38
  def find2: (line: Integer, column: Integer) -> [Symbol?, Array[component]]?
39
39
 
40
- private
41
-
42
40
  def find_in_directive: (Integer pos, AST::Directives::t, Array[component]) -> bool
43
41
 
44
42
  def find_in_decl: (Integer pos, decl: AST::Declarations::t, array: Array[component]) -> bool
data/sig/manifest.yaml CHANGED
@@ -1,6 +1,4 @@
1
1
  dependencies:
2
- - name: logger
3
- - name: pathname
4
2
  - name: json
5
3
  - name: optparse
6
4
  - name: tsort
@@ -16,7 +16,7 @@ module RBS
16
16
  #
17
17
  class Definition
18
18
  type original = AST::Members::MethodDefinition | AST::Members::Alias | AST::Members::AttrAccessor | AST::Members::AttrWriter | AST::Members::AttrReader
19
- | AST::Ruby::Members::DefMember
19
+ | AST::Ruby::Members::DefMember | AST::Ruby::Members::AttrReaderMember | AST::Ruby::Members::AttrWriterMember | AST::Ruby::Members::AttrAccessorMember
20
20
 
21
21
  type overloading_definition = AST::Members::MethodDefinition | AST::Ruby::Members::DefMember
22
22
 
@@ -77,6 +77,8 @@ module RBS
77
77
 
78
78
  def build_attribute: (Methods, Methods::instance_type, member: AST::Members::AttrAccessor | AST::Members::AttrReader | AST::Members::AttrWriter, accessibility: Definition::accessibility) -> void
79
79
 
80
+ def build_ruby_attribute: (Methods, Methods::instance_type, member: AST::Ruby::Members::AttrReaderMember | AST::Ruby::Members::AttrWriterMember | AST::Ruby::Members::AttrAccessorMember, accessibility: Definition::accessibility) -> void
81
+
80
82
  def build_method: (Methods, Methods::instance_type, member: AST::Members::MethodDefinition | AST::Ruby::Members::DefMember, accessibility: Definition::accessibility) -> void
81
83
 
82
84
  def each_rbs_member_with_accessibility: (Array[AST::Members::t | AST::Declarations::t], ?accessibility: Definition::accessibility) { (AST::Members::t | AST::Declarations::t, Definition::accessibility) -> void } -> void
data/sig/namespace.rbs CHANGED
@@ -40,10 +40,30 @@ module RBS
40
40
 
41
41
  @parent: Namespace?
42
42
 
43
+ @hash: Integer?
44
+
43
45
  self.@root: Namespace?
44
46
 
45
47
  self.@empty: Namespace?
46
48
 
49
+ self.@intern_mutex: Mutex
50
+
51
+ # Per-`absolute` flag tries of nested Hashes keyed on path Symbols,
52
+ # with the cached Namespace stored under the `INTERN_LEAF` sentinel
53
+ # at each path's terminal node.
54
+ self.@intern_trie_absolute: Hash[Symbol | Module, untyped]
55
+
56
+ self.@intern_trie_relative: Hash[Symbol | Module, untyped]
57
+
58
+ INTERN_LEAF: Module
59
+
60
+ # Returns an interned `Namespace` instance.
61
+ #
62
+ # Subsequent calls with structurally equal `path` and `absolute` arguments
63
+ # return the same object. The internal `path` array is duplicated and
64
+ # frozen before being cached.
65
+ def self.[]: (Array[Symbol] path, boolish absolute) -> Namespace
66
+
47
67
  # Returns new _empty_ namespace.
48
68
  def self.empty: () -> Namespace
49
69
 
data/sig/parser.rbs CHANGED
@@ -20,13 +20,13 @@ module RBS
20
20
 
21
21
  # Parse a method type and return it
22
22
  #
23
- # When `range` keyword is specified, it starts parsing from the `begin` to the `end` of the range.
23
+ # When `byte_range` keyword is specified, it starts parsing from the `begin` to the `end` of the range.
24
24
  #
25
25
  # ```ruby
26
- # RBS::Parser.parse_method_type("() -> void") # => `() -> void`
27
- # RBS::Parser.parse_method_type("() -> void", range: 0...) # => `() -> void`
28
- # RBS::Parser.parse_method_type("() -> void () -> String", range: 11...) # => `() -> String`
29
- # RBS::Parser.parse_method_type("() -> void () -> String", range: 23...) # => nil
26
+ # RBS::Parser.parse_method_type("() -> void") # => `() -> void`
27
+ # RBS::Parser.parse_method_type("() -> void", byte_range: 0...) # => `() -> void`
28
+ # RBS::Parser.parse_method_type("() -> void () -> String", byte_range: 11...) # => `() -> String`
29
+ # RBS::Parser.parse_method_type("() -> void () -> String", byte_range: 23...) # => nil
30
30
  # ```
31
31
  #
32
32
  # When `require_eof` is `true`, an error is raised if more tokens are left in the input.
@@ -39,17 +39,18 @@ module RBS
39
39
  # RBS::Parser.parse_method_type("", require_eof: true) # => nil
40
40
  # ```
41
41
  #
42
- def self.parse_method_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> MethodType?
42
+ def self.parse_method_type: (Buffer | String, ?byte_range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> MethodType?
43
+ | %a{deprecated: Use `byte_range:` keyword instead of `range:`} (Buffer | String, range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> MethodType?
43
44
 
44
45
  # Parse a type and return it
45
46
  #
46
- # When `range` keyword is specified, it starts parsing from the `begin` to the `end` of the range.
47
+ # When `byte_range` keyword is specified, it starts parsing from the `begin` to the `end` of the range.
47
48
  #
48
49
  # ```ruby
49
- # RBS::Parser.parse_type("String") # => `String`
50
- # RBS::Parser.parse_type("String", range: 0...) # => `String`
51
- # RBS::Parser.parse_type("String Integer", pos: 7...) # => `Integer`
52
- # RBS::Parser.parse_type("String Integer", pos: 14...) # => nil
50
+ # RBS::Parser.parse_type("String") # => `String`
51
+ # RBS::Parser.parse_type("String", byte_range: 0...) # => `String`
52
+ # RBS::Parser.parse_type("String Integer", byte_range: 7...) # => `Integer`
53
+ # RBS::Parser.parse_type("String Integer", byte_range: 14...) # => nil
53
54
  # ```
54
55
  #
55
56
  # When `require_eof` is `true`, an error is raised if more tokens are left in the input.
@@ -62,7 +63,22 @@ module RBS
62
63
  # RBS::Parser.parse_type("", require_eof: true) # => nil
63
64
  # ```
64
65
  #
65
- def self.parse_type: (Buffer | String, ?range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool) -> Types::t?
66
+ # The `void_allowed` keyword controls whether `void` is allowed as a type.
67
+ #
68
+ # ```ruby
69
+ # RBS::Parser.parse_type("void", void_allowed: true) # => `void`
70
+ # RBS::Parser.parse_type("void", void_allowed: false) # => Raises an syntax error
71
+ # ```
72
+ #
73
+ # The `self_allowed` keyword controls whether `self` is allowed as a type.
74
+ #
75
+ # ```ruby
76
+ # RBS::Parser.parse_type("self", self_allowed: true) # => `self`
77
+ # RBS::Parser.parse_type("self", self_allowed: false) # => Raises an syntax error
78
+ # ```
79
+ #
80
+ def self.parse_type: (Buffer | String, ?byte_range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool, ?void_allowed: bool, ?self_allowed: bool, ?classish_allowed: bool) -> Types::t?
81
+ | %a{deprecated: Use `byte_range:` keyword instead of `range:`} (Buffer | String, range: Range[Integer?], ?variables: Array[Symbol], ?require_eof: bool, ?void_allowed: bool, ?self_allowed: bool, ?classish_allowed: bool) -> Types::t?
66
82
 
67
83
  # Parse whole RBS file and return an array of declarations
68
84
  #
@@ -116,12 +132,24 @@ module RBS
116
132
 
117
133
  def self.buffer: (String | Buffer source) -> Buffer
118
134
 
119
- def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> Types::t?
135
+ def self.byte_range: (Range[Integer?] char_range, String content) -> Range[Integer?]
136
+
137
+ def self._parse_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof, bool void_allowed, bool self_allowed, bool classish_allowed) -> Types::t?
120
138
 
121
139
  def self._parse_method_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> MethodType?
122
140
 
123
141
  def self._parse_signature: (Buffer, Integer start_pos, Integer end_pos) -> [Array[AST::Directives::t], Array[AST::Declarations::t]]
124
142
 
143
+ # Parse and serialize the result to the binary format consumed by
144
+ # RBS::WASM::Deserializer (see ext/rbs_extension/main.c and
145
+ # docs/wasm_serialization.md). The `_to_bytes` variants exist so the
146
+ # round-trip can be exercised on CRuby.
147
+ def self._parse_type_to_bytes: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof, bool void_allowed, bool self_allowed, bool classish_allowed) -> String?
148
+
149
+ def self._parse_method_type_to_bytes: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> String?
150
+
151
+ def self._parse_signature_to_bytes: (Buffer, Integer start_pos, Integer end_pos) -> String
152
+
125
153
  def self._parse_type_params: (Buffer, Integer start_pos, Integer end_pos, bool module_type_params) -> Array[AST::TypeParam]
126
154
 
127
155
  def self._lex: (Buffer, Integer end_pos) -> Array[[Symbol, Location[untyped, untyped]]]
@@ -3,6 +3,8 @@ module RBS
3
3
  module Helpers
4
4
  type node = RubyVM::AbstractSyntaxTree::Node
5
5
 
6
+ def parse_comments: (String, include_trailing: bool) -> Hash[Integer, AST::Comment]
7
+
6
8
  def block_from_body: (node) -> Types::Block?
7
9
 
8
10
  def each_node: (Array[untyped] nodes) { (node) -> void } -> void
@@ -6,30 +6,56 @@ module RBS
6
6
  # It just ignores included modules and super classes.
7
7
  #
8
8
  class TypeNameResolver
9
- type query = [TypeName, context]
9
+ def initialize: (Set[TypeName] all_names, Hash[TypeName, [TypeName, context]] aliases) -> void
10
10
 
11
- def initialize: (Environment) -> void
11
+ def self.build: (Environment) -> instance
12
12
 
13
- # Translates given type name to absolute type name.
13
+ # Translates given type name to absolute type name
14
+ #
14
15
  # Returns `nil` if cannot find associated type name.
16
+ # Module names in the type name are normalized.
15
17
  #
16
18
  def resolve: (TypeName, context: context) -> TypeName?
17
19
 
18
- private
20
+ # Translates given type name to absolute type name
21
+ #
22
+ # Returns `false` if a cycle is detected while resolving aliases.
23
+ # Returns `nil` if the type name cannot be resolved.
24
+ #
25
+ def resolve_namespace: (TypeName, context: context) -> (TypeName | false | nil)
19
26
 
20
- attr_reader env: Environment
27
+ private
21
28
 
22
29
  attr_reader all_names: Set[TypeName]
23
30
 
24
- attr_reader cache: Hash[query, TypeName?]
31
+ attr_reader aliases: Hash[TypeName, [TypeName, context]]
32
+
33
+ attr_reader cache: Hash[context, Hash[TypeName, TypeName?]]
25
34
 
26
- def has_name?: (TypeName) -> TypeName?
35
+ # Returns the type name if it exists in `all_names` (normalized)
36
+ #
37
+ def has_type_name?: (TypeName) -> TypeName?
27
38
 
28
- def try_cache: (query) { () -> TypeName? } -> TypeName?
39
+ # Returns the type name if it is an alias (not normalized)
40
+ #
41
+ def aliased_name?: (TypeName) -> TypeName?
42
+
43
+ def try_cache: (TypeName, context) { () -> TypeName? } -> TypeName?
44
+
45
+ # Translates the head module name in the context and returns an absolute type name
46
+ #
47
+ # Returns `nil` if cannot find associated type name.
48
+ # The returned namespace may be an alias
49
+ #
50
+ def resolve_head_namespace: (Symbol, context) -> TypeName?
51
+
52
+ # Resolves the type name in the given context
53
+ #
54
+ def resolve_type_name: (Symbol, context) -> TypeName?
29
55
 
30
- def resolve_in: (Symbol, context) -> TypeName?
56
+ def resolve_namespace0: (TypeName, context, Set[TypeName]) -> (TypeName | false | nil)
31
57
 
32
- def partition: (TypeName) -> [Symbol, TypeName?]
58
+ def normalize_namespace: (TypeName, TypeName rhs, context, Set[TypeName]) -> (TypeName | false | nil)
33
59
  end
34
60
  end
35
61
  end
data/sig/rewriter.rbs ADDED
@@ -0,0 +1,45 @@
1
+ module RBS
2
+ # Rewriter performs targeted character-range replacements on Buffer content.
3
+ #
4
+ # Unlike Writer which regenerates entire source from AST, Rewriter preserves
5
+ # everything outside the rewritten ranges, including non-documentation comments.
6
+ #
7
+ # Rewrite requests are buffered and applied all at once when `#string` is called.
8
+ #
9
+ class Rewriter
10
+ attr_reader buffer: Buffer
11
+
12
+ # Initialize with a toplevel buffer.
13
+ # Raises if the buffer has a parent (non-toplevel).
14
+ #
15
+ def initialize: (Buffer buffer) -> void
16
+
17
+ # Register a rewrite request for the given location.
18
+ #
19
+ def rewrite: (Location[untyped, untyped] location, String string) -> self
20
+
21
+ # Add a new comment before the earliest of the given locations.
22
+ #
23
+ def add_comment: (*Location[untyped, untyped] locations, content: String) -> self
24
+
25
+ # Replace an existing comment's content.
26
+ #
27
+ def replace_comment: (AST::Comment comment, content: String) -> self
28
+
29
+ # Delete an existing comment.
30
+ #
31
+ def delete_comment: (AST::Comment comment) -> self
32
+
33
+ # Apply all buffered rewrites and return the resulting string.
34
+ #
35
+ # Raises if any rewrite ranges overlap.
36
+ #
37
+ def string: () -> String
38
+
39
+ private
40
+
41
+ def format_comment: (String content, String indent) -> String
42
+
43
+ @rewrites: Array[[Location[untyped, untyped], String]]
44
+ end
45
+ end
data/sig/source.rbs CHANGED
@@ -1,7 +1,7 @@
1
1
  module RBS
2
2
  module Source
3
3
  type t = RBS | Ruby
4
-
4
+
5
5
  class RBS
6
6
  attr_reader buffer: Buffer
7
7
 
@@ -28,9 +28,9 @@ module RBS
28
28
 
29
29
  attr_reader declarations: Array[AST::Ruby::Declarations::t]
30
30
 
31
- attr_reader diagnostics: Array[untyped]
31
+ attr_reader diagnostics: Array[InlineParser::Diagnostic::t]
32
32
 
33
- def initialize: (Buffer, Prism::ParseResult, Array[AST::Ruby::Declarations::t], Array[untyped]) -> void
33
+ def initialize: (Buffer, Prism::ParseResult, Array[AST::Ruby::Declarations::t], Array[InlineParser::Diagnostic::t]) -> void
34
34
 
35
35
  def each_type_name: () { (TypeName) -> void } -> void
36
36
  | () -> Enumerator[TypeName]
data/sig/type_param.rbs CHANGED
@@ -4,13 +4,14 @@ module RBS
4
4
  # Key
5
5
  # ^^^ name
6
6
  #
7
- # unchecked out Elem < _ToJson = untyped
8
- # ^^^^^^^^^ unchecked
9
- # ^^^ variance
10
- # ^^^^ name
11
- # ^^^^^^^^^ upper_bound
12
- # ^^^^^^^^^ default
13
- type loc = Location[:name, :variance | :unchecked | :upper_bound | :default]
7
+ # unchecked out Elem < _ToJson > bot = untyped
8
+ # ^^^^^^^^^ unchecked
9
+ # ^^^ variance
10
+ # ^^^^ name
11
+ # ^^^^^^^^^ upper_bound
12
+ # ^^^^^ lower_bound
13
+ # ^^^^^^^^ default
14
+ type loc = Location[:name, :variance | :unchecked | :upper_bound | :lower_bound | :default]
14
15
 
15
16
  type variance = :invariant | :covariant | :contravariant
16
17
 
@@ -24,9 +25,13 @@ module RBS
24
25
 
25
26
  attr_reader upper_bound_type: Types::t?
26
27
 
28
+ %a{pure} def lower_bound: () -> bound?
29
+
30
+ attr_reader lower_bound_type: Types::t?
31
+
27
32
  attr_reader default_type: Types::t?
28
33
 
29
- def initialize: (name: Symbol, variance: variance, upper_bound: Types::t?, location: loc?, ?default_type: Types::t?, ?unchecked: bool) -> void
34
+ def initialize: (name: Symbol, variance: variance, upper_bound: Types::t?, lower_bound: Types::t?, location: loc?, ?default_type: Types::t?, ?unchecked: bool) -> void
30
35
 
31
36
  include _ToJson
32
37
 
data/sig/typename.rbs CHANGED
@@ -28,6 +28,21 @@ module RBS
28
28
  #
29
29
  def initialize: (namespace: Namespace, name: Symbol) -> void
30
30
 
31
+ @hash: Integer?
32
+
33
+ self.@intern_mutex: Mutex
34
+
35
+ # Two-level Hash keyed by canonical Namespace identity (outer uses
36
+ # `compare_by_identity`) and name Symbol.
37
+ self.@intern_cache: Hash[Namespace, Hash[Symbol, TypeName]]
38
+
39
+ # Returns an interned `TypeName` instance.
40
+ #
41
+ # The given `namespace` is canonicalized so cached instances always hold an
42
+ # interned namespace. Subsequent calls with structurally equal arguments
43
+ # return the same object.
44
+ def self.[]: (Namespace namespace, Symbol name) -> TypeName
45
+
31
46
  def ==: (untyped other) -> bool
32
47
 
33
48
  def hash: () -> Integer
data/sig/types.rbs CHANGED
@@ -172,24 +172,23 @@ module RBS
172
172
  class ClassSingleton
173
173
  # singleton(::Foo)
174
174
  # ^^^^^ => name
175
- type loc = Location[:name, bot]
176
-
177
- def initialize: (name: TypeName, location: loc?) -> void
175
+ type loc = Location[:name, :args]
178
176
 
179
- attr_reader name: TypeName
177
+ def initialize: (name: TypeName, location: loc?, ?args: Array[t]) -> void
180
178
 
181
179
  attr_reader location: loc?
182
180
 
183
181
  include _TypeBase
184
- include NoFreeVariables
185
- include NoSubst
186
- include EmptyEachType
182
+ include Application
187
183
 
188
184
  def ==: (untyped other) -> bool
189
185
 
190
186
  alias eql? ==
191
187
 
192
188
  def hash: () -> Integer
189
+
190
+ def map_type: () { (t) -> t } -> ClassSingleton
191
+ | () -> Enumerator[t, ClassSingleton]
193
192
  end
194
193
 
195
194
  module Application
@@ -20,11 +20,3 @@ module RBS
20
20
  end
21
21
  end
22
22
  end
23
-
24
- class Proc
25
- def ruby2_keywords: () -> self
26
- end
27
-
28
- class Module
29
- def ruby2_keywords: (*Symbol) -> void
30
- end
@@ -153,6 +153,17 @@ module RBS
153
153
  #
154
154
  def refute_send_type: (String | MethodType method_type, untyped receiver, Symbol method_name, *untyped args) ?{ () -> untyped } -> void
155
155
 
156
+ # Calls a method `method_name`, validates if it's compatible with RBS type definition, and ensures it raises the `exception` class.
157
+ #
158
+ # 1. It calls `method_name` with `receiver` passing `args` and given block,
159
+ # 2. Validates if it's compatible with given `method_type`, and
160
+ # 3. Validates if it's compatible with one of the overloads defined in RBS type definition
161
+ # 4. Ensures that `exception` is thrown
162
+ #
163
+ # See `assert_send_type` for the details.
164
+ #
165
+ def assert_send_type_error: (String | MethodType method_type, Class exception, untyped receiver, Symbol method_name, *untyped args) ?{ () -> untyped } -> void
166
+
156
167
  # Asserts if the constant `constant_name` has `constant_type`, and the RBS definition has compatible type
157
168
  #
158
169
  # ```ruby
@@ -168,6 +179,10 @@ module RBS
168
179
  #
169
180
  def assert_type: (String | Types::t value_type, untyped value) -> void
170
181
 
182
+ # Asserts if RBS definition declares given `method_name` with `visibility`
183
+ #
184
+ def assert_visibility: (:private | :public visibility, Symbol method_name) -> void
185
+
171
186
  # Allow non _simple-type_ method types given to `assert_send_type` and `refute_send_type`
172
187
  #
173
188
  # ```ruby
@@ -0,0 +1,66 @@
1
+ module RBS
2
+ module WASM
3
+ # Rebuilds RBS::AST objects from the binary buffer produced by
4
+ # `rbs_serialize_node` (src/serialize.c), driven by SerializationSchema.
5
+ class Deserializer
6
+ @bytes: String
7
+
8
+ @buffer: Buffer
9
+
10
+ @encoding: Encoding
11
+
12
+ @pos: Integer
13
+
14
+ @class_cache: Hash[String, untyped]
15
+
16
+ # Deserialize a buffer produced for a whole signature, returning
17
+ # `[directives, declarations]` to match RBS::Parser._parse_signature.
18
+ def self.deserialize: (String bytes, Buffer buffer) -> untyped
19
+
20
+ # Deserialize a bare node list (RBS::Parser._parse_type_params).
21
+ def self.deserialize_node_list: (String bytes, Buffer buffer) -> Array[untyped]
22
+
23
+ # Deserialize the token stream from rbs_wasm_lex (RBS::Parser._lex).
24
+ def self.deserialize_tokens: (String bytes, Buffer buffer) -> Array[[ Symbol, Location ]]
25
+
26
+ def initialize: (String bytes, Buffer buffer) -> void
27
+
28
+ # Reads the next node and returns the reconstructed Ruby value.
29
+ def read_node: () -> untyped
30
+
31
+ def read_node_list: () -> Array[untyped]
32
+
33
+ def read_tokens: () -> Array[[ Symbol, Location ]]
34
+
35
+ private
36
+
37
+ def read_struct: (Array[untyped] entry) -> untyped
38
+
39
+ def read_field: (untyped reader) -> untyped
40
+
41
+ def read_hash: () -> Hash[untyped, untyped]
42
+
43
+ def read_count: () -> Integer
44
+
45
+ def read_location: (Array[untyped]? loc_children) -> Location?
46
+
47
+ def read_location_value: () -> Location?
48
+
49
+ def read_location_value_list: () -> Array[Location?]
50
+
51
+ def read_attr_ivar_name: () -> (Symbol | false | nil)
52
+
53
+ def read_range: () -> [ Integer, Integer ]?
54
+
55
+ def read_u8: () -> Integer
56
+
57
+ def read_u32: () -> Integer
58
+
59
+ def read_i32: () -> Integer
60
+
61
+ def read_string: (Encoding encoding) -> String
62
+
63
+ def class_for: (String name) -> untyped
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ module RBS
2
+ module WASM
3
+ # Generated from config.yml. See `templates/lib/rbs/wasm/serialization_schema.rb.erb`.
4
+ module SerializationSchema
5
+ # The node tag used for interned symbols (`rbs_ast_symbol`).
6
+ SYMBOL_TAG: Integer
7
+
8
+ # Indexed by node tag. Each entry describes how to decode one node; see the
9
+ # generated file for the exact shape.
10
+ SCHEMA: Array[Array[untyped]?]
11
+ end
12
+ end
13
+ end