rbs 1.0.3 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +2 -2
  3. data/CHANGELOG.md +65 -0
  4. data/Gemfile +0 -1
  5. data/Rakefile +3 -2
  6. data/Steepfile +2 -0
  7. data/bin/rbs-prof +1 -1
  8. data/core/array.rbs +10 -6
  9. data/core/complex.rbs +1 -1
  10. data/core/enumerable.rbs +15 -1
  11. data/core/enumerator.rbs +4 -0
  12. data/core/file.rbs +2 -1
  13. data/core/integer.rbs +2 -1
  14. data/core/module.rbs +1 -1
  15. data/core/rational.rbs +2 -1
  16. data/core/string.rbs +2 -1
  17. data/core/symbol.rbs +2 -1
  18. data/core/thread.rbs +14 -1
  19. data/core/time.rbs +2 -1
  20. data/docs/stdlib.md +1 -1
  21. data/lib/rbs.rb +3 -0
  22. data/lib/rbs/ancestor_graph.rb +90 -0
  23. data/lib/rbs/ast/members.rb +13 -0
  24. data/lib/rbs/char_scanner.rb +20 -0
  25. data/lib/rbs/definition_builder.rb +50 -25
  26. data/lib/rbs/definition_builder/method_builder.rb +23 -2
  27. data/lib/rbs/environment.rb +42 -5
  28. data/lib/rbs/environment_walker.rb +4 -4
  29. data/lib/rbs/errors.rb +32 -17
  30. data/lib/rbs/parser.rb +437 -416
  31. data/lib/rbs/parser.y +29 -16
  32. data/lib/rbs/test/type_check.rb +7 -3
  33. data/lib/rbs/version.rb +1 -1
  34. data/sig/ancestor_graph.rbs +40 -0
  35. data/sig/char_scanner.rbs +9 -0
  36. data/sig/definition_builder.rbs +5 -1
  37. data/sig/environment.rbs +22 -2
  38. data/sig/environment_walker.rbs +39 -0
  39. data/sig/errors.rbs +42 -17
  40. data/sig/members.rbs +2 -0
  41. data/sig/method_builder.rbs +2 -0
  42. data/sig/parser.rbs +11 -4
  43. data/sig/polyfill.rbs +0 -14
  44. data/sig/types.rbs +7 -1
  45. data/stdlib/bigdecimal/0/big_decimal.rbs +1 -1
  46. data/stdlib/cgi/0/core.rbs +595 -0
  47. data/stdlib/date/0/date.rbs +1 -1
  48. data/stdlib/json/0/json.rbs +288 -0
  49. data/stdlib/pathname/0/pathname.rbs +2 -1
  50. data/stdlib/rubygems/0/basic_specification.rbs +3 -0
  51. data/stdlib/rubygems/0/config_file.rbs +3 -0
  52. data/stdlib/rubygems/0/dependency_installer.rbs +5 -0
  53. data/stdlib/rubygems/0/installer.rbs +3 -0
  54. data/stdlib/rubygems/0/path_support.rbs +3 -0
  55. data/stdlib/rubygems/0/platform.rbs +3 -0
  56. data/stdlib/rubygems/0/request_set.rbs +7 -0
  57. data/stdlib/rubygems/0/requirement.rbs +3 -0
  58. data/stdlib/rubygems/0/rubygems.rbs +710 -0
  59. data/stdlib/rubygems/0/source_list.rbs +2 -0
  60. data/stdlib/rubygems/0/specification.rbs +3 -0
  61. data/stdlib/rubygems/0/stream_ui.rbs +3 -0
  62. data/stdlib/rubygems/0/uninstaller.rbs +3 -0
  63. data/stdlib/rubygems/0/version.rbs +228 -0
  64. data/stdlib/set/0/set.rbs +7 -0
  65. data/stdlib/strscan/0/string_scanner.rbs +582 -0
  66. data/stdlib/timeout/0/timeout.rbs +57 -0
  67. data/stdlib/uri/0/rfc2396_parser.rbs +144 -7
  68. data/steep/Gemfile.lock +17 -19
  69. metadata +24 -2
@@ -245,6 +245,19 @@ module RBS
245
245
  def hash
246
246
  self.class.hash ^ name.hash ^ type.hash ^ ivar_name.hash ^ kind.hash
247
247
  end
248
+
249
+ def update(name: self.name, type: self.type, ivar_name: self.ivar_name, kind: self.kind, annotations: self.annotations, location: self.location, comment: self.comment)
250
+ klass = _ = self.class
251
+ klass.new(
252
+ name: name,
253
+ type: type,
254
+ ivar_name: ivar_name,
255
+ kind: kind,
256
+ annotations: annotations,
257
+ location: location,
258
+ comment: comment
259
+ )
260
+ end
248
261
  end
