rbs 3.9.4 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +75 -0
  3. data/.clangd +2 -0
  4. data/.dockerignore +37 -0
  5. data/.github/dependabot.yml +16 -14
  6. data/.github/workflows/bundle-update.yml +63 -0
  7. data/.github/workflows/c-check.yml +66 -0
  8. data/.github/workflows/comments.yml +5 -3
  9. data/.github/workflows/dependabot.yml +2 -2
  10. data/.github/workflows/jruby.yml +79 -0
  11. data/.github/workflows/release-gems.yml +164 -0
  12. data/.github/workflows/ruby.yml +84 -30
  13. data/.github/workflows/rust.yml +186 -0
  14. data/.github/workflows/truffleruby.yml +54 -0
  15. data/.github/workflows/typecheck.yml +5 -2
  16. data/.github/workflows/wasm.yml +55 -0
  17. data/.github/workflows/windows.yml +9 -3
  18. data/.gitignore +16 -0
  19. data/.rubocop.yml +2 -2
  20. data/CHANGELOG.md +430 -0
  21. data/Dockerfile.jruby +53 -0
  22. data/README.md +41 -4
  23. data/Rakefile +777 -60
  24. data/Steepfile +11 -0
  25. data/config.yml +660 -62
  26. data/core/array.rbs +541 -398
  27. data/core/basic_object.rbs +9 -8
  28. data/core/binding.rbs +0 -2
  29. data/core/builtin.rbs +9 -8
  30. data/core/class.rbs +11 -8
  31. data/core/comparable.rbs +55 -34
  32. data/core/complex.rbs +104 -78
  33. data/core/dir.rbs +61 -49
  34. data/core/encoding.rbs +12 -15
  35. data/core/enumerable.rbs +297 -196
  36. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  37. data/core/enumerator/product.rbs +5 -5
  38. data/core/enumerator.rbs +91 -28
  39. data/core/errno.rbs +11 -2
  40. data/core/errors.rbs +58 -29
  41. data/core/exception.rbs +13 -13
  42. data/core/fiber.rbs +74 -54
  43. data/core/file.rbs +260 -1151
  44. data/core/file_constants.rbs +463 -0
  45. data/core/file_stat.rbs +534 -0
  46. data/core/file_test.rbs +3 -3
  47. data/core/float.rbs +257 -116
  48. data/core/gc.rbs +425 -281
  49. data/core/hash.rbs +1151 -829
  50. data/core/integer.rbs +156 -195
  51. data/core/io/buffer.rbs +53 -42
  52. data/core/io/wait.rbs +13 -35
  53. data/core/io.rbs +220 -154
  54. data/core/kernel.rbs +239 -163
  55. data/core/marshal.rbs +4 -4
  56. data/core/match_data.rbs +16 -14
  57. data/core/math.rbs +107 -66
  58. data/core/method.rbs +69 -33
  59. data/core/module.rbs +302 -150
  60. data/core/nil_class.rbs +7 -6
  61. data/core/numeric.rbs +77 -63
  62. data/core/object.rbs +9 -11
  63. data/core/object_space/weak_key_map.rbs +7 -7
  64. data/core/object_space.rbs +30 -23
  65. data/core/pathname.rbs +1312 -0
  66. data/core/proc.rbs +95 -58
  67. data/core/process.rbs +222 -202
  68. data/core/ractor.rbs +364 -518
  69. data/core/random.rbs +21 -3
  70. data/core/range.rbs +181 -79
  71. data/core/rational.rbs +60 -89
  72. data/core/rbs/ops.rbs +154 -0
  73. data/core/rbs/unnamed/argf.rbs +63 -56
  74. data/core/rbs/unnamed/env_class.rbs +19 -14
  75. data/core/rbs/unnamed/main_class.rbs +123 -0
  76. data/core/rbs/unnamed/random.rbs +11 -118
  77. data/core/regexp.rbs +258 -214
  78. data/core/ruby.rbs +53 -0
  79. data/core/ruby_vm.rbs +78 -34
  80. data/core/rubygems/config_file.rbs +5 -5
  81. data/core/rubygems/errors.rbs +6 -70
  82. data/core/rubygems/requirement.rbs +5 -15
  83. data/core/rubygems/rubygems.rbs +18 -81
  84. data/core/rubygems/specification.rbs +8 -0
  85. data/core/rubygems/version.rbs +2 -163
  86. data/core/set.rbs +493 -363
  87. data/core/signal.rbs +26 -16
  88. data/core/string.rbs +3234 -1285
  89. data/core/struct.rbs +43 -42
  90. data/core/symbol.rbs +41 -34
  91. data/core/thread.rbs +139 -83
  92. data/core/time.rbs +81 -50
  93. data/core/trace_point.rbs +41 -35
  94. data/core/true_class.rbs +2 -2
  95. data/core/unbound_method.rbs +24 -16
  96. data/core/warning.rbs +7 -7
  97. data/docs/CONTRIBUTING.md +2 -1
  98. data/docs/aliases.md +79 -0
  99. data/docs/collection.md +3 -3
  100. data/docs/config.md +171 -0
  101. data/docs/encoding.md +56 -0
  102. data/docs/gem.md +0 -1
  103. data/docs/inline.md +634 -0
  104. data/docs/rbs_by_example.md +20 -20
  105. data/docs/release.md +151 -0
  106. data/docs/rust.md +96 -0
  107. data/docs/sigs.md +3 -3
  108. data/docs/syntax.md +48 -18
  109. data/docs/type_fingerprint.md +21 -0
  110. data/docs/wasm_serialization.md +80 -0
  111. data/exe/rbs +1 -1
  112. data/ext/rbs_extension/ast_translation.c +1855 -0
  113. data/ext/rbs_extension/ast_translation.h +41 -0
  114. data/ext/rbs_extension/class_constants.c +187 -0
  115. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +23 -1
  116. data/ext/rbs_extension/compat.h +10 -0
  117. data/ext/rbs_extension/extconf.rb +26 -1
  118. data/ext/rbs_extension/legacy_location.c +299 -0
  119. data/ext/rbs_extension/legacy_location.h +82 -0
  120. data/ext/rbs_extension/main.c +603 -23
  121. data/ext/rbs_extension/rbs_extension.h +6 -21
  122. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  123. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  124. data/include/rbs/ast.h +1047 -0
  125. data/include/rbs/defines.h +99 -0
  126. data/include/rbs/lexer.h +207 -0
  127. data/include/rbs/location.h +40 -0
  128. data/include/rbs/parser.h +153 -0
  129. data/include/rbs/serialize.h +39 -0
  130. data/include/rbs/string.h +47 -0
  131. data/include/rbs/util/rbs_allocator.h +59 -0
  132. data/include/rbs/util/rbs_assert.h +20 -0
  133. data/include/rbs/util/rbs_buffer.h +83 -0
  134. data/include/rbs/util/rbs_constant_pool.h +6 -70
  135. data/include/rbs/util/rbs_encoding.h +282 -0
  136. data/include/rbs/util/rbs_unescape.h +24 -0
  137. data/include/rbs.h +9 -2
  138. data/lib/rbs/annotate/formatter.rb +3 -13
  139. data/lib/rbs/annotate/rdoc_annotator.rb +30 -32
  140. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  141. data/lib/rbs/ast/annotation.rb +1 -1
  142. data/lib/rbs/ast/comment.rb +1 -1
  143. data/lib/rbs/ast/declarations.rb +10 -10
  144. data/lib/rbs/ast/members.rb +14 -14
  145. data/lib/rbs/ast/ruby/annotations.rb +451 -0
  146. data/lib/rbs/ast/ruby/comment_block.rb +247 -0
  147. data/lib/rbs/ast/ruby/declarations.rb +291 -0
  148. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  149. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  150. data/lib/rbs/ast/ruby/members.rb +762 -0
  151. data/lib/rbs/ast/type_param.rb +24 -4
  152. data/lib/rbs/buffer.rb +142 -20
  153. data/lib/rbs/cli/diff.rb +16 -15
  154. data/lib/rbs/cli/validate.rb +63 -126
  155. data/lib/rbs/cli.rb +59 -29
  156. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  157. data/lib/rbs/collection/sources/git.rb +7 -0
  158. data/lib/rbs/definition.rb +6 -1
  159. data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
  160. data/lib/rbs/definition_builder/method_builder.rb +74 -33
  161. data/lib/rbs/definition_builder.rb +177 -20
  162. data/lib/rbs/diff.rb +7 -1
  163. data/lib/rbs/environment/class_entry.rb +69 -0
  164. data/lib/rbs/environment/module_entry.rb +66 -0
  165. data/lib/rbs/environment.rb +410 -215
  166. data/lib/rbs/environment_loader.rb +2 -8
  167. data/lib/rbs/errors.rb +31 -21
  168. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  169. data/lib/rbs/inline_parser.rb +568 -0
  170. data/lib/rbs/location_aux.rb +36 -4
  171. data/lib/rbs/locator.rb +5 -1
  172. data/lib/rbs/method_type.rb +5 -3
  173. data/lib/rbs/namespace.rb +47 -18
  174. data/lib/rbs/parser_aux.rb +37 -7
  175. data/lib/rbs/prototype/helpers.rb +57 -0
  176. data/lib/rbs/prototype/rb.rb +3 -28
  177. data/lib/rbs/prototype/rbi.rb +196 -45
  178. data/lib/rbs/prototype/runtime.rb +12 -2
  179. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  180. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  181. data/lib/rbs/rewriter.rb +70 -0
  182. data/lib/rbs/source.rb +99 -0
  183. data/lib/rbs/subtractor.rb +7 -4
  184. data/lib/rbs/test/type_check.rb +25 -3
  185. data/lib/rbs/type_name.rb +34 -21
  186. data/lib/rbs/types.rb +91 -79
  187. data/lib/rbs/unit_test/convertibles.rb +1 -0
  188. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  189. data/lib/rbs/validator.rb +2 -2
  190. data/lib/rbs/version.rb +1 -1
  191. data/lib/rbs/wasm/deserializer.rb +213 -0
  192. data/lib/rbs/wasm/location.rb +61 -0
  193. data/lib/rbs/wasm/parser.rb +137 -0
  194. data/lib/rbs/wasm/runtime.rb +196 -0
  195. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  196. data/lib/rbs.rb +25 -2
  197. data/lib/rbs_jars.rb +39 -0
  198. data/lib/rdoc/discover.rb +1 -1
  199. data/lib/rdoc_plugin/parser.rb +8 -3
  200. data/rbs.gemspec +37 -5
  201. data/schema/typeParam.json +17 -1
  202. data/sig/ancestor_builder.rbs +1 -1
  203. data/sig/annotate/formatter.rbs +2 -2
  204. data/sig/annotate/rdoc_annotater.rbs +13 -10
  205. data/sig/ast/ruby/annotations.rbs +470 -0
  206. data/sig/ast/ruby/comment_block.rbs +127 -0
  207. data/sig/ast/ruby/declarations.rbs +158 -0
  208. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  209. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  210. data/sig/ast/ruby/members.rbs +198 -0
  211. data/sig/buffer.rbs +81 -5
  212. data/sig/cli/diff.rbs +5 -11
  213. data/sig/cli/validate.rbs +12 -8
  214. data/sig/cli.rbs +18 -18
  215. data/sig/collection/config/lockfile_generator.rbs +2 -0
  216. data/sig/definition.rbs +6 -0
  217. data/sig/definition_builder.rbs +3 -1
  218. data/sig/environment/class_entry.rbs +50 -0
  219. data/sig/environment/module_entry.rbs +50 -0
  220. data/sig/environment.rbs +94 -87
  221. data/sig/errors.rbs +26 -20
  222. data/sig/inline_parser/comment_association.rbs +71 -0
  223. data/sig/inline_parser.rbs +126 -0
  224. data/sig/location.rbs +32 -7
  225. data/sig/locator.rbs +0 -2
  226. data/sig/manifest.yaml +0 -2
  227. data/sig/method_builder.rbs +9 -4
  228. data/sig/namespace.rbs +20 -5
  229. data/sig/parser.rbs +77 -13
  230. data/sig/prototype/helpers.rbs +2 -0
  231. data/sig/prototype/rbi.rbs +33 -4
  232. data/sig/resolver/type_name_resolver.rbs +36 -10
  233. data/sig/rewriter.rbs +45 -0
  234. data/sig/source.rbs +48 -0
  235. data/sig/type_param.rbs +13 -8
  236. data/sig/typename.rbs +15 -5
  237. data/sig/types.rbs +10 -8
  238. data/sig/unit_test/spy.rbs +0 -8
  239. data/sig/unit_test/type_assertions.rbs +15 -0
  240. data/sig/wasm/deserializer.rbs +66 -0
  241. data/sig/wasm/serialization_schema.rbs +13 -0
  242. data/src/ast.c +1628 -0
  243. data/src/lexer.c +3221 -0
  244. data/src/lexer.re +155 -0
  245. data/src/lexstate.c +221 -0
  246. data/src/location.c +31 -0
  247. data/src/parser.c +4258 -0
  248. data/src/serialize.c +958 -0
  249. data/src/string.c +41 -0
  250. data/src/util/rbs_allocator.c +171 -0
  251. data/src/util/rbs_assert.c +19 -0
  252. data/src/util/rbs_buffer.c +54 -0
  253. data/src/util/rbs_constant_pool.c +18 -92
  254. data/src/util/rbs_encoding.c +21308 -0
  255. data/src/util/rbs_unescape.c +167 -0
  256. data/stdlib/abbrev/0/array.rbs +1 -1
  257. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  258. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  259. data/stdlib/cgi/0/core.rbs +9 -393
  260. data/stdlib/cgi/0/manifest.yaml +1 -0
  261. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  262. data/stdlib/coverage/0/coverage.rbs +7 -4
  263. data/stdlib/csv/0/csv.rbs +5 -5
  264. data/stdlib/date/0/date.rbs +92 -79
  265. data/stdlib/date/0/date_time.rbs +25 -24
  266. data/stdlib/delegate/0/delegator.rbs +11 -7
  267. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  268. data/stdlib/digest/0/digest.rbs +117 -1
  269. data/stdlib/erb/0/erb.rbs +748 -347
  270. data/stdlib/etc/0/etc.rbs +73 -54
  271. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  272. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  273. data/stdlib/io-console/0/io-console.rbs +2 -2
  274. data/stdlib/ipaddr/0/ipaddr.rbs +0 -5
  275. data/stdlib/json/0/json.rbs +232 -185
  276. data/stdlib/monitor/0/monitor.rbs +5 -5
  277. data/stdlib/net-http/0/net-http.rbs +162 -134
  278. data/stdlib/objspace/0/objspace.rbs +17 -34
  279. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  280. data/stdlib/open3/0/open3.rbs +469 -10
  281. data/stdlib/openssl/0/openssl.rbs +521 -397
  282. data/stdlib/optparse/0/optparse.rbs +26 -17
  283. data/stdlib/pathname/0/pathname.rbs +11 -1381
  284. data/stdlib/pp/0/pp.rbs +9 -8
  285. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  286. data/stdlib/pstore/0/pstore.rbs +35 -30
  287. data/stdlib/psych/0/psych.rbs +65 -12
  288. data/stdlib/psych/0/store.rbs +2 -4
  289. data/stdlib/pty/0/pty.rbs +9 -6
  290. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  291. data/stdlib/rdoc/0/code_object.rbs +4 -3
  292. data/stdlib/rdoc/0/comment.rbs +2 -0
  293. data/stdlib/rdoc/0/options.rbs +76 -0
  294. data/stdlib/rdoc/0/parser.rbs +1 -1
  295. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  296. data/stdlib/rdoc/0/store.rbs +2 -2
  297. data/stdlib/resolv/0/resolv.rbs +26 -69
  298. data/stdlib/ripper/0/ripper.rbs +25 -19
  299. data/stdlib/securerandom/0/manifest.yaml +2 -0
  300. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  301. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  302. data/stdlib/singleton/0/singleton.rbs +3 -0
  303. data/stdlib/socket/0/addrinfo.rbs +9 -9
  304. data/stdlib/socket/0/basic_socket.rbs +3 -3
  305. data/stdlib/socket/0/ip_socket.rbs +10 -8
  306. data/stdlib/socket/0/socket.rbs +23 -10
  307. data/stdlib/socket/0/tcp_server.rbs +1 -1
  308. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  309. data/stdlib/socket/0/udp_socket.rbs +1 -1
  310. data/stdlib/socket/0/unix_server.rbs +1 -1
  311. data/stdlib/stringio/0/stringio.rbs +1209 -95
  312. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  313. data/stdlib/tempfile/0/manifest.yaml +3 -0
  314. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  315. data/stdlib/time/0/time.rbs +8 -6
  316. data/stdlib/timeout/0/timeout.rbs +58 -7
  317. data/stdlib/tsort/0/cyclic.rbs +4 -1
  318. data/stdlib/tsort/0/interfaces.rbs +8 -8
  319. data/stdlib/tsort/0/tsort.rbs +16 -15
  320. data/stdlib/uri/0/common.rbs +42 -20
  321. data/stdlib/uri/0/file.rbs +3 -3
  322. data/stdlib/uri/0/generic.rbs +21 -18
  323. data/stdlib/uri/0/http.rbs +2 -2
  324. data/stdlib/uri/0/ldap.rbs +2 -2
  325. data/stdlib/uri/0/mailto.rbs +3 -3
  326. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  327. data/stdlib/zlib/0/deflate.rbs +4 -3
  328. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  329. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  330. data/stdlib/zlib/0/inflate.rbs +1 -1
  331. data/stdlib/zlib/0/need_dict.rbs +1 -1
  332. data/wasm/README.md +60 -0
  333. data/wasm/rbs_wasm.c +423 -0
  334. metadata +131 -19
  335. data/ext/rbs_extension/lexer.c +0 -2728
  336. data/ext/rbs_extension/lexer.h +0 -179
  337. data/ext/rbs_extension/lexer.re +0 -147
  338. data/ext/rbs_extension/lexstate.c +0 -175
  339. data/ext/rbs_extension/location.c +0 -325
  340. data/ext/rbs_extension/location.h +0 -85
  341. data/ext/rbs_extension/parser.c +0 -2982
  342. data/ext/rbs_extension/parser.h +0 -18
  343. data/ext/rbs_extension/parserstate.c +0 -411
  344. data/ext/rbs_extension/parserstate.h +0 -163
  345. data/ext/rbs_extension/unescape.c +0 -32
  346. data/include/rbs/ruby_objs.h +0 -72
  347. data/src/constants.c +0 -153
  348. data/src/ruby_objs.c +0 -799
