rbs 3.9.5 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +74 -0
  3. data/.clangd +2 -0
  4. data/.github/dependabot.yml +14 -14
  5. data/.github/workflows/bundle-update.yml +60 -0
  6. data/.github/workflows/c-check.yml +58 -0
  7. data/.github/workflows/comments.yml +5 -3
  8. data/.github/workflows/dependabot.yml +2 -2
  9. data/.github/workflows/ruby.yml +40 -32
  10. data/.github/workflows/rust.yml +95 -0
  11. data/.github/workflows/typecheck.yml +2 -2
  12. data/.github/workflows/windows.yml +3 -3
  13. data/.gitignore +4 -0
  14. data/.rubocop.yml +2 -2
  15. data/.vscode/extensions.json +5 -0
  16. data/.vscode/settings.json +19 -0
  17. data/CHANGELOG.md +284 -0
  18. data/README.md +38 -1
  19. data/Rakefile +144 -29
  20. data/Steepfile +2 -0
  21. data/config.yml +634 -62
  22. data/core/array.rbs +307 -227
  23. data/core/basic_object.rbs +9 -8
  24. data/core/binding.rbs +0 -2
  25. data/core/builtin.rbs +2 -2
  26. data/core/class.rbs +6 -5
  27. data/core/comparable.rbs +55 -34
  28. data/core/complex.rbs +104 -78
  29. data/core/dir.rbs +61 -49
  30. data/core/encoding.rbs +12 -15
  31. data/core/enumerable.rbs +188 -87
  32. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  33. data/core/enumerator.rbs +65 -2
  34. data/core/errno.rbs +11 -2
  35. data/core/errors.rbs +58 -29
  36. data/core/exception.rbs +13 -13
  37. data/core/fiber.rbs +74 -54
  38. data/core/file.rbs +280 -177
  39. data/core/file_test.rbs +3 -3
  40. data/core/float.rbs +257 -92
  41. data/core/gc.rbs +425 -281
  42. data/core/hash.rbs +1045 -739
  43. data/core/integer.rbs +135 -137
  44. data/core/io/buffer.rbs +53 -42
  45. data/core/io/wait.rbs +13 -35
  46. data/core/io.rbs +196 -148
  47. data/core/kernel.rbs +216 -155
  48. data/core/marshal.rbs +4 -4
  49. data/core/match_data.rbs +15 -13
  50. data/core/math.rbs +107 -66
  51. data/core/method.rbs +69 -33
  52. data/core/module.rbs +244 -106
  53. data/core/nil_class.rbs +7 -6
  54. data/core/numeric.rbs +74 -63
  55. data/core/object.rbs +9 -11
  56. data/core/object_space.rbs +30 -23
  57. data/core/pathname.rbs +1322 -0
  58. data/core/proc.rbs +95 -58
  59. data/core/process.rbs +222 -202
  60. data/core/ractor.rbs +371 -515
  61. data/core/random.rbs +21 -3
  62. data/core/range.rbs +159 -57
  63. data/core/rational.rbs +60 -89
  64. data/core/rbs/unnamed/argf.rbs +60 -53
  65. data/core/rbs/unnamed/env_class.rbs +19 -14
  66. data/core/rbs/unnamed/main_class.rbs +123 -0
  67. data/core/rbs/unnamed/random.rbs +11 -118
  68. data/core/regexp.rbs +258 -214
  69. data/core/ruby.rbs +53 -0
  70. data/core/ruby_vm.rbs +38 -34
  71. data/core/rubygems/config_file.rbs +5 -5
  72. data/core/rubygems/errors.rbs +4 -71
  73. data/core/rubygems/requirement.rbs +5 -5
  74. data/core/rubygems/rubygems.rbs +16 -82
  75. data/core/rubygems/version.rbs +2 -3
  76. data/core/set.rbs +490 -360
  77. data/core/signal.rbs +26 -16
  78. data/core/string.rbs +3303 -1365
  79. data/core/struct.rbs +27 -26
  80. data/core/symbol.rbs +41 -34
  81. data/core/thread.rbs +135 -74
  82. data/core/time.rbs +81 -50
  83. data/core/trace_point.rbs +41 -35
  84. data/core/true_class.rbs +2 -2
  85. data/core/unbound_method.rbs +24 -16
  86. data/core/warning.rbs +7 -7
  87. data/docs/aliases.md +79 -0
  88. data/docs/collection.md +3 -3
  89. data/docs/config.md +171 -0
  90. data/docs/encoding.md +56 -0
  91. data/docs/gem.md +0 -1
  92. data/docs/inline.md +576 -0
  93. data/docs/sigs.md +3 -3
  94. data/docs/syntax.md +46 -16
  95. data/docs/type_fingerprint.md +21 -0
  96. data/exe/rbs +1 -1
  97. data/ext/rbs_extension/ast_translation.c +1513 -0
  98. data/ext/rbs_extension/ast_translation.h +37 -0
  99. data/ext/rbs_extension/class_constants.c +185 -0
  100. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +22 -1
  101. data/ext/rbs_extension/compat.h +10 -0
  102. data/ext/rbs_extension/extconf.rb +25 -1
  103. data/ext/rbs_extension/legacy_location.c +294 -0
  104. data/ext/rbs_extension/legacy_location.h +82 -0
  105. data/ext/rbs_extension/main.c +468 -24
  106. data/ext/rbs_extension/rbs_extension.h +6 -21
  107. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  108. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  109. data/include/rbs/ast.h +1022 -0
  110. data/include/rbs/defines.h +86 -0
  111. data/include/rbs/lexer.h +206 -0
  112. data/include/rbs/location.h +40 -0
  113. data/include/rbs/parser.h +153 -0
  114. data/include/rbs/string.h +47 -0
  115. data/include/rbs/util/rbs_allocator.h +59 -0
  116. data/include/rbs/util/rbs_assert.h +20 -0
  117. data/include/rbs/util/rbs_buffer.h +83 -0
  118. data/include/rbs/util/rbs_constant_pool.h +6 -70
  119. data/include/rbs/util/rbs_encoding.h +282 -0
  120. data/include/rbs/util/rbs_unescape.h +24 -0
  121. data/include/rbs.h +9 -2
  122. data/lib/rbs/annotate/formatter.rb +3 -13
  123. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  124. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  125. data/lib/rbs/ast/annotation.rb +1 -1
  126. data/lib/rbs/ast/comment.rb +1 -1
  127. data/lib/rbs/ast/declarations.rb +10 -10
  128. data/lib/rbs/ast/members.rb +14 -14
  129. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  130. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  131. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  132. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  133. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  134. data/lib/rbs/ast/ruby/members.rb +723 -0
  135. data/lib/rbs/ast/type_param.rb +24 -4
  136. data/lib/rbs/buffer.rb +105 -20
  137. data/lib/rbs/cli/diff.rb +16 -15
  138. data/lib/rbs/cli/validate.rb +63 -126
  139. data/lib/rbs/cli.rb +56 -24
  140. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  141. data/lib/rbs/collection/sources/git.rb +1 -0
  142. data/lib/rbs/collection.rb +0 -1
  143. data/lib/rbs/definition.rb +6 -1
  144. data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
  145. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  146. data/lib/rbs/definition_builder.rb +177 -20
  147. data/lib/rbs/diff.rb +7 -1
  148. data/lib/rbs/environment/class_entry.rb +69 -0
  149. data/lib/rbs/environment/module_entry.rb +66 -0
  150. data/lib/rbs/environment.rb +402 -214
  151. data/lib/rbs/environment_loader.rb +2 -8
  152. data/lib/rbs/errors.rb +31 -21
  153. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  154. data/lib/rbs/inline_parser.rb +542 -0
  155. data/lib/rbs/location_aux.rb +36 -4
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +0 -7
  159. data/lib/rbs/parser_aux.rb +35 -7
  160. data/lib/rbs/prototype/helpers.rb +57 -0
  161. data/lib/rbs/prototype/rb.rb +3 -28
  162. data/lib/rbs/prototype/rbi.rb +3 -20
  163. data/lib/rbs/prototype/runtime.rb +10 -2
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  166. data/lib/rbs/source.rb +99 -0
  167. data/lib/rbs/subtractor.rb +7 -4
  168. data/lib/rbs/test/type_check.rb +19 -2
  169. data/lib/rbs/type_name.rb +1 -8
  170. data/lib/rbs/types.rb +91 -79
  171. data/lib/rbs/unit_test/convertibles.rb +1 -0
  172. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  173. data/lib/rbs/validator.rb +2 -2
  174. data/lib/rbs/version.rb +1 -1
  175. data/lib/rbs.rb +13 -2
  176. data/lib/rdoc/discover.rb +1 -1
  177. data/lib/rdoc_plugin/parser.rb +3 -3
  178. data/rbs.gemspec +4 -2
  179. data/rust/.gitignore +1 -0
  180. data/rust/Cargo.lock +378 -0
  181. data/rust/Cargo.toml +7 -0
  182. data/rust/ruby-rbs/Cargo.toml +22 -0
  183. data/rust/ruby-rbs/build.rs +764 -0
  184. data/rust/ruby-rbs/examples/locations.rs +60 -0
  185. data/rust/ruby-rbs/src/lib.rs +1 -0
  186. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  187. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  188. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  189. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  190. data/rust/ruby-rbs-sys/build.rs +204 -0
  191. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  192. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  193. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  194. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  195. data/schema/typeParam.json +17 -1
  196. data/sig/ancestor_builder.rbs +1 -1
  197. data/sig/annotate/formatter.rbs +2 -2
  198. data/sig/annotate/rdoc_annotater.rbs +1 -1
  199. data/sig/ast/ruby/annotations.rbs +421 -0
  200. data/sig/ast/ruby/comment_block.rbs +127 -0
  201. data/sig/ast/ruby/declarations.rbs +158 -0
  202. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  203. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  204. data/sig/ast/ruby/members.rbs +178 -0
  205. data/sig/buffer.rbs +63 -5
  206. data/sig/cli/diff.rbs +5 -11
  207. data/sig/cli/validate.rbs +12 -8
  208. data/sig/cli.rbs +18 -18
  209. data/sig/definition.rbs +6 -0
  210. data/sig/definition_builder.rbs +3 -1
  211. data/sig/environment/class_entry.rbs +50 -0
  212. data/sig/environment/module_entry.rbs +50 -0
  213. data/sig/environment.rbs +94 -87
  214. data/sig/errors.rbs +26 -20
  215. data/sig/inline_parser/comment_association.rbs +71 -0
  216. data/sig/inline_parser.rbs +124 -0
  217. data/sig/location.rbs +32 -7
  218. data/sig/locator.rbs +0 -2
  219. data/sig/manifest.yaml +0 -1
  220. data/sig/method_builder.rbs +9 -4
  221. data/sig/namespace.rbs +0 -5
  222. data/sig/parser.rbs +67 -13
  223. data/sig/prototype/helpers.rbs +2 -0
  224. data/sig/resolver/type_name_resolver.rbs +35 -7
  225. data/sig/source.rbs +48 -0
  226. data/sig/type_param.rbs +13 -8
  227. data/sig/typename.rbs +0 -5
  228. data/sig/types.rbs +10 -8
  229. data/sig/unit_test/spy.rbs +0 -8
  230. data/sig/unit_test/type_assertions.rbs +11 -0
  231. data/src/ast.c +1604 -0
  232. data/src/lexer.c +3194 -0
  233. data/src/lexer.re +154 -0
  234. data/src/lexstate.c +212 -0
  235. data/src/location.c +31 -0
  236. data/src/parser.c +4205 -0
  237. data/src/string.c +41 -0
  238. data/src/util/rbs_allocator.c +165 -0
  239. data/src/util/rbs_assert.c +19 -0
  240. data/src/util/rbs_buffer.c +54 -0
  241. data/src/util/rbs_constant_pool.c +18 -92
  242. data/src/util/rbs_encoding.c +21308 -0
  243. data/src/util/rbs_unescape.c +167 -0
  244. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  245. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  246. data/stdlib/cgi/0/core.rbs +9 -393
  247. data/stdlib/cgi/0/manifest.yaml +1 -0
  248. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  249. data/stdlib/coverage/0/coverage.rbs +7 -4
  250. data/stdlib/date/0/date.rbs +92 -79
  251. data/stdlib/date/0/date_time.rbs +25 -24
  252. data/stdlib/delegate/0/delegator.rbs +10 -7
  253. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  254. data/stdlib/digest/0/digest.rbs +110 -0
  255. data/stdlib/erb/0/erb.rbs +748 -347
  256. data/stdlib/etc/0/etc.rbs +55 -50
  257. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  258. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  259. data/stdlib/io-console/0/io-console.rbs +2 -2
  260. data/stdlib/json/0/json.rbs +226 -179
  261. data/stdlib/monitor/0/monitor.rbs +3 -3
  262. data/stdlib/net-http/0/net-http.rbs +162 -134
  263. data/stdlib/objspace/0/objspace.rbs +17 -34
  264. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  265. data/stdlib/open3/0/open3.rbs +469 -10
  266. data/stdlib/openssl/0/openssl.rbs +475 -357
  267. data/stdlib/optparse/0/optparse.rbs +26 -17
  268. data/stdlib/pathname/0/pathname.rbs +11 -1381
  269. data/stdlib/pp/0/pp.rbs +9 -8
  270. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  271. data/stdlib/pstore/0/pstore.rbs +35 -30
  272. data/stdlib/psych/0/psych.rbs +65 -12
  273. data/stdlib/psych/0/store.rbs +2 -4
  274. data/stdlib/pty/0/pty.rbs +9 -6
  275. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  276. data/stdlib/rdoc/0/code_object.rbs +4 -3
  277. data/stdlib/rdoc/0/comment.rbs +2 -0
  278. data/stdlib/rdoc/0/options.rbs +76 -0
  279. data/stdlib/rdoc/0/parser.rbs +1 -1
  280. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  281. data/stdlib/rdoc/0/store.rbs +2 -2
  282. data/stdlib/resolv/0/resolv.rbs +25 -68
  283. data/stdlib/ripper/0/ripper.rbs +25 -19
  284. data/stdlib/securerandom/0/manifest.yaml +2 -0
  285. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  286. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  287. data/stdlib/singleton/0/singleton.rbs +3 -0
  288. data/stdlib/socket/0/addrinfo.rbs +9 -9
  289. data/stdlib/socket/0/basic_socket.rbs +3 -3
  290. data/stdlib/socket/0/ip_socket.rbs +10 -8
  291. data/stdlib/socket/0/socket.rbs +23 -10
  292. data/stdlib/socket/0/tcp_server.rbs +1 -1
  293. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  294. data/stdlib/socket/0/udp_socket.rbs +1 -1
  295. data/stdlib/socket/0/unix_server.rbs +1 -1
  296. data/stdlib/stringio/0/stringio.rbs +1177 -85
  297. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  298. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  299. data/stdlib/time/0/time.rbs +8 -6
  300. data/stdlib/timeout/0/timeout.rbs +63 -7
  301. data/stdlib/tsort/0/cyclic.rbs +3 -0
  302. data/stdlib/tsort/0/tsort.rbs +7 -6
  303. data/stdlib/uri/0/common.rbs +42 -20
  304. data/stdlib/uri/0/file.rbs +3 -3
  305. data/stdlib/uri/0/generic.rbs +26 -18
  306. data/stdlib/uri/0/http.rbs +2 -2
  307. data/stdlib/uri/0/ldap.rbs +2 -2
  308. data/stdlib/uri/0/mailto.rbs +3 -3
  309. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  310. data/stdlib/zlib/0/deflate.rbs +4 -3
  311. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  312. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  313. data/stdlib/zlib/0/inflate.rbs +1 -1
  314. data/stdlib/zlib/0/need_dict.rbs +1 -1
  315. data/stdlib/zlib/0/zstream.rbs +1 -0
  316. metadata +121 -18
  317. data/ext/rbs_extension/lexer.c +0 -2728
  318. data/ext/rbs_extension/lexer.h +0 -179
  319. data/ext/rbs_extension/lexer.re +0 -147
  320. data/ext/rbs_extension/lexstate.c +0 -175
  321. data/ext/rbs_extension/location.c +0 -325
  322. data/ext/rbs_extension/location.h +0 -85
  323. data/ext/rbs_extension/parser.c +0 -2982
  324. data/ext/rbs_extension/parser.h +0 -18
  325. data/ext/rbs_extension/parserstate.c +0 -411
  326. data/ext/rbs_extension/parserstate.h +0 -163
  327. data/ext/rbs_extension/unescape.c +0 -32
  328. data/include/rbs/ruby_objs.h +0 -72
  329. data/src/constants.c +0 -153
  330. data/src/ruby_objs.c +0 -799