249
262
 
250
263
  class AttrReader < Base
@@ -0,0 +1,20 @@
1
+ module RBS
2
+ class CharScanner < StringScanner
3
+ def initialize(string)
4
+ super(string)
5
+ @charpos = 0
6
+ end
7
+
8
+ alias original_charpos charpos
9
+
10
+ def charpos
11
+ @charpos
12
+ end
13
+
14
+ def scan(pattern)
15
+ s = super
16
+ @charpos += s.size if s
17
+ s
18
+ end
19
+ end
20
+ end
@@ -10,11 +10,11 @@ module RBS
10
10
  attr_reader :singleton0_cache
11
11
  attr_reader :interface_cache
12
12
 
13
- def initialize(env:)
13
+ def initialize(env:, ancestor_builder: nil, method_builder: nil)
14
14
  @env = env
15
15
  @type_name_resolver = TypeNameResolver.from_env(env)
16
- @ancestor_builder = AncestorBuilder.new(env: env)
17
- @method_builder = MethodBuilder.new(env: env)
16
+ @ancestor_builder = ancestor_builder || AncestorBuilder.new(env: env)
17
+ @method_builder = method_builder || MethodBuilder.new(env: env)
18
18
 
19
19
  @instance_cache = {}
20
20
  @singleton_cache = {}
@@ -80,6 +80,7 @@ module RBS
80
80
  when AST::Members::Alias
81
81
  unless definition.methods.key?(original.old_name)
82
82
  raise UnknownMethodAliasError.new(
83
+ type_name: type_name,
83
84
  original_name: original.old_name,
84
85
  aliased_name: original.new_name,
85
86
  location: original.location
@@ -139,9 +140,8 @@ module RBS
139
140
  case entry
140
141
  when Environment::ClassEntry, Environment::ModuleEntry
141
142
  ancestors = ancestor_builder.instance_ancestors(type_name)
142
- self_type = Types::ClassInstance.new(name: type_name,
143
- args: Types::Variable.build(entry.type_params.each.map(&:name)),
144
- location: nil)
143
+ args = Types::Variable.build(entry.type_params.each.map(&:name))
144
+ self_type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
145
145
 
146
146
  Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
147
147
  one_ancestors = ancestor_builder.one_instance_ancestors(type_name)
@@ -217,6 +217,8 @@ module RBS
217
217
  super_interface_method: entry.is_a?(Environment::ModuleEntry))
218
218
 
219
219
  entry.decls.each do |d|
220
+ subst = Substitution.build(d.decl.type_params.each.map(&:name), args)
221
+
220
222
  d.decl.members.each do |member|
221
223
  case member
222
224
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
@@ -229,12 +231,18 @@ module RBS
229
231
  end
230
232
 
231
233
  if ivar_name
232
- insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type)
234
+ insert_variable(type_name,
235
+ definition.instance_variables,
236
+ name: ivar_name,
237
+ type: member.type.sub(subst))
233
238
  end
234
239
  end
235
240
 
236
241
  when AST::Members::InstanceVariable
237
- insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type)
242
+ insert_variable(type_name,
243
+ definition.instance_variables,
244
+ name: member.name,
245
+ type: member.type.sub(subst))
238
246
 
239
247
  when AST::Members::ClassVariable
240
248
  insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
@@ -353,15 +361,10 @@ module RBS
353
361
  when Environment::ClassEntry, Environment::ModuleEntry
354
362
  ancestors = ancestor_builder.singleton_ancestors(type_name)
355
363
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
356
- instance_type = Types::ClassInstance.new(
357
- name: type_name,
358
- args: entry.type_params.each.map { Types::Bases::Any.new(location: nil) },
359
- location: nil
360
- )
361
364
 
362
365
  Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
363
366
  def0 = build_singleton0(type_name)
364
- subst = Substitution.build([], [], instance_type: instance_type)
367
+ subst = Substitution.new
365
368
 
366
369
  merge_definition(src: def0, dest: definition, subst: subst, keep_super: true)
367
370
 
@@ -554,6 +557,7 @@ module RBS
554
557
 
555
558
  unless original_method
