rbs 3.10.0 → 4.0.0.dev.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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/comments.yml +3 -3
  3. data/.github/workflows/ruby.yml +24 -35
  4. data/.github/workflows/typecheck.yml +3 -1
  5. data/.github/workflows/windows.yml +2 -2
  6. data/.gitignore +0 -4
  7. data/CHANGELOG.md +0 -88
  8. data/README.md +1 -38
  9. data/Rakefile +20 -142
  10. data/Steepfile +1 -0
  11. data/config.yml +43 -1
  12. data/core/array.rbs +46 -100
  13. data/core/complex.rbs +21 -32
  14. data/core/dir.rbs +2 -2
  15. data/core/encoding.rbs +9 -6
  16. data/core/enumerable.rbs +3 -90
  17. data/core/enumerator.rbs +1 -18
  18. data/core/errno.rbs +0 -8
  19. data/core/errors.rbs +1 -28
  20. data/core/exception.rbs +2 -2
  21. data/core/fiber.rbs +4 -5
  22. data/core/file.rbs +12 -27
  23. data/core/file_test.rbs +1 -1
  24. data/core/float.rbs +22 -209
  25. data/core/gc.rbs +281 -417
  26. data/core/hash.rbs +727 -1024
  27. data/core/integer.rbs +38 -78
  28. data/core/io/buffer.rbs +7 -18
  29. data/core/io/wait.rbs +33 -11
  30. data/core/io.rbs +12 -14
  31. data/core/kernel.rbs +51 -57
  32. data/core/marshal.rbs +1 -1
  33. data/core/match_data.rbs +1 -1
  34. data/core/math.rbs +3 -42
  35. data/core/method.rbs +6 -14
  36. data/core/module.rbs +17 -88
  37. data/core/nil_class.rbs +3 -3
  38. data/core/numeric.rbs +16 -16
  39. data/core/object.rbs +3 -3
  40. data/core/object_space.rbs +15 -21
  41. data/core/proc.rbs +8 -15
  42. data/core/process.rbs +2 -2
  43. data/core/ractor.rbs +437 -278
  44. data/core/range.rbs +8 -7
  45. data/core/rational.rbs +24 -37
  46. data/core/rbs/unnamed/argf.rbs +2 -2
  47. data/core/rbs/unnamed/env_class.rbs +1 -1
  48. data/core/rbs/unnamed/random.rbs +2 -4
  49. data/core/regexp.rbs +20 -25
  50. data/core/ruby_vm.rbs +4 -6
  51. data/core/rubygems/errors.rbs +70 -3
  52. data/core/rubygems/rubygems.rbs +79 -11
  53. data/core/rubygems/version.rbs +3 -2
  54. data/core/set.rbs +359 -488
  55. data/core/string.rbs +1228 -3153
  56. data/core/struct.rbs +1 -1
  57. data/core/symbol.rbs +4 -4
  58. data/core/thread.rbs +29 -92
  59. data/core/time.rbs +9 -35
  60. data/core/trace_point.rbs +4 -7
  61. data/core/unbound_method.rbs +6 -14
  62. data/docs/collection.md +2 -2
  63. data/docs/gem.md +1 -0
  64. data/docs/sigs.md +3 -3
  65. data/ext/rbs_extension/ast_translation.c +1077 -944
  66. data/ext/rbs_extension/ast_translation.h +0 -7
  67. data/ext/rbs_extension/class_constants.c +83 -71
  68. data/ext/rbs_extension/class_constants.h +7 -4
  69. data/ext/rbs_extension/extconf.rb +2 -24
  70. data/ext/rbs_extension/legacy_location.c +172 -173
  71. data/ext/rbs_extension/legacy_location.h +3 -8
  72. data/ext/rbs_extension/main.c +289 -239
  73. data/ext/rbs_extension/rbs_extension.h +0 -3
  74. data/ext/rbs_extension/rbs_string_bridging.h +0 -4
  75. data/include/rbs/ast.h +98 -37
  76. data/include/rbs/defines.h +12 -38
  77. data/include/rbs/lexer.h +114 -126
  78. data/include/rbs/location.h +14 -14
  79. data/include/rbs/parser.h +37 -21
  80. data/include/rbs/string.h +5 -3
  81. data/include/rbs/util/rbs_allocator.h +19 -40
  82. data/include/rbs/util/rbs_assert.h +1 -12
  83. data/include/rbs/util/rbs_constant_pool.h +3 -3
  84. data/include/rbs/util/rbs_encoding.h +1 -3
  85. data/include/rbs/util/rbs_unescape.h +1 -2
  86. data/lib/rbs/ast/ruby/annotations.rb +119 -0
  87. data/lib/rbs/ast/ruby/comment_block.rb +221 -0
  88. data/lib/rbs/ast/ruby/declarations.rb +86 -0
  89. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
  90. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  91. data/lib/rbs/ast/ruby/members.rb +213 -0
  92. data/lib/rbs/buffer.rb +104 -24
  93. data/lib/rbs/cli/validate.rb +40 -35
  94. data/lib/rbs/cli.rb +5 -6
  95. data/lib/rbs/collection/config/lockfile_generator.rb +0 -1
  96. data/lib/rbs/collection.rb +0 -1
  97. data/lib/rbs/definition.rb +6 -1
  98. data/lib/rbs/definition_builder/ancestor_builder.rb +65 -62
  99. data/lib/rbs/definition_builder/method_builder.rb +45 -30
  100. data/lib/rbs/definition_builder.rb +44 -9
  101. data/lib/rbs/environment/class_entry.rb +69 -0
  102. data/lib/rbs/environment/module_entry.rb +66 -0
  103. data/lib/rbs/environment.rb +244 -218
  104. data/lib/rbs/environment_loader.rb +3 -3
  105. data/lib/rbs/errors.rb +5 -4
  106. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  107. data/lib/rbs/inline_parser.rb +206 -0
  108. data/lib/rbs/location_aux.rb +35 -3
  109. data/lib/rbs/parser_aux.rb +11 -6
  110. data/lib/rbs/prototype/runtime.rb +2 -2
  111. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  112. data/lib/rbs/resolver/type_name_resolver.rb +38 -124
  113. data/lib/rbs/source.rb +99 -0
  114. data/lib/rbs/subtractor.rb +4 -3
  115. data/lib/rbs/test/type_check.rb +0 -14
  116. data/lib/rbs/types.rb +1 -3
  117. data/lib/rbs/version.rb +1 -1
  118. data/lib/rbs.rb +13 -1
  119. data/lib/rdoc/discover.rb +1 -1
  120. data/lib/rdoc_plugin/parser.rb +1 -1
  121. data/rbs.gemspec +1 -0
  122. data/sig/ancestor_builder.rbs +1 -1
  123. data/sig/ast/ruby/annotations.rbs +110 -0
  124. data/sig/ast/ruby/comment_block.rbs +119 -0
  125. data/sig/ast/ruby/declarations.rbs +60 -0
  126. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  127. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  128. data/sig/ast/ruby/members.rbs +72 -0
  129. data/sig/buffer.rbs +63 -5
  130. data/sig/definition.rbs +1 -0
  131. data/sig/definition_builder.rbs +1 -1
  132. data/sig/environment/class_entry.rbs +50 -0
  133. data/sig/environment/module_entry.rbs +50 -0
  134. data/sig/environment.rbs +28 -133
  135. data/sig/errors.rbs +13 -6
  136. data/sig/inline_parser/comment_association.rbs +71 -0
  137. data/sig/inline_parser.rbs +87 -0
  138. data/sig/location.rbs +32 -7
  139. data/sig/manifest.yaml +1 -0
  140. data/sig/method_builder.rbs +7 -4
  141. data/sig/parser.rbs +16 -20
  142. data/sig/resolver/type_name_resolver.rbs +7 -38
  143. data/sig/source.rbs +48 -0
  144. data/sig/types.rbs +1 -4
  145. data/src/ast.c +290 -201
  146. data/src/lexer.c +2813 -2902
  147. data/src/lexer.re +4 -0
  148. data/src/lexstate.c +155 -169
  149. data/src/location.c +40 -40
  150. data/src/parser.c +2665 -2433
  151. data/src/string.c +48 -0
  152. data/src/util/rbs_allocator.c +77 -80
  153. data/src/util/rbs_assert.c +10 -10
  154. data/src/util/rbs_buffer.c +2 -2
  155. data/src/util/rbs_constant_pool.c +15 -13
  156. data/src/util/rbs_encoding.c +4062 -20097
  157. data/src/util/rbs_unescape.c +48 -85
  158. data/stdlib/bigdecimal/0/big_decimal.rbs +82 -100
  159. data/stdlib/bigdecimal-math/0/big_math.rbs +8 -169
  160. data/stdlib/cgi/0/core.rbs +396 -2
  161. data/stdlib/cgi/0/manifest.yaml +0 -1
  162. data/stdlib/coverage/0/coverage.rbs +1 -3
  163. data/stdlib/date/0/date.rbs +59 -67
  164. data/stdlib/date/0/date_time.rbs +1 -1
  165. data/stdlib/delegate/0/delegator.rbs +7 -10
  166. data/stdlib/erb/0/erb.rbs +347 -737
  167. data/stdlib/fileutils/0/fileutils.rbs +13 -18
  168. data/stdlib/forwardable/0/forwardable.rbs +0 -3
  169. data/stdlib/json/0/json.rbs +48 -68
  170. data/stdlib/net-http/0/net-http.rbs +0 -3
  171. data/stdlib/objspace/0/objspace.rbs +4 -9
  172. data/stdlib/open-uri/0/open-uri.rbs +0 -40
  173. data/stdlib/openssl/0/openssl.rbs +228 -331
  174. data/stdlib/optparse/0/optparse.rbs +3 -3
  175. data/{core → stdlib/pathname/0}/pathname.rbs +355 -255
  176. data/stdlib/psych/0/psych.rbs +3 -3
  177. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  178. data/stdlib/resolv/0/resolv.rbs +68 -25
  179. data/stdlib/ripper/0/ripper.rbs +2 -5
  180. data/stdlib/singleton/0/singleton.rbs +0 -3
  181. data/stdlib/socket/0/socket.rbs +1 -13
  182. data/stdlib/socket/0/tcp_socket.rbs +2 -10
  183. data/stdlib/stringio/0/stringio.rbs +85 -1176
  184. data/stdlib/strscan/0/string_scanner.rbs +31 -31
  185. data/stdlib/tempfile/0/tempfile.rbs +3 -3
  186. data/stdlib/time/0/time.rbs +1 -1
  187. data/stdlib/timeout/0/timeout.rbs +7 -63
  188. data/stdlib/tsort/0/cyclic.rbs +0 -3
  189. data/stdlib/uri/0/common.rbs +2 -11
  190. data/stdlib/uri/0/file.rbs +1 -1
  191. data/stdlib/uri/0/generic.rbs +16 -17
  192. data/stdlib/uri/0/rfc2396_parser.rbs +7 -6
  193. data/stdlib/zlib/0/zstream.rbs +0 -1
  194. metadata +40 -12
  195. data/.clang-format +0 -74
  196. data/.clangd +0 -2
  197. data/.github/workflows/c-check.yml +0 -54
  198. data/core/ruby.rbs +0 -53
  199. data/docs/aliases.md +0 -79
  200. data/docs/encoding.md +0 -56
  201. data/ext/rbs_extension/compat.h +0 -10
  202. data/stdlib/cgi-escape/0/escape.rbs +0 -153