@@ -2,8 +2,6 @@
2
2
 
3
3
  module RBS
4
4
  class Environment
5
- attr_reader :declarations
6
-
7
5
  attr_reader :class_decls
8
6
  attr_reader :interface_decls
9
7
  attr_reader :type_alias_decls
@@ -11,116 +9,21 @@ module RBS
11
9
  attr_reader :global_decls
12
10
  attr_reader :class_alias_decls
13
11
 
14
- attr_reader :signatures
15
-
16
- module ContextUtil
17
- def calculate_context(decls)
18
- decls.inject(nil) do |context, decl| #$ Resolver::context
19
- if (_, last = context)
20
- last or raise
21
- [context, last + decl.name]
22
- else
23
- [nil, decl.name.absolute!]
24
- end
25
- end
26
- end
27
- end
28
-
29
- class MultiEntry
30
- D = _ = Struct.new(:decl, :outer, keyword_init: true) do
31
- # @implements D[M]
32
-
33
- include ContextUtil
34
-
35
- def context
36
- @context ||= calculate_context(outer + [decl])
37
- end
38
- end
39
-
40
- attr_reader :name
41
- attr_reader :decls
42
-
43
- def initialize(name:)
44
- @name = name
45
- @decls = []
46
- end
47
-
48
- def insert(decl:, outer:)
49
- decls << D.new(decl: decl, outer: outer)
50
- @primary = nil
51
- end
52
-
53
- def validate_type_params
54
- unless decls.empty?
55
- hd_decl, *tl_decls = decls
56
- raise unless hd_decl
57
-
58
- hd_params = hd_decl.decl.type_params
59
-
60
- tl_decls.each do |tl_decl|
61
- tl_params = tl_decl.decl.type_params
62
-
63
- unless compatible_params?(hd_params, tl_params)
64
- raise GenericParameterMismatchError.new(name: name, decl: _ = tl_decl.decl)
65
- end
66
- end
67
- end
68
- end
69
-
70
- def compatible_params?(ps1, ps2)
71
- if ps1.size == ps2.size
72
- ps1 == AST::TypeParam.rename(ps2, new_names: ps1.map(&:name))
73
- end
74
- end
75
-
76
- def type_params
77
- primary.decl.type_params
78
- end
12
+ attr_reader :sources
79
13
 
