rbs 3.10.4 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +7 -5
  5. data/.github/workflows/comments.yml +2 -2
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +16 -26
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +1 -1
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +2 -2
  12. data/.vscode/extensions.json +5 -0
  13. data/.vscode/settings.json +19 -0
  14. data/CHANGELOG.md +202 -2
  15. data/Rakefile +9 -23
  16. data/Steepfile +2 -0
  17. data/config.yml +457 -13
  18. data/core/array.rbs +218 -188
  19. data/core/basic_object.rbs +9 -8
  20. data/core/binding.rbs +0 -2
  21. data/core/builtin.rbs +2 -2
  22. data/core/class.rbs +6 -5
  23. data/core/comparable.rbs +45 -31
  24. data/core/complex.rbs +66 -55
  25. data/core/dir.rbs +57 -45
  26. data/core/encoding.rbs +6 -6
  27. data/core/enumerable.rbs +105 -91
  28. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  29. data/core/enumerator.rbs +24 -3
  30. data/core/errno.rbs +3 -2
  31. data/core/errors.rbs +31 -29
  32. data/core/exception.rbs +12 -12
  33. data/core/fiber.rbs +47 -36
  34. data/core/file.rbs +242 -169
  35. data/core/file_test.rbs +2 -2
  36. data/core/float.rbs +42 -68
  37. data/core/gc.rbs +78 -70
  38. data/core/hash.rbs +70 -60
  39. data/core/integer.rbs +32 -75
  40. data/core/io/buffer.rbs +36 -36
  41. data/core/io/wait.rbs +7 -7
  42. data/core/io.rbs +192 -146
  43. data/core/kernel.rbs +198 -147
  44. data/core/marshal.rbs +3 -3
  45. data/core/match_data.rbs +14 -12
  46. data/core/math.rbs +69 -67
  47. data/core/method.rbs +6 -8
  48. data/core/module.rbs +148 -88
  49. data/core/nil_class.rbs +4 -3
  50. data/core/numeric.rbs +53 -50
  51. data/core/object.rbs +6 -8
  52. data/core/object_space.rbs +11 -10
  53. data/core/pathname.rbs +131 -81
  54. data/core/proc.rbs +65 -34
  55. data/core/process.rbs +221 -201
  56. data/core/ractor.rbs +15 -11
  57. data/core/random.rbs +21 -3
  58. data/core/range.rbs +152 -49
  59. data/core/rational.rbs +5 -56
  60. data/core/rbs/unnamed/argf.rbs +58 -51
  61. data/core/rbs/unnamed/env_class.rbs +18 -13
  62. data/core/rbs/unnamed/main_class.rbs +123 -0
  63. data/core/rbs/unnamed/random.rbs +7 -116
  64. data/core/regexp.rbs +236 -197
  65. data/core/ruby.rbs +1 -1
  66. data/core/ruby_vm.rbs +32 -30
  67. data/core/rubygems/config_file.rbs +5 -5
  68. data/core/rubygems/errors.rbs +1 -1
  69. data/core/rubygems/requirement.rbs +5 -5
  70. data/core/rubygems/rubygems.rbs +5 -3
  71. data/core/set.rbs +17 -16
  72. data/core/signal.rbs +2 -2
  73. data/core/string.rbs +318 -298
  74. data/core/struct.rbs +26 -25
  75. data/core/symbol.rbs +25 -24
  76. data/core/thread.rbs +40 -41
  77. data/core/time.rbs +47 -42
  78. data/core/trace_point.rbs +34 -31
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +10 -10
  81. data/core/warning.rbs +7 -7
  82. data/docs/collection.md +1 -1
  83. data/docs/config.md +171 -0
  84. data/docs/inline.md +576 -0
  85. data/docs/syntax.md +46 -16
  86. data/docs/type_fingerprint.md +21 -0
  87. data/exe/rbs +1 -1
  88. data/ext/rbs_extension/ast_translation.c +595 -98
  89. data/ext/rbs_extension/class_constants.c +30 -0
  90. data/ext/rbs_extension/class_constants.h +15 -0
  91. data/ext/rbs_extension/legacy_location.c +30 -53
  92. data/ext/rbs_extension/legacy_location.h +37 -0
  93. data/ext/rbs_extension/main.c +125 -24
  94. data/include/rbs/ast.h +485 -150
  95. data/include/rbs/lexer.h +11 -4
  96. data/include/rbs/location.h +25 -44
  97. data/include/rbs/parser.h +20 -2
  98. data/include/rbs/util/rbs_constant_pool.h +0 -3
  99. data/include/rbs.h +8 -0
  100. data/lib/rbs/ast/annotation.rb +1 -1
  101. data/lib/rbs/ast/comment.rb +1 -1
  102. data/lib/rbs/ast/declarations.rb +10 -10
  103. data/lib/rbs/ast/members.rb +14 -14
  104. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  105. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  106. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  107. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  108. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  109. data/lib/rbs/ast/ruby/members.rb +723 -0
  110. data/lib/rbs/ast/type_param.rb +24 -4
  111. data/lib/rbs/buffer.rb +105 -20
  112. data/lib/rbs/cli/diff.rb +16 -15
  113. data/lib/rbs/cli/validate.rb +62 -125
  114. data/lib/rbs/cli.rb +55 -23
  115. data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
  116. data/lib/rbs/collection/sources/git.rb +1 -0
  117. data/lib/rbs/collection.rb +0 -1
  118. data/lib/rbs/definition.rb +6 -1
  119. data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
  120. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  121. data/lib/rbs/definition_builder.rb +177 -20
  122. data/lib/rbs/diff.rb +7 -1
  123. data/lib/rbs/environment/class_entry.rb +69 -0
  124. data/lib/rbs/environment/module_entry.rb +66 -0
  125. data/lib/rbs/environment.rb +338 -155
  126. data/lib/rbs/environment_loader.rb +2 -2
  127. data/lib/rbs/errors.rb +30 -20
  128. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  129. data/lib/rbs/inline_parser.rb +542 -0
  130. data/lib/rbs/location_aux.rb +36 -4
  131. data/lib/rbs/locator.rb +5 -1
  132. data/lib/rbs/method_type.rb +5 -3
  133. data/lib/rbs/namespace.rb +0 -7
  134. data/lib/rbs/parser_aux.rb +31 -8
  135. data/lib/rbs/prototype/helpers.rb +57 -0
  136. data/lib/rbs/prototype/rb.rb +3 -28
  137. data/lib/rbs/prototype/rbi.rb +3 -20
  138. data/lib/rbs/prototype/runtime.rb +10 -2
  139. data/lib/rbs/resolver/type_name_resolver.rb +0 -8
  140. data/lib/rbs/source.rb +99 -0
  141. data/lib/rbs/subtractor.rb +4 -3
  142. data/lib/rbs/test/type_check.rb +5 -2
  143. data/lib/rbs/type_name.rb +1 -8
  144. data/lib/rbs/types.rb +88 -78
  145. data/lib/rbs/unit_test/convertibles.rb +1 -0
  146. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  147. data/lib/rbs/validator.rb +2 -2
  148. data/lib/rbs/version.rb +1 -1
  149. data/lib/rbs.rb +12 -1
  150. data/rbs.gemspec +3 -2
  151. data/rust/.gitignore +1 -0
  152. data/rust/Cargo.lock +378 -0
  153. data/rust/Cargo.toml +7 -0
  154. data/rust/ruby-rbs/Cargo.toml +22 -0
  155. data/rust/ruby-rbs/build.rs +764 -0
  156. data/rust/ruby-rbs/examples/locations.rs +60 -0
  157. data/rust/ruby-rbs/src/lib.rs +1 -0
  158. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  159. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  160. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  161. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  162. data/rust/ruby-rbs-sys/build.rs +204 -0
  163. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  164. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  165. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  166. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  167. data/schema/typeParam.json +17 -1
  168. data/sig/ancestor_builder.rbs +1 -1
  169. data/sig/ast/ruby/annotations.rbs +421 -0
  170. data/sig/ast/ruby/comment_block.rbs +127 -0
  171. data/sig/ast/ruby/declarations.rbs +158 -0
  172. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  173. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  174. data/sig/ast/ruby/members.rbs +178 -0
  175. data/sig/buffer.rbs +63 -5
  176. data/sig/cli/diff.rbs +5 -11
  177. data/sig/cli/validate.rbs +12 -8
  178. data/sig/cli.rbs +18 -18
  179. data/sig/definition.rbs +6 -0
  180. data/sig/definition_builder.rbs +3 -1
  181. data/sig/environment/class_entry.rbs +50 -0
  182. data/sig/environment/module_entry.rbs +50 -0
  183. data/sig/environment.rbs +37 -81
  184. data/sig/errors.rbs +26 -20
  185. data/sig/inline_parser/comment_association.rbs +71 -0
  186. data/sig/inline_parser.rbs +124 -0
  187. data/sig/location.rbs +32 -7
  188. data/sig/locator.rbs +0 -2
  189. data/sig/method_builder.rbs +9 -4
  190. data/sig/namespace.rbs +0 -5
  191. data/sig/parser.rbs +47 -13
  192. data/sig/prototype/helpers.rbs +2 -0
  193. data/sig/resolver/type_name_resolver.rbs +0 -3
  194. data/sig/source.rbs +48 -0
  195. data/sig/type_param.rbs +13 -8
  196. data/sig/typename.rbs +0 -5
  197. data/sig/types.rbs +6 -7
  198. data/sig/unit_test/spy.rbs +0 -8
  199. data/sig/unit_test/type_assertions.rbs +11 -0
  200. data/src/ast.c +491 -143
  201. data/src/lexer.c +1552 -1314
  202. data/src/lexer.re +7 -0
  203. data/src/lexstate.c +8 -1
  204. data/src/location.c +8 -48
  205. data/src/parser.c +1107 -409
  206. data/src/util/rbs_constant_pool.c +0 -4
  207. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
  208. data/stdlib/cgi-escape/0/escape.rbs +4 -4
  209. data/stdlib/coverage/0/coverage.rbs +4 -3
  210. data/stdlib/date/0/date.rbs +33 -28
  211. data/stdlib/date/0/date_time.rbs +24 -23
  212. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  213. data/stdlib/digest/0/digest.rbs +110 -0
  214. data/stdlib/erb/0/erb.rbs +64 -53
  215. data/stdlib/etc/0/etc.rbs +55 -50
  216. data/stdlib/fileutils/0/fileutils.rbs +140 -126
  217. data/stdlib/forwardable/0/forwardable.rbs +10 -10
  218. data/stdlib/io-console/0/io-console.rbs +2 -2
  219. data/stdlib/json/0/json.rbs +158 -131
  220. data/stdlib/monitor/0/monitor.rbs +3 -3
  221. data/stdlib/net-http/0/net-http.rbs +159 -134
  222. data/stdlib/objspace/0/objspace.rbs +8 -30
  223. data/stdlib/open-uri/0/open-uri.rbs +8 -8
  224. data/stdlib/open3/0/open3.rbs +469 -10
  225. data/stdlib/openssl/0/openssl.rbs +144 -129
  226. data/stdlib/optparse/0/optparse.rbs +23 -14
  227. data/stdlib/pathname/0/pathname.rbs +2 -2
  228. data/stdlib/pp/0/pp.rbs +9 -8
  229. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  230. data/stdlib/pstore/0/pstore.rbs +35 -30
  231. data/stdlib/psych/0/psych.rbs +62 -9
  232. data/stdlib/psych/0/store.rbs +2 -4
  233. data/stdlib/pty/0/pty.rbs +9 -6
  234. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  235. data/stdlib/rdoc/0/code_object.rbs +2 -1
  236. data/stdlib/rdoc/0/parser.rbs +1 -1
  237. data/stdlib/rdoc/0/store.rbs +1 -1
  238. data/stdlib/ripper/0/ripper.rbs +20 -17
  239. data/stdlib/securerandom/0/manifest.yaml +2 -0
  240. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  241. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  242. data/stdlib/socket/0/addrinfo.rbs +9 -9
  243. data/stdlib/socket/0/basic_socket.rbs +3 -3
  244. data/stdlib/socket/0/ip_socket.rbs +10 -8
  245. data/stdlib/socket/0/socket.rbs +10 -9
  246. data/stdlib/socket/0/tcp_server.rbs +1 -1
  247. data/stdlib/socket/0/tcp_socket.rbs +1 -1
  248. data/stdlib/socket/0/udp_socket.rbs +1 -1
  249. data/stdlib/socket/0/unix_server.rbs +1 -1
  250. data/stdlib/stringio/0/stringio.rbs +55 -54
  251. data/stdlib/strscan/0/string_scanner.rbs +46 -44
  252. data/stdlib/tempfile/0/tempfile.rbs +24 -20
  253. data/stdlib/time/0/time.rbs +7 -5
  254. data/stdlib/tsort/0/tsort.rbs +7 -6
  255. data/stdlib/uri/0/common.rbs +31 -18
  256. data/stdlib/uri/0/file.rbs +2 -2
  257. data/stdlib/uri/0/generic.rbs +9 -2
  258. data/stdlib/uri/0/http.rbs +2 -2
  259. data/stdlib/uri/0/ldap.rbs +2 -2
  260. data/stdlib/uri/0/mailto.rbs +3 -3
  261. data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
  262. data/stdlib/zlib/0/deflate.rbs +4 -3
  263. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  264. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  265. data/stdlib/zlib/0/inflate.rbs +1 -1
  266. data/stdlib/zlib/0/need_dict.rbs +1 -1
  267. metadata +66 -3