@@ -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,17 @@ 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
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
107
- end
12
+ attr_reader :sources
108
13
 
109
14
  class SingleEntry
110
15
  attr_reader :name
111
- attr_reader :outer
16
+ attr_reader :context
112
17
  attr_reader :decl
113
18
 
114
- def initialize(name:, decl:, outer:)
19
+ def initialize(name:, decl:, context:)
115
20
  @name = name
116
21
  @decl = decl
117
- @outer = outer
118
- end
119
-
120
- include ContextUtil
121
-
122
- def context
123
- @context ||= calculate_context(outer)
22
+ @context = context
124
23
  end
125
24
  end
126
25
 
@@ -143,9 +42,7 @@ module RBS
143
42
  end
144
43
 
145
44
  def initialize
146
- @signatures = {}
147
- @declarations = []
148
-
45
+ @sources = []
149
46
  @class_decls = {}
150
47
  @interface_decls = {}
151
48
  @type_alias_decls = {}
@@ -156,9 +53,7 @@ module RBS
156
53
  end
157
54
 
158
55
  def initialize_copy(other)
159
- @signatures = other.signatures.dup
160
- @declarations = other.declarations.dup
161
-
56
+ @sources = other.sources.dup
162
57
  @class_decls = other.class_decls.dup
163
58
  @interface_decls = other.interface_decls.dup