80
- def primary
81
- raise "Not implemented"
82
- end
83
- end
84
-
85
- class ModuleEntry < MultiEntry
86
- def self_types
87
- decls.flat_map do |d|
88
- d.decl.self_types
89
- end.uniq
90
- end
91
-
92
- def primary
93
- @primary ||= begin
94
- validate_type_params
95
- decls.first or raise("decls cannot be empty")
96
- end
97
- end
98
- end
99
-
100
- class ClassEntry < MultiEntry
101
- def primary
102
- @primary ||= begin
103
- validate_type_params
104
- decls.find {|d| d.decl.super_class } || decls.first or raise("decls cannot be empty")
105
- end
106
- end
14
+ def declarations
15
+ sources.flat_map(&:declarations)
107
16
  end
108
17
 
109
18
  class SingleEntry
110
19
  attr_reader :name
111
- attr_reader :outer
20
+ attr_reader :context
112
21
  attr_reader :decl
113
22
 
114
- def initialize(name:, decl:, outer:)
23
+ def initialize(name:, decl:, context:)
115
24
  @name = name
116
25
  @decl = decl
117
- @outer = outer
118
- end
119
-
120
- include ContextUtil
121
-
122
- def context
123
- @context ||= calculate_context(outer)
26
+ @context = context
124
27
  end