556
559
  raise UnknownMethodAliasError.new(
560
+ type_name: definition.type_name,
557
561
  original_name: original.old_name,
558
562
  aliased_name: original.new_name,
559
563
  location: original.location
@@ -723,11 +727,13 @@ module RBS
723
727
  end
724
728
 
725
729
  def merge_method(type_name, methods, name, method, sub, implemented_in: :keep, keep_super: false)
726
- defs = method.defs.yield_self do |defs|
730
+ if sub.empty? && implemented_in == :keep && keep_super
731
+ methods[name] = method
732
+ else
727
733
  if sub.empty? && implemented_in == :keep
728
- defs
734
+ defs = method.defs
729
735
  else
730
- defs.map do |defn|
736
+ defs = method.defs.map do |defn|
731
737
  defn.update(
732
738
  type: sub.empty? ? defn.type : defn.type.sub(sub),
733
739
  implemented_in: case implemented_in
@@ -741,16 +747,16 @@ module RBS
741
747
  )
742
748
  end
743
749
  end
744
- end
745
750
 
746
- super_method = methods[name]
751
+ super_method = methods[name]
747
752
 
748
- methods[name] = Definition::Method.new(
749
- super_method: keep_super ? method.super_method : super_method,
750
- accessibility: method.accessibility,
751
- defs: defs,
752
- alias_of: method.alias_of
753
- )
753
+ methods[name] = Definition::Method.new(
754
+ super_method: keep_super ? method.super_method : super_method,
755
+ accessibility: method.accessibility,
756
+ defs: defs,
757
+ alias_of: method.alias_of
758
+ )
759
+ end
754
760
  end
755
761
 
756
762
  def try_cache(type_name, cache:, key: type_name)
@@ -781,5 +787,24 @@ module RBS
781
787
  ensure_namespace!(type_name.namespace, location: entry.decl.location)
782
788
  entry.decl.type
783
789
  end
790
+
791
+ def update(env:, except:, ancestor_builder:)
792
+ method_builder = self.method_builder.update(env: env, except: except)
793
+
794
+ DefinitionBuilder.new(env: env, ancestor_builder: ancestor_builder, method_builder: method_builder).tap do |builder|
795
+ builder.instance_cache.merge!(instance_cache)
796
+ builder.singleton_cache.merge!(singleton_cache)
797
+ builder.singleton0_cache.merge!(singleton0_cache)
798
+ builder.interface_cache.merge!(interface_cache)
799
+
800
+ except.each do |name|
801
+ builder.instance_cache.delete([name, true])
802
+ builder.instance_cache.delete([name, false])
803
+ builder.singleton_cache.delete(name)
804
+ builder.singleton0_cache.delete(name)
805
+ builder.interface_cache.delete(name)
806
+ end
807
+ end
808
+ end
784
809
  end
785
810
  end
@@ -96,15 +96,22 @@ module RBS
96
96
  type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
97
97
  Methods.new(type: type).tap do |methods|
98
98
  entry.decls.each do |d|
99
+ subst = Substitution.build(d.decl.type_params.each.map(&:name), args)
99
100
  each_member_with_accessibility(d.decl.members) do |member, accessibility|
100
101
  case member
101
102
  when AST::Members::MethodDefinition
102
103
  if member.instance?
103
- build_method(methods, type, member: member, accessibility: accessibility)
104
+ build_method(methods,
105
+ type,
106
+ member: member.update(types: member.types.map {|type| type.sub(subst) }),
107
+ accessibility: accessibility)
104
108
  end
105
109
  when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
106
110
  if member.kind == :instance
107
- build_attribute(methods, type, member: member, accessibility: accessibility)
111
+ build_attribute(methods,
112
+ type,
113
+ member: member.update(type: member.type.sub(subst)),
114
+ accessibility: accessibility)
108
115
  end
109
116
  when AST::Members::Alias
110
117
  if member.kind == :instance
@@ -212,6 +219,20 @@ module RBS
212
219
  end
213
220
  end
214
221
  end
222
+
223
+ def update(env:, except:)
224
+ MethodBuilder.new(env: env).tap do |copy|
225
+ copy.instance_methods.merge!(instance_methods)
226
+ copy.singleton_methods.merge!(singleton_methods)
227
+ copy.interface_methods.merge!(interface_methods)
228
+
229
+ except.each do |type_name|
230
+ copy.instance_methods.delete(type_name)
231
+ copy.singleton_methods.delete(type_name)
232
+ copy.interface_methods.delete(type_name)
233
+ end
234
+ end
235
+ end
215
236
  end
216
237
  end
217
238
  end
@@ -1,6 +1,5 @@
1
1
  module RBS
2
2
  class Environment
3
- attr_reader :buffers
4
3
  attr_reader :declarations
5
4
 
6
5
  attr_reader :class_decls
@@ -169,7 +168,7 @@ module RBS
169
168
  # @type var decl: AST::Declarations::Class
170
169
  existing_entry.insert(decl: decl, outer: outer)
171
170
  else
172
- raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary.decl)
171
+ raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
173
172
  end