@@ -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
12
+ attr_reader :sources
59
13
 
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
79
-
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
@@ -375,7 +274,7 @@ module RBS
375
274
  normalize_module_name?(name) or raise "Module name `#{name}` cannot be normalized"
376
275
  end
377
276
 
378
- def insert_decl(decl, outer:, namespace:)
277
+ def insert_rbs_decl(decl, context:, namespace:)
379
278
  case decl
380
279
  when AST::Declarations::Class, AST::Declarations::Module
381
280
  name = decl.name.with_prefix(namespace)
@@ -389,9 +288,9 @@ module RBS
389
288
  unless class_decls.key?(name)
390
289
  case decl
391
290
  when AST::Declarations::Class
392
- class_decls[name] ||= ClassEntry.new(name: name)
291
+ class_decls[name] ||= ClassEntry.new(name)
393
292
  when AST::Declarations::Module
394
- class_decls[name] ||= ModuleEntry.new(name: name)
293
+ class_decls[name] ||= ModuleEntry.new(name)
395
294
  end
396
295
  end
397
296
 
@@ -399,17 +298,17 @@ module RBS
399
298
 
400
299
  case
401
300
  when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
402
- existing_entry.insert(decl: decl, outer: outer)
301
+ existing_entry << [context, decl]
403
302
  when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