@@ -0,0 +1,71 @@
1
+ use RBS::AST::Ruby::CommentBlock
2
+
3
+ module RBS
4
+ class InlineParser
5
+ # CommentAssociation manages the association between `Prism::Node` and `CommentBlock`
6
+ #
7
+ class CommentAssociation
8
+ attr_reader blocks: Array[CommentBlock]
9
+
10
+ attr_reader start_line_map: Hash[Integer, CommentBlock]
11
+
12
+ attr_reader end_line_map: Hash[Integer, CommentBlock]
13
+
14
+ # CommentBlocks that are already associated to a node, which cannot be associated to another node again
15
+ #
16
+ attr_reader associated_blocks: Set[CommentBlock]
17
+
18
+ def self.build: (Buffer, Prism::Result) -> instance
19
+
20
+ def initialize: (Array[CommentBlock]) -> void
21
+
22
+ class Reference
23
+ attr_reader block: CommentBlock
24
+
25
+ @associated_blocks: Set[CommentBlock]
26
+
27
+ def initialize: (CommentBlock, Set[CommentBlock]) -> void
28
+
29
+ def associate!: () -> self
30
+
31
+ def associated?: () -> bool
32
+ end
33
+
34
+ # Returns an unassociated CommentBlock that can be associated to given node
35
+ #
36
+ # Automatically updates association status.
37
+ #
38
+ def leading_block!: (Prism::Node) -> CommentBlock?
39
+
40
+ # Returns a Reference that is associated to given node
41
+ #
42
+ # Updates association explicitly through the reference.
43
+ #
44
+ def leading_block: (Prism::Node) -> Reference?
45
+
46
+ # Returns a CommentBlock that is associated to given node, or by its location
47
+ #
48
+ # Update association status.
49
+ #
50
+ def trailing_block!: (Prism::Node | Prism::Location) -> CommentBlock?
51
+
52
+ # Returns a Reference that is associated to given node, or by its location
53
+ #
54
+ # Updates association explicitly through the reference.
55
+ #
56
+ def trailing_block: (Prism::Node | Prism::Location) -> Reference?
57
+
58
+ # Yields leading CommentBlocks that is enclosed in the given node
59
+ #
60
+ # Note that `enclosed_blocks` works only after all of the *leading* blocks inside the node is associated.
61
+ #
62
+ # Update association status.
63
+ #
64
+ def each_enclosed_block: (Prism::Node) { (CommentBlock) -> void } -> void
65
+ | (Prism::Node) -> Enumerator[CommentBlock]
66
+
67
+ def each_unassociated_block: () { (CommentBlock) -> void } -> void
68
+ | () -> Enumerator[CommentBlock]
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,126 @@
1
+ use RBS::AST::Ruby::Declarations
2
+
3
+ module RBS
4
+ class InlineParser
5
+ class Result
6
+ attr_reader buffer: Buffer
7
+ attr_reader prism_result: Prism::ParseResult
8
+ attr_reader declarations: Array[AST::Ruby::Declarations::t]
9
+ attr_reader diagnostics: Array[Diagnostic::t]
10
+
11
+ def initialize: (Buffer, Prism::ParseResult) -> void
12
+
13
+ def type_fingerprint: () -> untyped
14
+ end
15
+
16
+ module Diagnostic
17
+ class Base
18
+ attr_reader message: String
19
+
20
+ attr_reader location: Location
21
+
22
+ def initialize: (Location, String) -> void
23
+ end
24
+
25
+ class NotImplementedYet < Base
26
+ end
27
+
28
+ class NonConstantClassName < Base
29
+ end
30
+
31
+ class NonConstantModuleName < Base
32
+ end
33
+
34
+ class NonConstantSuperClassName < Base
35
+ end
36
+
37
+ class TopLevelMethodDefinition < Base
38
+ end
39
+
40
+ class TopLevelAttributeDefinition < Base
41
+ end
42
+
43
+ class UnusedInlineAnnotation < Base
44
+ end
45
+
46
+ class AnnotationSyntaxError < Base
47
+ end
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
+
64
+ type t = NotImplementedYet
65
+ | NonConstantClassName | NonConstantModuleName | NonConstantSuperClassName
66
+ | TopLevelMethodDefinition | TopLevelAttributeDefinition
67
+ | UnusedInlineAnnotation | AnnotationSyntaxError
68
+ | MixinMultipleArguments | MixinNonConstantModule
69
+ | AttributeNonSymbolName
70
+ | NonConstantConstantDeclaration
71
+ | ClassModuleAliasDeclarationMissingTypeName
72
+ end
73
+
74
+ def self.parse: (Buffer, Prism::ParseResult) -> Result
75
+
76
+ class Parser < Prism::Visitor
77
+ type module_context = Declarations::ClassDecl | Declarations::ModuleDecl
78
+
79
+ include AST::Ruby::Helpers::ConstantHelper
80
+
81
+ include AST::Ruby::Helpers::LocationHelper
82
+
83
+ attr_reader comments: CommentAssociation
84
+
85
+ attr_reader result: Result
86
+
87
+ attr_reader module_nesting: Array[module_context]
88
+
89
+ def initialize: (Result) -> void
90
+
91
+ def buffer: () -> Buffer
92
+
93
+ %a{pure} def current_module: () -> module_context?
94
+
95
+ %a{pure} def current_module!: () -> module_context
96
+
97
+ def diagnostics: () -> Array[Diagnostic::t]
98
+
99
+ def push_module_nesting: [T] (module_context) { () -> T } -> T
100
+
101
+ # Returns `true` if the node is a comment block including `@rbs skip` annotation
102
+ #
103
+ # Doesn't update the `association` flag if returning `false`.
104
+ #
105
+ def skip_node?: (Prism::Node) -> bool
106
+
107
+ def insert_declaration: (module_context) -> void
108
+
109
+ def report_unused_annotation: (*AST::Ruby::Annotations::t | nil | AST::Ruby::CommentBlock::AnnotationSyntaxError) -> void
110
+
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?
124
+ end
125
+ end
126
+ end
data/sig/location.rbs CHANGED
@@ -4,14 +4,20 @@ module RBS
4
4
  #