164
59
  @type_alias_decls = other.type_alias_decls.dup
@@ -223,17 +118,21 @@ module RBS
223
118
  end
224
119
  end
225
120
 
226
- def class_entry(type_name, normalized: false)
227
- case entry = constant_entry(type_name, normalized: normalized || false)
228
- when ClassEntry, ClassAliasEntry
229
- entry
121
+ def class_entry(type_name)
122
+ case
123
+ when (class_entry = class_decls[type_name]).is_a?(ClassEntry)
124
+ class_entry
125
+ when (class_alias = class_alias_decls[type_name]).is_a?(ClassAliasEntry)
126
+ class_alias
230
127
  end
231
128
  end
232
129
 
233
- def module_entry(type_name, normalized: false)
234
- case entry = constant_entry(type_name, normalized: normalized || false)
235
- when ModuleEntry, ModuleAliasEntry
236
- entry
130
+ def module_entry(type_name)
131
+ case
132
+ when (module_entry = class_decls[type_name]).is_a?(ModuleEntry)
133
+ module_entry
134
+ when (module_alias = class_alias_decls[type_name]).is_a?(ModuleAliasEntry)
135
+ module_alias
237
136
  end
238
137
  end
239
138
 
@@ -249,40 +148,26 @@ module RBS
249
148
  end