404
- existing_entry.insert(decl: decl, outer: outer)
303
+ existing_entry << [context, decl]
405
304
  else
406
- raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
305
+ raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary_decl)
407
306
  end
408
307
 
409
- prefix = outer + [decl]
410
- ns = name.to_namespace
308
+ inner_context = [context, name] #: Resolver::context
309
+ inner_namespace = name.to_namespace
411
310
  decl.each_decl do |d|
412
- insert_decl(d, outer: prefix, namespace: ns)
311
+ insert_rbs_decl(d, context: inner_context, namespace: inner_namespace)
413
312
  end
414
313
 
415
314
  when AST::Declarations::Interface
@@ -419,7 +318,7 @@ module RBS
419
318
  raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
420
319
  end
421
320
 
422
- interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, outer: outer)
321
+ interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, context: context)
423
322
 
424
323
  when AST::Declarations::TypeAlias
425
324
  name = decl.name.with_prefix(namespace)
@@ -428,7 +327,7 @@ module RBS
428
327
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
429
328
  end
430
329
 
431
- 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)
432
331
 
433
332
  when AST::Declarations::Constant
434
333
  name = decl.name.with_prefix(namespace)
@@ -438,18 +337,18 @@ module RBS
438
337
  when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
439
338
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
440
339
  when ClassEntry, ModuleEntry