5
5
  # A location can have _child_ locations.
6
6
  #
7
- class Location[in RequiredChildKeys, in OptionalChildKeys]
7
+ class Location[in RequiredChildKeys = untyped, in OptionalChildKeys = untyped]
8
8
  # The buffer this location points on.
9
9
  attr_reader buffer (): Buffer
10
10
 
11
- # The index of character the range starts from.
11
+ # The absolute start index of character the range starts from
12
+ #
13
+ # It returns the index in the `buffer.top_buffer`.
14
+ #
12
15
  attr_reader start_pos (): Integer
13
16
 
14
- # The index of character the range ends at.
17
+ # The absolute end index of character the range ends at
18
+ #
19
+ # It returns the index in the `buffer.top_buffer`.
20
+ #
15
21
  attr_reader end_pos (): Integer
16
22
 
17
23
  def initialize: (Buffer, Integer start_pos, Integer end_pos) -> void
@@ -24,26 +30,37 @@ module RBS
24
30
  # Returns the name of the buffer.
25
31
  def name: () -> untyped
26
32
 
27
- # Line of the `start_pos` (1 origin)
33
+ # The *raw* index of character the range starts from.
34
+ attr_reader _start_pos (): Integer
35
+
36
+ # The *raw* index of character the range ends at.
37
+ attr_reader _end_pos (): Integer
38
+
39
+ # Line of the `start_pos` (1 origin, absolute)
28
40
  attr_reader start_line (): Integer