125
28
  end
126
29
 
@@ -143,9 +46,7 @@ module RBS
143
46
  end
144
47
 
145
48
  def initialize
146
- @signatures = {}
147
- @declarations = []
148
-
49
+ @sources = []
149
50
  @class_decls = {}
150
51
  @interface_decls = {}
151
52
  @type_alias_decls = {}
@@ -156,9 +57,7 @@ module RBS
156
57
  end
157
58
 
158
59
  def initialize_copy(other)
159
- @signatures = other.signatures.dup
160
- @declarations = other.declarations.dup
161
-
60
+ @sources = other.sources.dup
162
61
  @class_decls = other.class_decls.dup
163
62
  @interface_decls = other.interface_decls.dup
164
63
  @type_alias_decls = other.type_alias_decls.dup
@@ -223,21 +122,17 @@ module RBS
223
122
  end
224
123
  end
225
124
 
226
- def class_entry(type_name)
227
- case
228
- when (class_entry = class_decls[type_name]).is_a?(ClassEntry)
229
- class_entry
230
- when (class_alias = class_alias_decls[type_name]).is_a?(ClassAliasEntry)
231
- class_alias
125
+ def class_entry(type_name, normalized: false)
126
+ case entry = constant_entry(type_name, normalized: normalized || false)
127
+ when ClassEntry, ClassAliasEntry
128
+ entry
232
129
  end
233
130
  end
234
131
 
235
- def module_entry(type_name)
236
- case
237
- when (module_entry = class_decls[type_name]).is_a?(ModuleEntry)
238
- module_entry
239
- when (module_alias = class_alias_decls[type_name]).is_a?(ModuleAliasEntry)
240
- module_alias
132
+ def module_entry(type_name, normalized: false)
133
+ case entry = constant_entry(type_name, normalized: normalized || false)
134
+ when ModuleEntry, ModuleAliasEntry
135
+ entry
241
136
  end
242
137
  end
243
138
 
@@ -253,26 +148,40 @@ module RBS
253
148
  end
254
149
 
255
150
  def normalized_module_entry(type_name)
256
- if name = normalize_module_name?(type_name)
257
- case entry = module_entry(name)
258
- when ModuleEntry, nil
259
- entry
260
- when ModuleAliasEntry
261
- raise
262
- end
263
- end
151
+ module_entry(type_name, normalized: true)
264
152
  end
265
153
 
266
- def module_class_entry(type_name)
267
- class_entry(type_name) || module_entry(type_name)
154
+ def module_class_entry(type_name, normalized: false)
155
+ entry = constant_entry(type_name, normalized: normalized || false)
156
+ if entry.is_a?(ConstantEntry)
157
+ nil
158
+ else
159
+ entry
160
+ end
268
161
  end