250
149
 
251
150
  def normalized_module_entry(type_name)
252
- module_entry(type_name, normalized: true)
151
+ if name = normalize_module_name?(type_name)
152
+ case entry = module_entry(name)
153
+ when ModuleEntry, nil
154
+ entry
155
+ when ModuleAliasEntry
156
+ raise
157
+ end
158
+ end
253
159
  end
254
160
 
255
- def module_class_entry(type_name, normalized: false)
256
- entry = constant_entry(type_name, normalized: normalized || false)
257
- if entry.is_a?(ConstantEntry)
258
- nil
259
- else
260
- entry
261
- end
161
+ def module_class_entry(type_name)
162
+ class_entry(type_name) || module_entry(type_name)
262
163
  end
263
164
 
264
165
  def normalized_module_class_entry(type_name)
265
- module_class_entry(type_name, normalized: true)
166
+ normalized_class_entry(type_name) || normalized_module_entry(type_name)
266
167
  end
267
168
 
268
- def constant_entry(type_name, normalized: false)
269
- if normalized
270
- if normalized_name = normalize_module_name?(type_name)
271
- class_decls.fetch(normalized_name, nil)
272
- else
273
- # The type_name may be declared with constant declaration
274
- unless type_name.namespace.empty?
275
- parent = type_name.namespace.to_type_name
276
- normalized_parent = normalize_module_name?(parent) or return
277
- constant_name = TypeName.new(name: type_name.name, namespace: normalized_parent.to_namespace)
278
- constant_decls.fetch(constant_name, nil)
279
- end
280
- end
281
- else
282
- class_decls.fetch(type_name, nil) ||
283
- class_alias_decls.fetch(type_name, nil) ||
284
- constant_decls.fetch(type_name, nil)
285
- end
169
+ def constant_entry(type_name)
170
+ class_entry(type_name) || module_entry(type_name) || constant_decls[type_name]
286
171
  end
287
172
 
288
173
  def normalize_type_name?(name)
@@ -317,10 +202,6 @@ module RBS
317
202
  end