29
41
 
30
- # Column of the `start_pos` (0 origin)
42
+ # Column of the `start_pos` (0 origin, absolute)
31
43
  attr_reader start_column (): Integer
32
44
 
33
- # Line of the `end_pos` (1 origin)
45
+ # Line of the `end_pos` (1 origin, absolute)
34
46
  attr_reader end_line (): Integer
35
47
 
36
- # Column of the `end_pos` (0 origin)
48
+ # Column of the `end_pos` (0 origin, absolute)
37
49
  attr_reader end_column (): Integer
38
50
 
51
+ # The absolute line-column pair of the start position
52
+ #
39
53
  attr_reader start_loc (): Buffer::loc
40
54
 
41
55
  @start_loc: Buffer::loc?
42
56
 
57
+ # The absolute line-column pair of the end position
58
+ #
43
59
  attr_reader end_loc (): Buffer::loc
44
60
 
45
61
  @end_loc: Buffer::loc?
46
62
 
63
+ # The absolute range of the start and end position
47
64
  attr_reader range (): Range[Integer]
48
65
 
49
66
  @range: Range[Integer]?
@@ -97,6 +114,14 @@ module RBS
97
114
 
98
115
  def key?: (Symbol) -> bool
99
116
 
117
+ # Returns the location of the buffer, but the buffer is detached from the parent buffer
118
+ #
119
+ def local_location: () -> self
120
+
121
+ # Returns the source of `#local_location`
122
+ #
123
+ def local_source: () -> String
124
+
100
125
  private