269
162
 
270
163
  def normalized_module_class_entry(type_name)
271
- normalized_class_entry(type_name) || normalized_module_entry(type_name)
164
+ module_class_entry(type_name, normalized: true)
272
165
  end
273
166
 
274
- def constant_entry(type_name)
275
- class_entry(type_name) || module_entry(type_name) || constant_decls[type_name]
167
+ def constant_entry(type_name, normalized: false)
168
+ if normalized
169
+ if normalized_name = normalize_module_name?(type_name)
170
+ class_decls.fetch(normalized_name, nil)
171
+ else
172
+ # The type_name may be declared with constant declaration
173
+ unless type_name.namespace.empty?
174
+ parent = type_name.namespace.to_type_name
175
+ normalized_parent = normalize_module_name?(parent) or return
176
+ constant_name = TypeName.new(name: type_name.name, namespace: normalized_parent.to_namespace)
177
+ constant_decls.fetch(constant_name, nil)
178
+ end
179
+ end
180
+ else
181
+ class_decls.fetch(type_name, nil) ||
182
+ class_alias_decls.fetch(type_name, nil) ||
183
+ constant_decls.fetch(type_name, nil)
184
+ end
276
185
  end
277
186
 
278
187
  def normalize_type_name?(name)
@@ -307,6 +216,10 @@ module RBS
307
216
  end
308
217
  end
309
218
 
219
+ def normalize_type_name(name)
220
+ normalize_type_name?(name) || name
221
+ end
222
+
310
223
  def normalized_type_name?(type_name)
311
224
  case
312
225
  when type_name.interface?
@@ -321,56 +234,47 @@ module RBS
321
234
  end
322
235
 
323
236
  def normalized_type_name!(name)
324
- normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`, which is normalized to `#{normalize_type_name?(name)}`"
237
+ normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`"
325
238
  name
326
239
  end
327
240
 
328
- def normalize_type_name(name)
329
- normalize_type_name?(name) || name
330
- end
331
-
332
- def normalize_module_name(name)
333
- normalize_module_name?(name) or name
334
- end
335
-
336
241
  def normalize_module_name?(name)
337
242
  raise "Class/module name is expected: #{name}" unless name.class?
338
243
  name = name.absolute! unless name.absolute?
339
244
 
340
- if @normalize_module_name_cache.key?(name)
341
- return @normalize_module_name_cache[name]
245
+ original_name = name
246
+
247
+ if @normalize_module_name_cache.key?(original_name)
248
+ return @normalize_module_name_cache[original_name]
342
249
  end
343
250
 
344
- unless name.namespace.empty?
345
- parent = name.namespace.to_type_name
346
- if normalized_parent = normalize_module_name?(parent)
347
- type_name = TypeName.new(namespace: normalized_parent.to_namespace, name: name.name)
348
- else
349
- @normalize_module_name_cache[name] = nil
350
- return
251
+ if alias_entry = class_alias_decls.fetch(name, nil)
252
+ unless alias_entry.decl.old_name.absolute?
253
+ # Having relative old_name means the type name resolution was failed.
254
+ # Run TypeNameResolver for failure reason
255
+ resolver = Resolver::TypeNameResolver.build(self)
256
+ name = resolver.resolve_namespace(name, context: nil)
257
+ @normalize_module_name_cache[original_name] = name
258
+ return name
351
259
  end
352
- else
353
- type_name = name
354
- end
355
260
 
356
- @normalize_module_name_cache[name] = false
261
+ name = alias_entry.decl.old_name
262
+ end
357
263
 
358
- entry = constant_entry(type_name)
264
+ if class_decls.key?(name)
265
+ @normalize_module_name_cache[original_name] = name
266
+ end
267
+ end
359
268
 
360
- normalized_type_name =
361
- case entry
362
- when ClassEntry, ModuleEntry
363
- type_name
364
- when ClassAliasEntry, ModuleAliasEntry
365
- normalize_module_name?(entry.decl.old_name)
366
- else
367
- nil
368
- end
269
+ def normalize_module_name(name)
270
+ normalize_module_name?(name) || name
271
+ end
369
272
 
370
- @normalize_module_name_cache[name] = normalized_type_name
273
+ def normalize_module_name!(name)
274
+ normalize_module_name?(name) or raise "Module name `#{name}` cannot be normalized"
371
275
  end
372
276
 
373
- def insert_decl(decl, outer:, namespace:)
277
+ def insert_rbs_decl(decl, context:, namespace:)
374
278
  case decl
375
279
  when AST::Declarations::Class, AST::Declarations::Module
376
280
  name = decl.name.with_prefix(namespace)
@@ -384,9 +288,9 @@ module RBS
384
288
  unless class_decls.key?(name)
385
289
  case decl
386
290
  when AST::Declarations::Class
387
- class_decls[name] ||= ClassEntry.new(name: name)
291
+ class_decls[name] ||= ClassEntry.new(name)
388
292
  when AST::Declarations::Module
389
- class_decls[name] ||= ModuleEntry.new(name: name)
293
+ class_decls[name] ||= ModuleEntry.new(name)
390
294
  end
391
295
  end
392
296
 
@@ -394,17 +298,17 @@ module RBS
394
298
 
395
299
  case
396
300
  when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
397
- existing_entry.insert(decl: decl, outer: outer)
301
+ existing_entry << [context, decl]
398
302
  when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
399
- existing_entry.insert(decl: decl, outer: outer)
303
+ existing_entry << [context, decl]
400
304
  else
401
- raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
305
+ raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary_decl)
402
306
  end
403
307
 
404
- prefix = outer + [decl]
405
- ns = name.to_namespace
308
+ inner_context = [context, name] #: Resolver::context
309
+ inner_namespace = name.to_namespace
406
310
  decl.each_decl do |d|