318
203
  end
319
204
 
320
- def normalize_type_name(name)
321
- normalize_type_name?(name) || name
322
- end
323
-
324
205
  def normalized_type_name?(type_name)
325
206
  case
326
207
  when type_name.interface?
@@ -335,47 +216,56 @@ module RBS
335
216
  end
336
217
 
337
218
  def normalized_type_name!(name)
338
- normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`"
219
+ normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`, which is normalized to `#{normalize_type_name?(name)}`"
339
220
  name
340
221
  end
341
222
 
223
+ def normalize_type_name(name)
224
+ normalize_type_name?(name) || name
225
+ end
226
+
227
+ def normalize_module_name(name)
228
+ normalize_module_name?(name) or name
229
+ end
230
+
342
231
  def normalize_module_name?(name)
343
232
  raise "Class/module name is expected: #{name}" unless name.class?
344
233
  name = name.absolute! unless name.absolute?
345
234
 
346
- original_name = name
347
-
348
- if @normalize_module_name_cache.key?(original_name)
349
- return @normalize_module_name_cache[original_name]
235
+ if @normalize_module_name_cache.key?(name)
236
+ return @normalize_module_name_cache[name]
350
237
  end
351
238
 
352
- if alias_entry = class_alias_decls.fetch(name, nil)
353
- unless alias_entry.decl.old_name.absolute?
354
- # Having relative old_name means the type name resolution was failed.
355
- # Run TypeNameResolver for failure reason
356
- resolver = Resolver::TypeNameResolver.build(self)
357
- name = resolver.resolve_namespace(name, context: nil)
358
- @normalize_module_name_cache[original_name] = name
359
- return name
239
+ unless name.namespace.empty?
240
+ parent = name.namespace.to_type_name
241
+ if normalized_parent = normalize_module_name?(parent)
242
+ type_name = TypeName.new(namespace: normalized_parent.to_namespace, name: name.name)
243
+ else
244
+ @normalize_module_name_cache[name] = nil
245
+ return
360
246
  end
361
-
362
- name = alias_entry.decl.old_name
247
+ else
248
+ type_name = name
363
249
  end
364
250
 
365
- if class_decls.key?(name)
366
- @normalize_module_name_cache[original_name] = name
367
- end
368
- end
251
+ @normalize_module_name_cache[name] = false
369
252
 
370
- def normalize_module_name(name)
371
- normalize_module_name?(name) || name
372
- end
253
+ entry = constant_entry(type_name)
254
+
255
+ normalized_type_name =
256
+ case entry
257
+ when ClassEntry, ModuleEntry
258
+ type_name
259
+ when ClassAliasEntry, ModuleAliasEntry
260
+ normalize_module_name?(entry.decl.old_name)
261
+ else
262
+ nil
263
+ end
373
264
 
374
- def normalize_module_name!(name)
375
- normalize_module_name?(name) or raise "Module name `#{name}` cannot be normalized"
265
+ @normalize_module_name_cache[name] = normalized_type_name
376
266
  end
377
267
 
378
- def insert_decl(decl, outer:, namespace:)
268
+ def insert_rbs_decl(decl, context:, namespace:)
379
269
  case decl
380
270
  when AST::Declarations::Class, AST::Declarations::Module
381
271
  name = decl.name.with_prefix(namespace)
@@ -389,9 +279,9 @@ module RBS
389
279
  unless class_decls.key?(name)
390
280
  case decl
391
281
  when AST::Declarations::Class
392
- class_decls[name] ||= ClassEntry.new(name: name)
282
+ class_decls[name] ||= ClassEntry.new(name)
393
283
  when AST::Declarations::Module
394
- class_decls[name] ||= ModuleEntry.new(name: name)
284
+ class_decls[name] ||= ModuleEntry.new(name)
395
285
  end
396
286
  end
397
287
 
@@ -399,17 +289,17 @@ module RBS
399
289
 
400
290
  case
401
291
  when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
402
- existing_entry.insert(decl: decl, outer: outer)
292
+ existing_entry << [context, decl]
403
293
  when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