101
126
 
102
127
  def _add_required_child: (RequiredChildKeys name, Integer start_pos, Integer end_pos) -> void
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,16 +16,19 @@ 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 | AST::Ruby::Members::AttrReaderMember | AST::Ruby::Members::AttrWriterMember | AST::Ruby::Members::AttrAccessorMember
20
+
21
+ type overloading_definition = AST::Members::MethodDefinition | AST::Ruby::Members::DefMember
19
22
 
20
23
  type accessibility = RBS::Definition::accessibility
21
24
 
22
25
  attr_reader name: Symbol
23
26
  attr_reader type: instance_type
24
27
  attr_reader originals: Array[original]
25
- attr_reader overloads: Array[AST::Members::MethodDefinition]
28
+ attr_reader overloads: Array[overloading_definition]
26
29
  attr_reader accessibilities: Array[accessibility]
27
30
 
28
- def initialize: (name: Symbol, type: instance_type, originals: Array[original], overloads: Array[AST::Members::MethodDefinition], accessibilities: Array[accessibility]) -> void
31
+ def initialize: (name: Symbol, type: instance_type, originals: Array[original], overloads: Array[overloading_definition], accessibilities: Array[accessibility]) -> void
29
32
 
30
33
  def original: () -> original?
31
34
 
@@ -74,9 +77,11 @@ module RBS
74
77
 