407
- insert_decl(d, outer: prefix, namespace: ns)
311
+ insert_rbs_decl(d, context: inner_context, namespace: inner_namespace)
408
312
  end
409
313
 
410
314
  when AST::Declarations::Interface
@@ -414,7 +318,7 @@ module RBS
414
318
  raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
415
319
  end
416
320
 
417
- interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, outer: outer)
321
+ interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, context: context)
418
322
 
419
323
  when AST::Declarations::TypeAlias
420
324
  name = decl.name.with_prefix(namespace)
@@ -423,7 +327,7 @@ module RBS
423
327
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
424
328
  end
425
329
 
426
- type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, outer: outer)
330
+ type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, context: context)
427
331
 
428
332
  when AST::Declarations::Constant
429
333
  name = decl.name.with_prefix(namespace)
@@ -433,18 +337,18 @@ module RBS
433
337
  when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
434
338
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
435
339
  when ClassEntry, ModuleEntry
436
- raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
340
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
437
341
  end
438
342
  end
439
343
 
440
- constant_decls[name] = ConstantEntry.new(name: name, decl: decl, outer: outer)
344
+ constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
441
345
 
442
346
  when AST::Declarations::Global
443
347
  if entry = global_decls[decl.name]
444
348
  raise DuplicatedDeclarationError.new(decl.name, decl, entry.decl)
445
349
  end
446
350
 
447
- global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, outer: outer)
351
+ global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, context: context)
448
352
 
449
353
  when AST::Declarations::ClassAlias, AST::Declarations::ModuleAlias
450
354
  name = decl.new_name.with_prefix(namespace)
@@ -454,35 +358,142 @@ module RBS
454
358
  when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
455
359
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
456
360
  when ClassEntry, ModuleEntry
457
- raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
361
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
458
362
  end
459
363
  end
460
364
 
461
365
  case decl
462
366
  when AST::Declarations::ClassAlias
463
- class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, outer: outer)
367
+ class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
464
368
  when AST::Declarations::ModuleAlias
465
- class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, outer: outer)
369
+ class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
370
+ end
371
+ end
372
+ end
373
+
374
+ def insert_ruby_decl(decl, context:, namespace:)
375
+ case decl
376
+ when AST::Ruby::Declarations::ClassDecl
377
+ name = decl.class_name.with_prefix(namespace)
378
+
379
+ if entry = constant_entry(name)
380
+ if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
381
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
382
+ end
383
+ if entry.is_a?(ModuleEntry)
384
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
385
+ end
386
+ else
387
+ entry = class_decls[name] = ClassEntry.new(name)
388
+ end
389
+
390
+ entry << [context, decl]
391
+
392
+ inner_context = [context, name] #: Resolver::context
393
+ decl.each_decl do |member|
394
+ insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
395
+ end
396
+
397
+ when AST::Ruby::Declarations::ModuleDecl
398
+ name = decl.module_name.with_prefix(namespace)
399
+
400
+ if entry = constant_entry(name)
401
+ if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
402
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
403
+ end
404
+ if entry.is_a?(ClassEntry)
405
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
406
+ end
407
+ else
408
+ entry = class_decls[name] = ModuleEntry.new(name)
409
+ end
410
+
411
+ entry << [context, decl]
412
+
413
+ inner_context = [context, name] #: Resolver::context
414
+ decl.each_decl do |member|
415
+ insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
416
+ end
417
+
418
+ when AST::Ruby::Declarations::ConstantDecl
419
+ name = decl.constant_name.with_prefix(namespace)
420
+
421
+ if entry = constant_entry(name)
422
+ case entry
423
+ when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
424
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
425
+ when ClassEntry, ModuleEntry
426
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
427
+ end
428
+ end
429
+
430
+ constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
431
+
432
+ when AST::Ruby::Declarations::ClassModuleAliasDecl
433
+ name = decl.new_name.with_prefix(namespace)
434
+
435
+ if entry = constant_entry(name)
436
+ case entry
437
+ when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
438
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
439
+ when ClassEntry, ModuleEntry
440
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
441
+ end
466
442
  end
443
+
444
+ case decl.annotation
445
+ when AST::Ruby::Annotations::ClassAliasAnnotation
446
+ class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
447
+ when AST::Ruby::Annotations::ModuleAliasAnnotation
448
+ class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
449
+ end
450
+ else
451
+ raise "Unknown Ruby declaration type: #{decl.class}"
467
452
  end
468
453
  end
469
454
 
470
- def <<(decl)
471
- declarations << decl
472
- insert_decl(decl, outer: [], namespace: Namespace.root)
473
- self
455
+ def add_source(source)
456
+ sources << source
457
+
458
+ case source
459
+ when Source::RBS
460
+ source.declarations.each do |decl|
461
+ insert_rbs_decl(decl, context: nil, namespace: Namespace.root)
462
+ end
463
+ when Source::Ruby
464
+ source.declarations.each do |dir|
465
+ insert_ruby_decl(dir, context: nil, namespace: Namespace.root)
466
+ end
467
+ end
474
468
  end
475
469
 
476
- def add_signature(buffer:, directives:, decls:)
477
- signatures[buffer] = [directives, decls]
478
- decls.each do |decl|
479
- self << decl
470
+ def each_rbs_source(&block)
471
+ if block
472
+ sources.each do |source|
473
+ if source.is_a?(Source::RBS)
474
+ yield source
475
+ end
476
+ end
477
+ else
478
+ enum_for(:each_rbs_source)
479
+ end
480
+ end
481
+
482
+ def each_ruby_source(&block)
483
+ if block
484
+ sources.each do |source|
485
+ if source.is_a?(Source::Ruby)
486
+ yield source
487
+ end
488
+ end
489
+ else
490
+ enum_for(:each_ruby_source)
480
491
  end
481
492
  end