441
- raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
340
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
442
341
  end
443
342
  end
444
343
 
445
- constant_decls[name] = ConstantEntry.new(name: name, decl: decl, outer: outer)
344
+ constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
446
345
 
447
346
  when AST::Declarations::Global
448
347
  if entry = global_decls[decl.name]
449
348
  raise DuplicatedDeclarationError.new(decl.name, decl, entry.decl)
450
349
  end
451
350
 
452
- 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)
453
352
 
454
353
  when AST::Declarations::ClassAlias, AST::Declarations::ModuleAlias
455
354
  name = decl.new_name.with_prefix(namespace)
@@ -459,35 +358,142 @@ module RBS
459
358
  when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
460
359
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
461
360
  when ClassEntry, ModuleEntry
462
- raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
361
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
463
362
  end
464
363
  end
465
364
 
466
365
  case decl
467
366
  when AST::Declarations::ClassAlias
468
- 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)
469
368
  when AST::Declarations::ModuleAlias
470
- 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
471
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}"
472
452
  end
473
453
  end
474
454
 
475
- def <<(decl)
476
- declarations << decl
477
- insert_decl(decl, outer: [], namespace: Namespace.root)
478
- 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
479
468
  end
480
469
 
481
- def add_signature(buffer:, directives:, decls:)
482
- signatures[buffer] = [directives, decls]
483
- decls.each do |decl|
484
- 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)
485
491
  end
486
492
  end
487
493
 
488
494
  def validate_type_params
489
495
  class_decls.each_value do |decl|
490
- decl.primary
496
+ decl.validate_type_params
491
497
  end
492
498
  end
493
499
 
@@ -506,7 +512,7 @@ module RBS
506
512
  if only && !only.member?(decl)
507
513
  decl
508
514
  else