75
78
  def build_attribute: (Methods, Methods::instance_type, member: AST::Members::AttrAccessor | AST::Members::AttrReader | AST::Members::AttrWriter, accessibility: Definition::accessibility) -> void
76
79
 
77
- def build_method: (Methods, Methods::instance_type, member: AST::Members::MethodDefinition, accessibility: Definition::accessibility) -> void
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
+
82
+ def build_method: (Methods, Methods::instance_type, member: AST::Members::MethodDefinition | AST::Ruby::Members::DefMember, accessibility: Definition::accessibility) -> void
78
83
 
79
- def each_member_with_accessibility: (Array[AST::Members::t | AST::Declarations::t], ?accessibility: Definition::accessibility) { (AST::Members::t | AST::Declarations::t, Definition::accessibility) -> void } -> void
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
80
85
 
81
86
  def update: (env: Environment, except: _Each[TypeName]) -> MethodBuilder
82
87
  end
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
 
@@ -139,8 +159,3 @@ module RBS
139
159
  | () -> Enumerator[Namespace, void]
140
160
  end
141
161
  end
142
-
143
- module Kernel
144
- # Deprecated: Use `RBS::Namespace.parse` instead
145
- %a{deprecated} def Namespace: (String) -> RBS::Namespace
146
- end
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,12 +63,45 @@ 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
  #