404
- existing_entry.insert(decl: decl, outer: outer)
294
+ existing_entry << [context, decl]
405
295
  else
406
- raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
296
+ raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary_decl)
407
297
  end
408
298
 
409
- prefix = outer + [decl]
410
- ns = name.to_namespace
299
+ inner_context = [context, name] #: Resolver::context
300
+ inner_namespace = name.to_namespace
411
301
  decl.each_decl do |d|
412
- insert_decl(d, outer: prefix, namespace: ns)
302
+ insert_rbs_decl(d, context: inner_context, namespace: inner_namespace)
413
303
  end
414
304
 
415
305
  when AST::Declarations::Interface
@@ -419,7 +309,7 @@ module RBS
419
309
  raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
420
310
  end
421
311
 
422
- interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, outer: outer)
312
+ interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, context: context)
423
313
 
424
314
  when AST::Declarations::TypeAlias
425
315
  name = decl.name.with_prefix(namespace)
@@ -428,7 +318,7 @@ module RBS
428
318
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
429
319
  end
430
320
 
431
- type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, outer: outer)
321
+ type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, context: context)
432
322
 
433
323
  when AST::Declarations::Constant
434
324
  name = decl.name.with_prefix(namespace)
@@ -438,18 +328,18 @@ module RBS
438
328
  when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
439
329
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
440
330
  when ClassEntry, ModuleEntry
441
- raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
331
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
442
332
  end
443
333
  end
444
334
 
445
- constant_decls[name] = ConstantEntry.new(name: name, decl: decl, outer: outer)
335
+ constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
446
336
 
447
337
  when AST::Declarations::Global
448
338
  if entry = global_decls[decl.name]
449
339
  raise DuplicatedDeclarationError.new(decl.name, decl, entry.decl)
450
340
  end
451
341
 
452
- global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, outer: outer)
342
+ global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, context: context)
453
343
 
454
344
  when AST::Declarations::ClassAlias, AST::Declarations::ModuleAlias
455
345
  name = decl.new_name.with_prefix(namespace)
@@ -459,35 +349,109 @@ module RBS
459
349
  when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
460
350
  raise DuplicatedDeclarationError.new(name, decl, entry.decl)
461
351
  when ClassEntry, ModuleEntry
462
- raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
352
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
463
353
  end
464
354
  end
465
355
 
466
356
  case decl
467
357
  when AST::Declarations::ClassAlias
468
- class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, outer: outer)
358
+ class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
469
359
  when AST::Declarations::ModuleAlias
470
- class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, outer: outer)
360
+ class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
361
+ end
362
+ end
363
+ end
364
+
365
+ def insert_ruby_decl(decl, context:, namespace:)
366
+ case decl
367
+ when AST::Ruby::Declarations::ClassDecl
368
+ name = decl.class_name.with_prefix(namespace)
369
+
370
+ if entry = constant_entry(name)
371
+ if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
372
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
373
+ end
374
+ if entry.is_a?(ModuleEntry)
375
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
376
+ end
377
+ end
378
+
379
+ entry = ClassEntry.new(name)
380
+ class_decls[name] = entry
381
+
382
+ entry << [context, decl]
383
+
384
+ inner_context = [context, name] #: Resolver::context
385
+ decl.each_decl do |member|
386
+ insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
387
+ end
388
+
389
+ when AST::Ruby::Declarations::ModuleDecl
390
+ name = decl.module_name.with_prefix(namespace)
391
+
392
+ if entry = constant_entry(name)
393
+ if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
394
+ raise DuplicatedDeclarationError.new(name, decl, entry.decl)
395
+ end
396
+ if entry.is_a?(ClassEntry)
397
+ raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
398
+ end
399
+ end
400
+
401
+ entry = ModuleEntry.new(name)
402
+ class_decls[name] = entry
403
+
404
+ entry << [context, decl]
405
+
406
+ inner_context = [context, name] #: Resolver::context
407
+ decl.each_decl do |member|
408
+ insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
409
+ end
410
+ end
411
+ end
412
+
413
+ def add_source(source)
414
+ sources << source
415
+
416
+ case source
417
+ when Source::RBS
418
+ source.declarations.each do |decl|
419
+ insert_rbs_decl(decl, context: nil, namespace: Namespace.root)
420
+ end
421
+ when Source::Ruby
422
+ source.declarations.each do |dir|
423
+ insert_ruby_decl(dir, context: nil, namespace: Namespace.root)
471
424
  end