482
493
 
483
494
  def validate_type_params
484
495
  class_decls.each_value do |decl|
485
- decl.primary
496
+ decl.validate_type_params
486
497
  end
487
498
  end
488
499
 
@@ -501,7 +512,7 @@ module RBS
501
512
  if only && !only.member?(decl)
502
513
  decl
503
514
  else
504
- resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
515
+ resolve_declaration(resolver, map, decl, context: nil, prefix: Namespace.root)
505
516
  end
506
517
  end
507
518
 
@@ -509,7 +520,7 @@ module RBS
509
520
  end
510
521
 
511
522
  def resolve_type_names(only: nil)
512
- resolver = Resolver::TypeNameResolver.new(self)
523
+ resolver = Resolver::TypeNameResolver.build(self)
513
524
  env = Environment.new
514
525
 
515
526
  table = UseMap::Table.new()
@@ -519,12 +530,30 @@ module RBS
519
530
  table.known_types.merge(interface_decls.keys)
520
531
  table.compute_children
521
532
 
522
- signatures.each do |buffer, (dirs, decls)|
523
- resolve = dirs.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
533
+ each_rbs_source do |source|
534
+ resolve = source.directives.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
524
535
  if !resolve || resolve.value
525
- _, decls = resolve_signature(resolver, table, dirs, decls)
536
+ _, decls = resolve_signature(resolver, table, source.directives, source.declarations, only: only)
537
+ else
538
+ decls = source.declarations
526
539
  end
527
- env.add_signature(buffer: buffer, directives: dirs, decls: decls)
540
+ env.add_source(Source::RBS.new(source.buffer, source.directives, decls))
541
+ end
542
+
543
+ each_ruby_source do |source|
544
+ decls = source.declarations.map do |decl|
545
+ if only
546
+ if only.include?(decl)
547
+ resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
548
+ else
549
+ decl
550
+ end
551
+ else
552
+ resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
553
+ end
554
+ end
555
+
556
+ env.add_source(Source::Ruby.new(source.buffer, source.prism_result, decls, source.diagnostics))
528
557
  end
529
558
 
530
559
  env
@@ -545,7 +574,7 @@ module RBS
545
574
  end
546
575
  end
547
576
 
548
- def resolve_declaration(resolver, map, decl, outer:, prefix:)
577
+ def resolve_declaration(resolver, map, decl, context:, prefix:)
549
578
  if decl.is_a?(AST::Declarations::Global)
550
579
  # @type var decl: AST::Declarations::Global
551
580
  return AST::Declarations::Global.new(
@@ -557,14 +586,11 @@ module RBS
557
586
  )
558
587
  end
559
588
 
560
- context = resolver_context(*outer)
561
-
562
589
  case decl
563
590
  when AST::Declarations::Class
564
591
  outer_context = context
565
592
  inner_context = append_context(outer_context, decl)
566
593
 
567
- outer_ = outer + [decl]
568
594
  prefix_ = prefix + decl.name.to_namespace
569
595
  AST::Declarations::Class.new(
570
596
  name: decl.name.with_prefix(prefix),
@@ -585,7 +611,7 @@ module RBS
585
611
  resolver,
586
612
  map,
587
613
  member,
588
- outer: outer_,
614
+ context: inner_context,
589
615
  prefix: prefix_
590
616
  )
591
617
  else
@@ -601,7 +627,6 @@ module RBS
601
627
  outer_context = context
602
628
  inner_context = append_context(outer_context, decl)
603
629
 
604
- outer_ = outer + [decl]
605
630
  prefix_ = prefix + decl.name.to_namespace
606
631
  AST::Declarations::Module.new(
607
632
  name: decl.name.with_prefix(prefix),
@@ -622,7 +647,7 @@ module RBS
622
647
  resolver,
623
648
  map,
624
649
  member,
625
- outer: outer_,
650
+ context: inner_context,
626
651
  prefix: prefix_
627
652
  )
628
653
  else
@@ -685,6 +710,155 @@ module RBS
685
710
  end
686
711
  end
687
712
 