509
- resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
515
+ resolve_declaration(resolver, map, decl, context: nil, prefix: Namespace.root)
510
516
  end
511
517
  end
512
518
 
@@ -524,12 +530,30 @@ module RBS
524
530
  table.known_types.merge(interface_decls.keys)
525
531
  table.compute_children
526
532
 
527
- signatures.each do |buffer, (dirs, decls)|
528
- 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?
529
535
  if !resolve || resolve.value
530
- _, 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
539
+ end
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
531
554
  end
532
- env.add_signature(buffer: buffer, directives: dirs, decls: decls)
555
+
556
+ env.add_source(Source::Ruby.new(source.buffer, source.prism_result, decls, source.diagnostics))
533
557
  end
534
558
 
535
559
  env
@@ -550,7 +574,7 @@ module RBS
550
574
  end
551
575
  end
552
576
 
553
- def resolve_declaration(resolver, map, decl, outer:, prefix:)
577
+ def resolve_declaration(resolver, map, decl, context:, prefix:)
554
578
  if decl.is_a?(AST::Declarations::Global)
555
579
  # @type var decl: AST::Declarations::Global
556
580
  return AST::Declarations::Global.new(
@@ -562,14 +586,11 @@ module RBS
562
586
  )
563
587
  end
564
588
 
565
- context = resolver_context(*outer)
566
-
567
589
  case decl
568
590
  when AST::Declarations::Class
569
591
  outer_context = context
570
592
  inner_context = append_context(outer_context, decl)
571
593
 
572
- outer_ = outer + [decl]
573
594
  prefix_ = prefix + decl.name.to_namespace
574
595
  AST::Declarations::Class.new(
575
596
  name: decl.name.with_prefix(prefix),
@@ -590,7 +611,7 @@ module RBS
590
611
  resolver,
591
612
  map,
592
613
  member,
593
- outer: outer_,
614
+ context: inner_context,
594
615
  prefix: prefix_
595
616
  )
596
617
  else
@@ -606,7 +627,6 @@ module RBS
606
627
  outer_context = context
607
628
  inner_context = append_context(outer_context, decl)
608
629
 
609
- outer_ = outer + [decl]
610
630
  prefix_ = prefix + decl.name.to_namespace
611
631
  AST::Declarations::Module.new(
612
632
  name: decl.name.with_prefix(prefix),
@@ -627,7 +647,7 @@ module RBS
627
647
  resolver,
628
648
  map,
629
649
  member,
630
- outer: outer_,
650
+ context: inner_context,
631
651
  prefix: prefix_
632
652
  )
633
653
  else
@@ -690,6 +710,155 @@ module RBS
690
710
  end
691
711
  end
692
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
+
693
862
  def resolve_member(resolver, map, member, context:)
694
863
  case member
695
864
  when AST::Members::MethodDefinition
@@ -805,7 +974,7 @@ module RBS
805
974
  end
806
975
 
807
976
  def absolute_type_name(resolver, map, type_name, context:)
808
- type_name = map.resolve(type_name)
977
+ type_name = map.resolve(type_name) if map
809
978
  resolver.resolve(type_name, context: context) || type_name
810
979
  end
811
980
 
@@ -816,20 +985,34 @@ module RBS
816
985
  end
817
986
 
818
987
  def inspect
819
- 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]
820
989
  "\#<RBS::Environment #{ivars.map { |iv| "#{iv}=(#{instance_variable_get(iv).size} items)"}.join(' ')}>"
821
990
  end
822
991
 
823
992
  def buffers
824
- signatures.keys
993
+ sources.map(&:buffer)
825
994
  end
826
995
 
827
- def unload(buffers)
828
- 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
829
1012
 
830
- signatures.each do |buf, (dirs, decls)|
831
- next if buffers.include?(buf)
832
- 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)
833
1016
  end
834
1017
 
835
1018
  env
@@ -116,7 +116,7 @@ module RBS
116
116
  decls.each do |decl|
117
117
  loaded << [decl, path, source]
118
118
  end
119
- env.add_signature(buffer: buffer, directives: dirs, decls: decls)
119
+ env.add_source(Source::RBS.new(buffer, dirs, decls))
120
120
  end
121
121
 
122
122
  loaded
@@ -155,7 +155,7 @@ module RBS
155
155
  next if files.include?(path)
156
156
 
157
157
  files << path
158
- buffer = Buffer.new(name: path.to_s, content: path.read(encoding: "UTF-8"))
158
+ buffer = Buffer.new(name: path, content: path.read(encoding: "UTF-8"))
159
159
 
160
160
  _, dirs, decls = Parser.parse_signature(buffer)
161
161