472
425
  end
473
426
  end
474
427
 
475
- def <<(decl)
476
- declarations << decl
477
- insert_decl(decl, outer: [], namespace: Namespace.root)
478
- self
428
+ def each_rbs_source(&block)
429
+ if block
430
+ sources.each do |source|
431
+ if source.is_a?(Source::RBS)
432
+ yield source
433
+ end
434
+ end
435
+ else
436
+ enum_for(:each_rbs_source)
437
+ end
479
438
  end
480
439
 
481
- def add_signature(buffer:, directives:, decls:)
482
- signatures[buffer] = [directives, decls]
483
- decls.each do |decl|
484
- self << decl
440
+ def each_ruby_source(&block)
441
+ if block
442
+ sources.each do |source|
443
+ if source.is_a?(Source::Ruby)
444
+ yield source
445
+ end
446
+ end
447
+ else
448
+ enum_for(:each_ruby_source)
485
449
  end
486
450
  end
487
451
 
488
452
  def validate_type_params
489
453
  class_decls.each_value do |decl|
490
- decl.primary
454
+ decl.validate_type_params
491
455
  end
492
456
  end
493
457
 
@@ -506,7 +470,7 @@ module RBS
506
470
  if only && !only.member?(decl)
507
471
  decl
508
472
  else
509
- resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
473
+ resolve_declaration(resolver, map, decl, context: nil, prefix: Namespace.root)
510
474
  end
511
475
  end
512
476
 
@@ -514,7 +478,7 @@ module RBS
514
478
  end
515
479
 
516
480
  def resolve_type_names(only: nil)
517
- resolver = Resolver::TypeNameResolver.build(self)
481
+ resolver = Resolver::TypeNameResolver.new(self)
518
482
  env = Environment.new
519
483
 
520
484
  table = UseMap::Table.new()
@@ -524,12 +488,22 @@ module RBS
524
488
  table.known_types.merge(interface_decls.keys)
525
489
  table.compute_children
526
490
 
527
- signatures.each do |buffer, (dirs, decls)|
528
- resolve = dirs.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
491
+ each_rbs_source do |source|
492
+ resolve = source.directives.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
529
493
  if !resolve || resolve.value
530
- _, decls = resolve_signature(resolver, table, dirs, decls)
494
+ _, decls = resolve_signature(resolver, table, source.directives, source.declarations)
495
+ else
496
+ decls = source.declarations
531
497
  end
532
- env.add_signature(buffer: buffer, directives: dirs, decls: decls)
498
+ env.add_source(Source::RBS.new(source.buffer, source.directives, decls))
499
+ end
500
+
501
+ each_ruby_source do |source|
502
+ decls = source.declarations.map do |decl|
503
+ resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
504
+ end
505
+
506
+ env.add_source(Source::Ruby.new(source.buffer, source.prism_result, decls, source.diagnostics))
533
507
  end
534
508
 
535
509
  env
@@ -550,7 +524,7 @@ module RBS
550
524
  end
551
525
  end
552
526
 
553
- def resolve_declaration(resolver, map, decl, outer:, prefix:)
527
+ def resolve_declaration(resolver, map, decl, context:, prefix:)
554
528
  if decl.is_a?(AST::Declarations::Global)
555
529
  # @type var decl: AST::Declarations::Global
556
530
  return AST::Declarations::Global.new(
@@ -562,14 +536,11 @@ module RBS
562
536
  )
563
537
  end
564
538
 
565
- context = resolver_context(*outer)
566
-
567
539
  case decl
568
540
  when AST::Declarations::Class
569
541
  outer_context = context
570
542
  inner_context = append_context(outer_context, decl)
571
543
 
572
- outer_ = outer + [decl]
573
544
  prefix_ = prefix + decl.name.to_namespace