69
85
  def self.parse_signature: (Buffer | String) -> [Buffer, Array[AST::Directives::t], Array[AST::Declarations::t]]
70
86
 
87
+ # Parse a list of type parameters and return it
88
+ #
89
+ # ```ruby
90
+ # RBS::Parser.parse_type_params("") # => nil
91
+ # RBS::Parser.parse_type_params("[U, V]") # => `[:U, :V]`
92
+ # RBS::Parser.parse_type_params("[in U, V < Integer]") # => `[:U, :V]`
93
+ # ```
94
+ #
95
+ # When `module_type_params` is `false`, an error is raised if `unchecked`, `in` or `out` are used.
96
+ #
97
+ # ```ruby
98
+ # RBS::Parser.parse_type_params("[unchecked U]", module_type_params: false) # => Raises an error
99
+ # RBS::Parser.parse_type_params("[out U]", module_type_params: false) # => Raises an error
100
+ # RBS::Parser.parse_type_params("[in U]", module_type_params: false) # => Raises an error
101
+ # ```
102
+ #
103
+ def self.parse_type_params: (Buffer | String, ?module_type_params: bool) -> Array[AST::TypeParam]
104
+
71
105
  # Returns the magic comment from the buffer
72
106
  #
73
107
  def self.magic_comment: (Buffer) -> AST::Directives::ResolveTypeNames?
@@ -82,18 +116,48 @@ module RBS
82
116
 
83
117
  KEYWORDS: Hash[String, bot]
84
118
 
119
+ # Parse a leading annotation and return it
120
+ #
121
+ # Raises an exception if the source text contains a syntax error.
122
+ #
123
+ def self.parse_inline_leading_annotation: (Buffer | String, Range[Integer?], ?variables: Array[Symbol]) -> AST::Ruby::Annotations::leading_annotation
124
+
125
+ # Parse a leading annotation and return it
126
+ #
127
+ # Raises an exception if the source text contains a syntax error.
128
+ #
129
+ def self.parse_inline_trailing_annotation: (Buffer | String, Range[Integer?], ?variables: Array[Symbol]) -> AST::Ruby::Annotations::trailing_annotation
130
+
85
131
  private