174
173
 
175
174
  prefix = outer + [decl]
@@ -204,12 +203,22 @@ module RBS
204
203
  self
205
204
  end
206
205
 
207
- def resolve_type_names
206
+ def validate_type_params
207
+ class_decls.each_value do |decl|
208
+ decl.primary
209
+ end
210
+ end
211
+
212
+ def resolve_type_names(only: nil)
208
213
  resolver = TypeNameResolver.from_env(self)
209
214
  env = Environment.new()
210
215
 
211
216
  declarations.each do |decl|
212
- env << resolve_declaration(resolver, decl, outer: [], prefix: Namespace.root)
217
+ if only && !only.member?(decl)
218
+ env << decl
219
+ else
220
+ env << resolve_declaration(resolver, decl, outer: [], prefix: Namespace.root)
221
+ end
213
222
  end
214
223
 
215
224
  env
@@ -431,8 +440,36 @@ module RBS
431
440
  end
432
441
 
433
442
  def inspect
434
- ivars = %i[@buffers @declarations @class_decls @interface_decls @alias_decls @constant_decls @global_decls]
443
+ ivars = %i[@declarations @class_decls @interface_decls @alias_decls @constant_decls @global_decls]
435
444
  "\#<RBS::Environment #{ivars.map { |iv| "#{iv}=(#{instance_variable_get(iv).size} items)"}.join(' ')}>"
436
445
  end
446
+
447
+ def buffers
448
+ buffers_decls.keys.compact
449
+ end
450
+
451
+ def buffers_decls
452
+ # @type var hash: Hash[Buffer, Array[AST::Declarations::t]]
453
+ hash = {}
454
+
455
+ declarations.each do |decl|
456
+ location = decl.location or next
457
+ (hash[location.buffer] ||= []) << decl
458
+ end
459
+
460
+ hash
461
+ end
462
+
463
+ def reject
464
+ env = Environment.new
465
+
466
+ declarations.each do |decl|
467
+ unless yield(decl)
468
+ env << decl
469
+ end
470
+ end
471
+
472
+ env
473
+ end
437
474
  end
438
475
  end
@@ -1,14 +1,14 @@
1
1
  module RBS
2
2
  class EnvironmentWalker
3
- InstanceNode = Struct.new(:type_name, keyword_init: true)
4
- SingletonNode = Struct.new(:type_name, keyword_init: true)
5
- TypeNameNode = Struct.new(:type_name, keyword_init: true)
3
+ InstanceNode = _ = Struct.new(:type_name, keyword_init: true)
4
+ SingletonNode = _ = Struct.new(:type_name, keyword_init: true)
5
+ TypeNameNode = _ = Struct.new(:type_name, keyword_init: true)
6
6
 
7
7
  attr_reader :env
8
8
 
9
9
  def initialize(env:)
10
10
  @env = env
11
- @only_ancestors = nil
11
+ @only_ancestors = false
12
12
  end
13
13
 
14
14
  def builder
data/lib/rbs/errors.rb CHANGED
@@ -14,7 +14,12 @@ module RBS
14
14
  end
15
15
  end
16
16
 
17
- class InvalidTypeApplicationError < StandardError
17
+ class ErrorBase < StandardError; end
18
+ class ParsingError < ErrorBase; end
19
+ class LoadingError < ErrorBase; end
20
+ class DefinitionError < ErrorBase; end
21
+
22
+ class InvalidTypeApplicationError < DefinitionError
18
23
  attr_reader :type_name
19
24
  attr_reader :args
20
25
  attr_reader :params
@@ -35,7 +40,7 @@ module RBS
35
40
  end
36
41
  end
37
42
 
38
- class RecursiveAncestorError < StandardError
43
+ class RecursiveAncestorError < DefinitionError
39
44
  attr_reader :ancestors
40
45
  attr_reader :location
41
46
 
@@ -73,7 +78,7 @@ module RBS
73
78
  end
74
79
  end
75
80
 
76
- class NoTypeFoundError < StandardError
81
+ class NoTypeFoundError < ErrorBase
77
82
  attr_reader :type_name
78
83
  attr_reader :location
79
84
 
@@ -102,7 +107,7 @@ module RBS
102
107
  end
103
108
  end
104
109
 