574
545
  AST::Declarations::Class.new(
575
546
  name: decl.name.with_prefix(prefix),
@@ -590,7 +561,7 @@ module RBS
590
561
  resolver,
591
562
  map,
592
563
  member,
593
- outer: outer_,
564
+ context: inner_context,
594
565
  prefix: prefix_
595
566
  )
596
567
  else
@@ -606,7 +577,6 @@ module RBS
606
577
  outer_context = context
607
578
  inner_context = append_context(outer_context, decl)
608
579
 
609
- outer_ = outer + [decl]
610
580
  prefix_ = prefix + decl.name.to_namespace
611
581
  AST::Declarations::Module.new(
612
582
  name: decl.name.with_prefix(prefix),
@@ -627,7 +597,7 @@ module RBS
627
597
  resolver,
628
598
  map,
629
599
  member,
630
- outer: outer_,
600
+ context: inner_context,
631
601
  prefix: prefix_
632
602
  )
633
603
  else
@@ -690,6 +660,61 @@ module RBS
690
660
  end
691
661
  end
692
662
 
663
+ def resolve_ruby_decl(resolver, decl, context:, prefix:)
664
+ case decl
665
+ when AST::Ruby::Declarations::ClassDecl
666
+ full_name = decl.class_name.with_prefix(prefix)
667
+ inner_context = [context, full_name] #: Resolver::context
668
+ inner_prefix = full_name.to_namespace
669
+
670
+ AST::Ruby::Declarations::ClassDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
671
+ decl.members.each do |member|
672
+ case member
673
+ when AST::Ruby::Declarations::Base
674
+ resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
675
+ when AST::Ruby::Members::Base
676
+ resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
677
+ else
678
+ raise "Unknown member type: #{member.class}"
679
+ end
680
+ end
681
+ end
682
+
683
+ when AST::Ruby::Declarations::ModuleDecl
684
+ full_name = decl.module_name.with_prefix(prefix)
685
+ inner_context = [context, full_name] #: Resolver::context
686
+ inner_prefix = full_name.to_namespace
687
+
688
+ AST::Ruby::Declarations::ModuleDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
689
+ decl.members.each do |member|
690
+ case member
691
+ when AST::Ruby::Declarations::Base
692
+ resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
693
+ else
694
+ raise "Unknown member type: #{member.class}"
695
+ end
696
+ end
697
+ end
698
+
699
+ else
700
+ raise "Unknown declaration type: #{decl.class}"
701
+ end
702
+ end
703
+
704
+ def resolve_ruby_member(resolver, member, context:)
705
+ case member
706
+ when AST::Ruby::Members::DefMember
707
+ AST::Ruby::Members::DefMember.new(
708
+ member.buffer,
709
+ member.name,
710
+ member.node,
711
+ member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
712
+ )
713
+ else
714
+ raise "Unknown member type: #{member.class}"
715
+ end
716
+ end
717
+
693
718
  def resolve_member(resolver, map, member, context:)
694
719
  case member
695
720
  when AST::Members::MethodDefinition
@@ -805,7 +830,7 @@ module RBS
805
830
  end
806
831
 
807
832
  def absolute_type_name(resolver, map, type_name, context:)
808
- type_name = map.resolve(type_name)
833
+ type_name = map.resolve(type_name) if map
809
834
  resolver.resolve(type_name, context: context) || type_name
810
835
  end
811
836
 
@@ -821,15 +846,16 @@ module RBS
821
846
  end
822
847
 
823
848
  def buffers
824
- signatures.keys
849
+ sources.map(&:buffer)
825
850
  end
826
851
 
827
852
  def unload(buffers)
828
853
  env = Environment.new
854
+ bufs = buffers.to_set
829
855
 
830
- signatures.each do |buf, (dirs, decls)|
831
- next if buffers.include?(buf)
832
- env.add_signature(buffer: buf, directives: dirs, decls: decls)
856
+ each_rbs_source do |source|
857
+ next if bufs.include?(source.buffer)
858
+ env.add_source(source)
833
859
  end
834
860
 
835
861
  env