86
132
 
87
133
  def self.buffer: (String | Buffer source) -> Buffer
88
134
 
89
- 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?
90
138
 
91
139
  def self._parse_method_type: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables, bool require_eof) -> MethodType?
92
140
 
93
141
  def self._parse_signature: (Buffer, Integer start_pos, Integer end_pos) -> [Array[AST::Directives::t], Array[AST::Declarations::t]]
94
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
+
153
+ def self._parse_type_params: (Buffer, Integer start_pos, Integer end_pos, bool module_type_params) -> Array[AST::TypeParam]
154
+
95
155
  def self._lex: (Buffer, Integer end_pos) -> Array[[Symbol, Location[untyped, untyped]]]
96
156
 
157
+ def self._parse_inline_leading_annotation: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables) -> AST::Ruby::Annotations::leading_annotation
158
+
159
+ def self._parse_inline_trailing_annotation: (Buffer, Integer start_pos, Integer end_pos, Array[Symbol] variables) -> AST::Ruby::Annotations::trailing_annotation
160
+
97
161
  class LocatedValue
98
162
  end
99
163
  end
@@ -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
@@ -2,7 +2,17 @@ module RBS
2
2
  module Prototype
3
3
  class RBI
4
4
  include Helpers
5
-
5
+
6
+ type visibility = :private | :protected | :public
7
+
8
+ class Context
9
+ attr_accessor singleton: bool
10
+
11
+ attr_accessor visibility: visibility
12
+
13
+ def initialize: (singleton: bool, visibility: visibility) -> void
14
+ end
15
+
6
16
  attr_reader decls: Array[AST::Declarations::t]
7
17
 
8
18
  type module_decl = AST::Declarations::Class | AST::Declarations::Module
@@ -13,13 +23,15 @@ module RBS
13
23
  # Last subsequent `sig` calls
14
24
  attr_reader last_sig: Array[RubyVM::AbstractSyntaxTree::Node]?
15
25
 
26
+ @contexts: Array[Context]
27
+
28
+ @emitted_visibility: Hash[Integer, visibility]
29
+
16
30
  def initialize: () -> void
17
31
 
18
32
  def parse: (String) -> void
19
33
 
20
- def nested_name: (RubyVM::AbstractSyntaxTree::Node name) -> TypeName
21
-
22
- def current_namespace: () -> Namespace
34
+ def append_decl: (AST::Declarations::t decl) -> void
23
35
 
24
36
  def push_class: (
25
37
  RubyVM::AbstractSyntaxTree::Node name,
@@ -35,6 +47,17 @@ module RBS
35
47
  # The inner most module/class definition, raises on toplevel
36
48
  def current_module!: () -> module_decl
37
49
 
50
+ def current_context: () -> Context?
51
+
52
+ def current_context!: () -> Context
53
+
54
+ # Visibility of a member, given as `private def ...` in RBS
55
+ #
56
+ # Returns `nil` for members in a visibility _section_, which `sync_visibility` emits instead.
57
+ def member_visibility: (Context) -> AST::Members::visibility?
58
+
59
+ def sync_visibility: (visibility) -> void
60
+
38
61
  # Put a `sig` call to current list.
39
62
  def push_sig: (RubyVM::AbstractSyntaxTree::Node node) -> void
40
63
 
@@ -45,6 +68,12 @@ module RBS
45
68
 
46
69
  def process: (RubyVM::AbstractSyntaxTree::Node node, comments: Hash[Integer, AST::Comment], ?outer: Array[RubyVM::AbstractSyntaxTree::Node]) -> void
47
70
 
71
+ def process_visibility: (RubyVM::AbstractSyntaxTree::Node node, outer: Array[RubyVM::AbstractSyntaxTree::Node], comments: Hash[Integer, AST::Comment]) -> void
72
+
73
+ def process_attribute: (RubyVM::AbstractSyntaxTree::Node node, comments: Hash[Integer, AST::Comment]) -> void
74
+
75
+ def attribute_type: (:attr_reader | :attr_writer | :attr_accessor kind, Array[RubyVM::AbstractSyntaxTree::Node]? sigs) -> Types::t
76
+
48
77
  def method_type: (RubyVM::AbstractSyntaxTree::Node? args_node, RubyVM::AbstractSyntaxTree::Node? type_node, variables: Array[AST::TypeParam], overloads: Integer) -> MethodType?
49
78
 
50
79
  def parse_params: (RubyVM::AbstractSyntaxTree::Node args_node, RubyVM::AbstractSyntaxTree::Node args, MethodType method_type, variables: Array[AST::TypeParam], overloads: Integer) -> MethodType
@@ -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