105
- class NoSuperclassFoundError < StandardError
110
+ class NoSuperclassFoundError < DefinitionError
106
111
  attr_reader :type_name
107
112
  attr_reader :location
108
113
 
@@ -118,7 +123,7 @@ module RBS
118
123
  end
119
124
  end
120
125
 
121
- class NoSelfTypeFoundError < StandardError
126
+ class NoSelfTypeFoundError < DefinitionError
122
127
  attr_reader :type_name
123
128
  attr_reader :location
124
129
 
@@ -145,7 +150,7 @@ module RBS
145
150
  end
146
151
  end
147
152
 
148
- class NoMixinFoundError < StandardError
153
+ class NoMixinFoundError < DefinitionError
149
154
  attr_reader :type_name
150
155
  attr_reader :member
151
156
 
@@ -174,7 +179,7 @@ module RBS
174
179
  end
175
180
  end
176
181
 
177
- class DuplicatedMethodDefinitionError < StandardError
182
+ class DuplicatedMethodDefinitionError < DefinitionError
178
183
  attr_reader :type
179
184
  attr_reader :method_name
180
185
  attr_reader :members
@@ -200,6 +205,10 @@ module RBS
200
205
  end
201
206
  end
202
207
 
208
+ def type_name
209
+ type.name
210
+ end
211
+
203
212
  def location
204
213
  members[0].location
205
214
  end
@@ -209,7 +218,7 @@ module RBS
209
218
  end
210
219
  end
211
220
 
212
- class DuplicatedInterfaceMethodDefinitionError < StandardError
221
+ class DuplicatedInterfaceMethodDefinitionError < DefinitionError
213
222
  attr_reader :type
214
223
  attr_reader :method_name
215
224
  attr_reader :member
@@ -230,23 +239,29 @@ module RBS
230
239
  "#{type.name}##{method_name}"
231
240
  end
232
241
  end
242
+
243
+ def type_name
244
+ type.name
245
+ end
233
246
  end
234
247
 
235
- class UnknownMethodAliasError < StandardError
248
+ class UnknownMethodAliasError < DefinitionError
249
+ attr_reader :type_name
236
250
  attr_reader :original_name
237
251
  attr_reader :aliased_name
238
252
  attr_reader :location
239
253
 
240
- def initialize(original_name:, aliased_name:, location:)
254
+ def initialize(type_name:, original_name:, aliased_name:, location:)
255
+ @type_name = type_name
241
256
  @original_name = original_name
242
257
  @aliased_name = aliased_name
243
258
  @location = location
244
259
 
245
- super "#{Location.to_string location}: Unknown method alias name: #{original_name} => #{aliased_name}"
260
+ super "#{Location.to_string location}: Unknown method alias name: #{original_name} => #{aliased_name} (#{type_name})"
246
261
  end
247
262
  end
248
263
 
249
- class SuperclassMismatchError < StandardError
264
+ class SuperclassMismatchError < DefinitionError
250
265
  attr_reader :name
251
266
  attr_reader :entry
252
267
 
@@ -257,7 +272,7 @@ module RBS
257
272
  end
258
273
  end
259
274
 
260
- class InvalidOverloadMethodError < StandardError
275
+ class InvalidOverloadMethodError < DefinitionError
261
276
  attr_reader :type_name
262
277
  attr_reader :method_name
263
278
  attr_reader :kind
@@ -280,7 +295,7 @@ module RBS
280
295
  end
281
296
  end
282
297
 
283
- class GenericParameterMismatchError < StandardError
298
+ class GenericParameterMismatchError < LoadingError
284
299
  attr_reader :name
285
300
  attr_reader :decl
286
301
 
@@ -291,7 +306,7 @@ module RBS
291
306
  end
292
307
  end
293
308
 
294
- class DuplicatedDeclarationError < StandardError
309
+ class DuplicatedDeclarationError < LoadingError
295
310
  attr_reader :name
296
311
  attr_reader :decls
297
312
 
@@ -304,7 +319,7 @@ module RBS
304
319
  end
305
320
  end
306
321
 
307
- class InvalidVarianceAnnotationError < StandardError
322
+ class InvalidVarianceAnnotationError < DefinitionError
308
323
  attr_reader :type_name
309
324
  attr_reader :param
310
325
  attr_reader :location
@@ -318,7 +333,7 @@ module RBS
318
333
  end
319
334
  end
320
335
 
321
- class RecursiveAliasDefinitionError < StandardError
336
+ class RecursiveAliasDefinitionError < DefinitionError
322
337
  attr_reader :type
323
338
  attr_reader :defs
324
339