713
+ def resolve_ruby_decl(resolver, decl, context:, prefix:)
714
+ case decl
715
+ when AST::Ruby::Declarations::ClassDecl
716
+ full_name = decl.class_name.with_prefix(prefix)
717
+ inner_context = [context, full_name] #: Resolver::context
718
+ inner_prefix = full_name.to_namespace
719
+
720
+ super_class = decl.super_class&.yield_self do |super_class|
721
+ AST::Ruby::Declarations::ClassDecl::SuperClass.new(
722
+ super_class.type_name_location,
723
+ super_class.operator_location,
724
+ absolute_type_name(resolver, nil, super_class.name, context: context),
725
+ super_class.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
726
+ )
727
+ end
728
+
729
+ AST::Ruby::Declarations::ClassDecl.new(decl.buffer, full_name, decl.node, super_class).tap do |resolved|
730
+ decl.members.each do |member|
731
+ case member
732
+ when AST::Ruby::Declarations::Base
733
+ resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
734
+ when AST::Ruby::Members::Base
735
+ resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
736
+ else
737
+ raise "Unknown member type: #{member.class}"
738
+ end
739
+ end
740
+ end
741
+
742
+ when AST::Ruby::Declarations::ModuleDecl
743
+ full_name = decl.module_name.with_prefix(prefix)
744
+ inner_context = [context, full_name] #: Resolver::context
745
+ inner_prefix = full_name.to_namespace
746
+
747
+ AST::Ruby::Declarations::ModuleDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
748
+ decl.members.each do |member|
749
+ case member
750
+ when AST::Ruby::Declarations::Base
751
+ resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
752
+ when AST::Ruby::Members::Base
753
+ resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
754
+ else
755
+ raise "Unknown member type: #{member.class}"
756
+ end
757
+ end
758
+ end
759
+
760
+ when AST::Ruby::Declarations::ConstantDecl
761
+ full_name = decl.constant_name.with_prefix(prefix)
762
+
763
+ AST::Ruby::Declarations::ConstantDecl.new(
764
+ decl.buffer,
765
+ full_name,
766
+ decl.node,
767
+ decl.leading_comment,
768
+ decl.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
769
+ )
770
+
771
+ when AST::Ruby::Declarations::ClassModuleAliasDecl
772
+ full_name = decl.new_name.with_prefix(prefix)
773
+ resolved_annotation = decl.annotation.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
774
+ resolved_infered_name = decl.infered_old_name&.yield_self {|name| absolute_type_name(resolver, nil, name, context: context) }
775
+
776
+ AST::Ruby::Declarations::ClassModuleAliasDecl.new(
777
+ decl.buffer,
778
+ decl.node,
779
+ full_name,
780
+ resolved_infered_name,
781
+ decl.leading_comment,
782
+ resolved_annotation
783
+ )
784
+
785
+ else
786
+ raise "Unknown declaration type: #{decl.class}"
787
+ end
788
+ end
789
+
790
+ def resolve_ruby_member(resolver, member, context:)
791
+ case member
792
+ when AST::Ruby::Members::DefMember
793
+ AST::Ruby::Members::DefMember.new(
794
+ member.buffer,
795
+ member.name,
796
+ member.node,
797
+ member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) },
798
+ member.leading_comment
799
+ )
800
+ when AST::Ruby::Members::IncludeMember
801
+ resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
802
+ AST::Ruby::Members::IncludeMember.new(
803
+ member.buffer,
804
+ member.node,
805
+ absolute_type_name(resolver, nil, member.module_name, context: context),
806
+ resolved_annotation
807
+ )
808
+ when AST::Ruby::Members::ExtendMember
809
+ resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
810
+ AST::Ruby::Members::ExtendMember.new(
811
+ member.buffer,
812
+ member.node,
813
+ absolute_type_name(resolver, nil, member.module_name, context: context),
814
+ resolved_annotation
815
+ )
816
+ when AST::Ruby::Members::PrependMember
817
+ resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
818
+ AST::Ruby::Members::PrependMember.new(
819
+ member.buffer,
820
+ member.node,
821
+ absolute_type_name(resolver, nil, member.module_name, context: context),
822
+ resolved_annotation
823
+ )
824
+ when AST::Ruby::Members::AttrReaderMember
825
+ resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
826
+ AST::Ruby::Members::AttrReaderMember.new(
827
+ member.buffer,
828
+ member.node,
829
+ member.name_nodes,
830
+ member.leading_comment,
831
+ resolved_type_annotation
832
+ )
833
+ when AST::Ruby::Members::AttrWriterMember
834
+ resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
835
+ AST::Ruby::Members::AttrWriterMember.new(
836
+ member.buffer,
837
+ member.node,
838
+ member.name_nodes,
839
+ member.leading_comment,
840
+ resolved_type_annotation
841
+ )
842
+ when AST::Ruby::Members::AttrAccessorMember
843
+ resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
844
+ AST::Ruby::Members::AttrAccessorMember.new(
845
+ member.buffer,
846
+ member.node,
847
+ member.name_nodes,
848
+ member.leading_comment,
849
+ resolved_type_annotation
850
+ )
851
+ when AST::Ruby::Members::InstanceVariableMember
852
+ resolved_annotation = member.annotation.map_type_name {|name| absolute_type_name(resolver, nil, name, context: context) }
853
+ AST::Ruby::Members::InstanceVariableMember.new(
854
+ member.buffer,
855
+ resolved_annotation
856
+ )
857
+ else
858
+ raise "Unknown member type: #{member.class}"
859
+ end
860
+ end
861
+
688
862
  def resolve_member(resolver, map, member, context:)
689
863
  case member
690
864
  when AST::Members::MethodDefinition
@@ -800,7 +974,7 @@ module RBS
800
974
  end
801
975
 
802
976
  def absolute_type_name(resolver, map, type_name, context:)
803
- type_name = map.resolve(type_name)
977
+ type_name = map.resolve(type_name) if map
804
978
  resolver.resolve(type_name, context: context) || type_name
805
979
  end
806
980
 
@@ -811,20 +985,34 @@ module RBS
811
985
  end
812
986
 
813
987
  def inspect
814
- ivars = %i[@declarations @class_decls @class_alias_decls @interface_decls @type_alias_decls @constant_decls @global_decls]
988
+ ivars = %i[@sources @class_decls @class_alias_decls @interface_decls @type_alias_decls @constant_decls @global_decls]
815
989
  "\#<RBS::Environment #{ivars.map { |iv| "#{iv}=(#{instance_variable_get(iv).size} items)"}.join(' ')}>"
816
990
  end
817
991
 
818
992
  def buffers
819
- signatures.keys
993
+ sources.map(&:buffer)
820
994
  end
821
995
 
822
- def unload(buffers)
823
- env = Environment.new
996
+ def unload(paths)
997
+ ps = Set[]
998
+ paths.each do |path|
999
+ if path.is_a?(Buffer)
1000
+ ps << path.name
1001
+ else
1002
+ ps << path
1003
+ end
1004
+ end
1005
+
1006
+ env = Environment.new()
1007
+
1008
+ each_rbs_source do |source|
1009
+ next if ps.include?(source.buffer.name)
1010
+ env.add_source(source)
1011
+ end
824
1012
 
825
- signatures.each do |buf, (dirs, decls)|
826
- next if buffers.include?(buf)
827
- env.add_signature(buffer: buf, directives: dirs, decls: decls)
1013
+ each_ruby_source do |source|
1014
+ next if ps.include?(source.buffer.name)
1015
+ env.add_source(source)
828
1016
  end
829
1017
 
830
1018
  env