rbs 3.1.3 → 3.2.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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +0 -6
  3. data/CHANGELOG.md +82 -0
  4. data/Gemfile +0 -6
  5. data/Gemfile.lock +12 -21
  6. data/README.md +1 -1
  7. data/Rakefile +45 -1
  8. data/Steepfile +3 -3
  9. data/core/array.rbs +0 -8
  10. data/core/binding.rbs +7 -69
  11. data/core/builtin.rbs +33 -8
  12. data/core/constants.rbs +13 -5
  13. data/core/dir.rbs +25 -25
  14. data/core/errno.rbs +474 -590
  15. data/core/exception.rbs +1 -1
  16. data/core/global_variables.rbs +27 -27
  17. data/core/io.rbs +163 -172
  18. data/core/kernel.rbs +58 -38
  19. data/core/module.rbs +34 -32
  20. data/core/object.rbs +3 -7
  21. data/core/string_io.rbs +9 -0
  22. data/core/thread.rbs +25 -1
  23. data/core/time.rbs +3 -3
  24. data/core/warning.rbs +3 -1
  25. data/docs/CONTRIBUTING.md +1 -1
  26. data/docs/rbs_by_example.md +16 -35
  27. data/docs/repo.md +1 -1
  28. data/docs/sigs.md +7 -7
  29. data/docs/stdlib.md +2 -3
  30. data/docs/syntax.md +40 -40
  31. data/lib/rbs/cli.rb +15 -4
  32. data/lib/rbs/collection/config/lockfile_generator.rb +6 -2
  33. data/lib/rbs/collection/installer.rb +5 -2
  34. data/lib/rbs/collection/sources/stdlib.rb +5 -1
  35. data/lib/rbs/errors.rb +8 -1
  36. data/lib/rbs/file_finder.rb +1 -1
  37. data/lib/rbs/prototype/rb.rb +64 -6
  38. data/lib/rbs/prototype/rbi.rb +2 -6
  39. data/lib/rbs/prototype/runtime.rb +29 -8
  40. data/lib/rbs/subtractor.rb +17 -0
  41. data/lib/rbs/type_name.rb +4 -4
  42. data/lib/rbs/version.rb +1 -1
  43. data/rbs.gemspec +1 -1
  44. data/schema/decls.json +1 -1
  45. data/sig/errors.rbs +54 -0
  46. data/sig/parser.rbs +2 -2
  47. data/sig/prototype/rb.rbs +9 -1
  48. data/sig/subtractor.rbs +4 -0
  49. data/stdlib/logger/0/logger.rbs +1 -1
  50. data/stdlib/observable/0/observable.rbs +219 -0
  51. data/stdlib/uri/0/common.rbs +24 -0
  52. data/stdlib/zlib/0/buf_error.rbs +79 -0
  53. data/stdlib/zlib/0/data_error.rbs +79 -0
  54. data/stdlib/zlib/0/deflate.rbs +276 -0
  55. data/stdlib/zlib/0/error.rbs +89 -0
  56. data/stdlib/zlib/0/gzip_file/crc_error.rbs +115 -0
  57. data/stdlib/zlib/0/gzip_file/error.rbs +128 -0
  58. data/stdlib/zlib/0/gzip_file/length_error.rbs +115 -0
  59. data/stdlib/zlib/0/gzip_file/no_footer.rbs +114 -0
  60. data/stdlib/zlib/0/gzip_file.rbs +228 -0
  61. data/stdlib/zlib/0/gzip_reader.rbs +362 -0
  62. data/stdlib/zlib/0/gzip_writer.rbs +237 -0
  63. data/stdlib/zlib/0/inflate.rbs +249 -0
  64. data/stdlib/zlib/0/mem_error.rbs +79 -0
  65. data/stdlib/zlib/0/need_dict.rbs +82 -0
  66. data/stdlib/zlib/0/stream_end.rbs +80 -0
  67. data/stdlib/zlib/0/stream_error.rbs +80 -0
  68. data/stdlib/zlib/0/version_error.rbs +80 -0
  69. data/stdlib/zlib/0/zstream.rbs +270 -0
  70. metadata +22 -6
  71. data/stdlib/prime/0/integer-extension.rbs +0 -41
  72. data/stdlib/prime/0/manifest.yaml +0 -2
  73. data/stdlib/prime/0/prime.rbs +0 -372
data/lib/rbs/cli.rb CHANGED
@@ -645,6 +645,7 @@ EOU
645
645
  relative_libs = []
646
646
  merge = false
647
647
  owners_included = []
648
+ outline = false
648
649
 
649
650
  OptionParser.new do |opts|
650
651
  opts.banner = <<EOU
@@ -657,7 +658,7 @@ Examples:
657
658
 
658
659
  $ rbs prototype runtime String
659
660
  $ rbs prototype runtime --require set Set
660
- $ rbs prototype runtime -R lib/rbs RBS::*
661
+ $ rbs prototype runtime -R lib/rbs RBS RBS::*
661
662
 
662
663
  Options:
663
664
  EOU
@@ -673,6 +674,9 @@ EOU
673
674
  opts.on("--method-owner CLASS", "Generate method prototypes if the owner of the method is [CLASS]") do |klass|
674
675
  owners_included << klass
675
676
  end
677
+ opts.on("--outline", "Generates only module/class/constant declaration (no method definition)") do
678
+ outline = true
679
+ end
676
680
  end.parse!(args)
677
681
 
678
682
  loader = options.loader()
@@ -686,7 +690,10 @@ EOU
686
690
  eval("require_relative(lib)", binding, "rbs")
687
691
  end
688
692
 
689
- decls = Prototype::Runtime.new(patterns: args, env: env, merge: merge, owners_included: owners_included).decls
693
+ runtime = Prototype::Runtime.new(patterns: args, env: env, merge: merge, owners_included: owners_included)
694
+ runtime.outline = outline
695
+
696
+ decls = runtime.decls
690
697
 
691
698
  writer = Writer.new(out: stdout)
692
699
  writer.write decls
@@ -961,7 +968,7 @@ Options:
961
968
  Parser.public_send(parse_method, buf, require_eof: true)
962
969
  end
963
970
  rescue RBS::ParsingError => ex
964
- stdout.puts ex.message
971
+ stdout.print ex.detailed_message(highlight: true)
965
972
  syntax_error = true
966
973
  end
967
974
 
@@ -1241,7 +1248,11 @@ EOB
1241
1248
  w.write(subtracted)
1242
1249
 
1243
1250
  if write_to_file
1244
- rbs_path.write(io.string)
1251
+ if io.string.empty?
1252
+ rbs_path.delete
1253
+ else
1254
+ rbs_path.write(io.string)
1255
+ end
1245
1256
  else
1246
1257
  stdout.puts(io.string)
1247
1258
  end
@@ -134,8 +134,12 @@ module RBS
134
134
  if locked
135
135
  lockfile.gems[name] = locked
136
136
 
137
- locked[:source].dependencies_of(locked[:name], locked[:version])&.each do |dep|
138
- assign_stdlib(name: dep["name"], from_gem: name)
137
+ begin
138
+ locked[:source].dependencies_of(locked[:name], locked[:version])&.each do |dep|
139
+ assign_stdlib(name: dep["name"], from_gem: name)
140
+ end
141
+ rescue
142
+ RBS.logger.warn "Cannot find `#{locked[:name]}-#{locked[:version]}` gem. Using incorrect Bundler context? (#{definition.lockfile})"
139
143
  end
140
144
  end
141
145
  end
@@ -14,7 +14,10 @@ module RBS
14
14
  def install_from_lockfile
15
15
  install_to = lockfile.fullpath
16
16
  install_to.mkpath
17
- lockfile.gems.each_value do |gem|
17
+ selected = lockfile.gems.select do |name, gem|
18
+ gem[:source].has?(name, gem[:version])
19
+ end
20
+ selected.each_value do |gem|
18
21
  gem[:source].install(
19
22
  dest: install_to,
20
23
  name: gem[:name],
@@ -22,7 +25,7 @@ module RBS
22
25
  stdout: stdout
23
26
  )
24
27
  end
25
- stdout.puts "It's done! #{lockfile.gems.size} gems' RBSs now installed."
28
+ stdout.puts "It's done! #{selected.size} gems' RBSs now installed."
26
29
  end
27
30
  end
28
31
  end
@@ -27,7 +27,11 @@ module RBS
27
27
  end
28
28
 
29
29
  def manifest_of(name, version)
30
- manifest_path = (lookup(name, version) or raise).join('manifest.yaml')
30
+ unless path = lookup(name, version)
31
+ RBS.logger.warn "`#{name}` is specified in rbs_collection.lock.yaml. But it is not found in #{REPO.dirs.join(",")}"
32
+ return
33
+ end
34
+ manifest_path = path.join('manifest.yaml')
31
35
  YAML.safe_load(manifest_path.read) if manifest_path.exist?
32
36
  end
33
37
 
data/lib/rbs/errors.rb CHANGED
@@ -22,7 +22,14 @@ module RBS
22
22
 
23
23
  module DetailedMessageable
24
24
  def detailed_message(highlight: false, **)
25
- msg = super
25
+ msg = if Exception.method_defined?(:detailed_message)
26
+ super
27
+ else
28
+ # Failback to `#message` in Ruby 3.1 or earlier
29
+ "#{message} (#{self.class.name})"
30
+ end
31
+
32
+ return msg unless location
26
33
 
27
34
  # Support only one line
28
35
  return msg unless location.start_line == location.end_line
@@ -5,7 +5,7 @@ module RBS
5
5
  module_function
6
6
 
7
7
  def self.each_file(path, immediate:, skip_hidden:, &block)
8
- return enum_for(__method__, path, immediate: immediate, skip_hidden: skip_hidden) unless block
8
+ return enum_for((__method__ or raise), path, immediate: immediate, skip_hidden: skip_hidden) unless block
9
9
 
10
10
  case
11
11
  when path.file?
@@ -5,11 +5,11 @@ module RBS
5
5
  class RB
6
6
  include Helpers
7
7
 
8
- Context = _ = Struct.new(:module_function, :singleton, :namespace, keyword_init: true) do
8
+ Context = _ = Struct.new(:module_function, :singleton, :namespace, :in_def, keyword_init: true) do
9
9
  # @implements Context
10
10
 
11
11
  def self.initial(namespace: Namespace.root)
12
- self.new(module_function: false, singleton: false, namespace: namespace)
12
+ self.new(module_function: false, singleton: false, namespace: namespace, in_def: false)
13
13
  end
14
14
 
15
15
  def method_kind
@@ -29,6 +29,14 @@ module RBS
29
29
  :instance
30
30
  end
31
31
  end
32
+
33
+ def enter_namespace(namespace)
34
+ Context.initial(namespace: self.namespace + namespace)
35
+ end
36
+
37
+ def update(module_function: self.module_function, singleton: self.singleton, in_def: self.in_def)
38
+ Context.new(module_function: module_function, singleton: singleton, namespace: namespace, in_def: in_def)
39
+ end
32
40
  end
33
41
 
34
42
  attr_reader :source_decls
@@ -121,11 +129,12 @@ module RBS
121
129
 
122
130
  decls.push kls
123
131
 
124
- new_ctx = Context.initial(namespace: context.namespace + kls.name.to_namespace)
132
+ new_ctx = context.enter_namespace(kls.name.to_namespace)
125
133
  each_node class_body do |child|
126
134
  process child, decls: kls.members, comments: comments, context: new_ctx
127
135
  end
128
136
  remove_unnecessary_accessibility_methods! kls.members
137
+ sort_members! kls.members
129
138
 
130
139
  when :MODULE
131
140
  module_name, *module_body = node.children
@@ -142,11 +151,12 @@ module RBS
142
151
 
143
152
  decls.push mod
144
153
 
145
- new_ctx = Context.initial(namespace: context.namespace + mod.name.to_namespace)
154
+ new_ctx = context.enter_namespace(mod.name.to_namespace)
146
155
  each_node module_body do |child|
147
156
  process child, decls: mod.members, comments: comments, context: new_ctx
148
157
  end
149
158
  remove_unnecessary_accessibility_methods! mod.members
159
+ sort_members! mod.members
150
160
 
151
161
  when :SCLASS
152
162
  this, body = node.children
@@ -195,6 +205,11 @@ module RBS
195
205
 
196
206
  decls.push member unless decls.include?(member)
197
207
 
208
+ new_ctx = context.update(singleton: kind == :singleton, in_def: true)
209
+ each_node def_body.children do |child|
210
+ process child, decls: decls, comments: comments, context: new_ctx
211
+ end
212
+
198
213
  when :ALIAS
199
214
  new_name, old_name = node.children.map { |c| literal_to_symbol(c) }
200
215
  member = AST::Members::Alias.new(
@@ -306,7 +321,7 @@ module RBS
306
321
  if args.empty?
307
322
  context.module_function = true
308
323
  else
309
- module_func_context = context.dup.tap { |ctx| ctx.module_function = true }
324
+ module_func_context = context.update(module_function: true)
310
325
  args.each do |arg|
311
326
  if arg && (name = literal_to_symbol(arg))
312
327
  if (i, defn = find_def_index_by_name(decls, name))
@@ -377,6 +392,39 @@ module RBS
377
392
  comment: comments[node.first_lineno - 1]
378
393
  )
379
394
 
395
+ when :IASGN
396
+ case [context.singleton, context.in_def]
397
+ when [true, true], [false, false]
398
+ member = AST::Members::ClassInstanceVariable.new(
399
+ name: node.children.first,
400
+ type: Types::Bases::Any.new(location: nil),
401
+ location: nil,
402
+ comment: comments[node.first_lineno - 1]
403
+ )
404
+ when [false, true]
405
+ member = AST::Members::InstanceVariable.new(
406
+ name: node.children.first,
407
+ type: Types::Bases::Any.new(location: nil),
408
+ location: nil,
409
+ comment: comments[node.first_lineno - 1]
410
+ )
411
+ when [true, false]
412
+ # The variable is for the singleton class of the class object.
413
+ # RBS does not have a way to represent it. So we ignore it.
414
+ else
415
+ raise 'unreachable'
416
+ end
417
+
418
+ decls.push member if member && !decls.include?(member)
419
+
420
+ when :CVASGN
421
+ member = AST::Members::ClassVariable.new(
422
+ name: node.children.first,
423
+ type: Types::Bases::Any.new(location: nil),
424
+ location: nil,
425
+ comment: comments[node.first_lineno - 1]
426
+ )
427
+ decls.push member unless decls.include?(member)
380
428
  else
381
429
  process_children(node, decls: decls, comments: comments, context: context)
382
430
  end
@@ -413,7 +461,7 @@ module RBS
413
461
  when :SELF
414
462
  context.namespace.to_type_name
415
463
  when :CONST, :COLON2, :COLON3
416
- const_to_name!(node)
464
+ const_to_name!(node) rescue nil
417
465
  end
418
466
  end
419
467
  end
@@ -743,6 +791,16 @@ module RBS
743
791
  ]
744
792
  end
745
793
  end
794
+
795
+ def sort_members!(decls)
796
+ i = 0
797
+ orders = {
798
+ AST::Members::ClassVariable => -3,
799
+ AST::Members::ClassInstanceVariable => -2,
800
+ AST::Members::InstanceVariable => -1,
801
+ }
802
+ decls.sort_by! { |decl| [orders.fetch(decl.class, 0), i += 1] }
803
+ end
746
804
  end
747
805
  end
748
806
  end
@@ -479,7 +479,7 @@ module RBS
479
479
  else
480
480
  Types::ClassInstance.new(name: const_to_name(type_node), args: [], location: nil)
481
481
  end
482
- when type_node.type == :COLON2
482
+ when type_node.type == :COLON2 || type_node.type == :COLON3
483
483
  Types::ClassInstance.new(name: const_to_name(type_node), args: [], location: nil)
484
484
  when call_node?(type_node, name: :[], receiver: -> (_) { true })
485
485
  # The type_node represents a type application
@@ -553,11 +553,7 @@ module RBS
553
553
  TypeName.new(name: node.children[0], namespace: Namespace.empty)
554
554
  when :COLON2
555
555
  if node.children[0]
556
- if node.children[0].type == :COLON3
557
- namespace = Namespace.root
558
- else
559
- namespace = const_to_name(node.children[0]).to_namespace
560
- end
556
+ namespace = const_to_name(node.children[0]).to_namespace
561
557
  else
562
558
  namespace = Namespace.empty
563
559
  end
@@ -9,6 +9,7 @@ module RBS
9
9
  attr_reader :env
10
10
  attr_reader :merge
11
11
  attr_reader :owners_included
12
+ attr_accessor :outline
12
13
 
13
14
  def initialize(patterns:, env:, merge:, owners_included: [])
14
15
  @patterns = patterns
@@ -19,6 +20,7 @@ module RBS
19
20
  @owners_included = owners_included.map do |name|
20
21
  Object.const_get(name)
21
22
  end
23
+ @outline = false
22
24
  end
23
25
 
24
26
  def target?(const)
@@ -378,7 +380,7 @@ module RBS
378
380
  RBS.logger.warn("Skipping anonymous superclass #{mod.superclass} of #{mod}")
379
381
  nil
380
382
  else
381
- super_name = to_type_name(const_name(mod.superclass), full_name: true)
383
+ super_name = to_type_name(const_name(mod.superclass), full_name: true).absolute!
382
384
  super_args = type_args(super_name)
383
385
  AST::Declarations::Class::Super.new(name: super_name, args: super_args, location: nil)
384
386
  end
@@ -393,7 +395,7 @@ module RBS
393
395
  unless decl
394
396
  decl = AST::Declarations::Class.new(
395
397
  name: to_type_name(only_name(mod)),
396
- type_params: [],
398
+ type_params: type_params(mod),
397
399
  super_class: generate_super_class(mod),
398
400
  members: [],
399
401
  annotations: [],
@@ -426,7 +428,7 @@ module RBS
426
428
  )
427
429
  end
428
430
 
429
- generate_methods(mod, type_name, decl.members)
431
+ generate_methods(mod, type_name, decl.members) unless outline
430
432
 
431
433
  generate_constants mod, decl.members
432
434
  end
@@ -447,7 +449,7 @@ module RBS
447
449
  unless decl
448
450
  decl = AST::Declarations::Module.new(
449
451
  name: to_type_name(only_name(mod)),
450
- type_params: [],
452
+ type_params: type_params(mod),
451
453
  self_types: [],
452
454
  members: [],
453
455
  annotations: [],
@@ -480,7 +482,7 @@ module RBS
480
482
  )
481
483
  end
482
484
 
483
- generate_methods(mod, type_name, decl.members)
485
+ generate_methods(mod, type_name, decl.members) unless outline
484
486
 
485
487
  generate_constants mod, decl.members
486
488
  end
@@ -502,7 +504,7 @@ module RBS
502
504
  if outer_module.is_a?(Class)
503
505
  outer_decl = AST::Declarations::Class.new(
504
506
  name: to_type_name(outer_module_name),
505
- type_params: [],
507
+ type_params: type_params(outer_module),
506
508
  super_class: generate_super_class(outer_module),
507
509
  members: [],
508
510
  annotations: [],
@@ -512,7 +514,7 @@ module RBS
512
514
  else
513
515
  outer_decl = AST::Declarations::Module.new(
514
516
  name: to_type_name(outer_module_name),
515
- type_params: [],
517
+ type_params: type_params(outer_module),
516
518
  self_types: [],
517
519
  members: [],
518
520
  annotations: [],
@@ -539,7 +541,17 @@ module RBS
539
541
 
540
542
  def const_name(const)
541
543
  @module_name_method ||= Module.instance_method(:name)
542
- @module_name_method.bind(const).call
544
+ name = @module_name_method.bind(const).call
545
+ return nil unless name
546
+
547
+ begin
548
+ Object.const_get(name)
549
+ rescue NameError
550
+ # Should generate const name if anonymous or internal module (e.g. NameError::message)
551
+ nil
552
+ else
553
+ name
554
+ end
543
555
  end
544
556
 
545
557
  def type_args(type_name)
@@ -550,6 +562,15 @@ module RBS
550
562
  end
551
563
  end
552
564
 
565
+ def type_params(mod)
566
+ type_name = to_type_name(const_name(mod), full_name: true)
567
+ if class_decl = env.class_decls[type_name.absolute!]
568
+ class_decl.type_params
569
+ else
570
+ []
571
+ end
572
+ end
573
+
553
574
  def block_from_ast_of(method)
554
575
  return nil if RUBY_VERSION < '3.1'
555
576
 
@@ -51,6 +51,7 @@ module RBS
51
51
  context = _ = [context, decl.name]
52
52
  children = call(decl.each_decl.to_a, context: context) +
53
53
  decl.each_member.reject { |m| member_exist?(owner, m, context: context) }
54
+ children = filter_redundunt_access_modifiers(children)
54
55
  return nil if children.empty?
55
56
 
56
57
  update_decl(decl, members: children)
@@ -144,6 +145,22 @@ module RBS
144
145
  end
145
146
  end
146
147
 
148
+ private def filter_redundunt_access_modifiers(decls)
149
+ decls = decls.dup
150
+ decls.pop while access_modifier?(decls.last)
151
+ decls = decls.map.with_index do |decl, i|
152
+ if access_modifier?(decl) && access_modifier?(decls[i + 1])
153
+ nil
154
+ else
155
+ decl
156
+ end
157
+ end.compact
158
+ end
159
+
160
+ private def access_modifier?(decl)
161
+ decl.is_a?(AST::Members::Public) || decl.is_a?(AST::Members::Private)
162
+ end
163
+
147
164
  private def update_decl(decl, members:)
148
165
  case decl
149
166
  when AST::Declarations::Class
data/lib/rbs/type_name.rb CHANGED
@@ -9,12 +9,12 @@ module RBS
9
9
  def initialize(namespace:, name:)
10
10
  @namespace = namespace
11
11
  @name = name
12
- @kind = case name.to_s[0,1]
13
- when /[A-Z]/
12
+ @kind = case
13
+ when name.match?(/\A[A-Z]/)
14
14
  :class
15
- when /[a-z]/
15
+ when name.match?(/\A[a-z]/)
16
16
  :alias
17
- when "_"
17
+ when name.start_with?("_")
18
18
  :interface
19
19
  else
20
20
  # Defaults to :class
data/lib/rbs/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RBS
4
- VERSION = "3.1.3"
4
+ VERSION = "3.2.0"
5
5
  end
data/rbs.gemspec CHANGED
@@ -35,5 +35,5 @@ Gem::Specification.new do |spec|
35
35
  spec.bindir = "exe"
36
36
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
37
  spec.require_paths = ["lib"]
38
- spec.required_ruby_version = ">= 2.6"
38
+ spec.required_ruby_version = ">= 3.0"
39
39
  end
data/schema/decls.json CHANGED
@@ -60,7 +60,7 @@
60
60
  "required": ["declaration", "name", "type", "comment", "location"]
61
61
  },
62
62
  "global": {
63
- "title": "Global declaration: `$DEBUG: bool`, ...",
63
+ "title": "Global declaration: `$DEBUG: boolish`, ...",
64
64
  "type": "object",
65
65
  "properties": {
66
66
  "declaration": {
data/sig/errors.rbs CHANGED
@@ -16,9 +16,23 @@ module RBS
16
16
  class BaseError < StandardError
17
17
  end
18
18
 
19
+ interface _Location
20
+ %a{pure} def location: () -> Location[untyped, untyped]?
21
+ end
22
+
23
+ interface _DetailedMessage
24
+ def detailed_message: (**untyped) -> String
25
+ end
26
+
27
+ module DetailedMessageable : _Location, _DetailedMessage
28
+ def detailed_message: (?highlight: boolish, **untyped) -> String
29
+ end
30
+
19
31
  # Error class for errors raised during parsing.
20
32
  #
21
33
  class ParsingError < BaseError
34
+ include DetailedMessageable
35
+
22
36
  attr_reader location: Location[untyped, untyped]
23
37
  attr_reader error_message: String
24
38
  attr_reader token_type: String
@@ -67,6 +81,8 @@ module RBS
67
81
  end
68
82
 
69
83
  class NoTypeFoundError < DefinitionError
84
+ include DetailedMessageable
85
+
70
86
  attr_reader type_name: TypeName
71
87
  attr_reader location: Location[untyped, untyped]?
72
88
 
@@ -85,6 +101,8 @@ module RBS
85
101
  end
86
102
 
87
103
  class NoSelfTypeFoundError < DefinitionError
104
+ include DetailedMessageable
105
+
88
106
  attr_reader type_name: TypeName
89
107
  attr_reader location: Location[untyped, untyped]?
90
108
 
@@ -96,6 +114,8 @@ module RBS
96
114
  end
97
115
 
98
116
  class NoMixinFoundError < DefinitionError
117
+ include DetailedMessageable
118
+
99
119
  attr_reader type_name: TypeName
100
120
  attr_reader member: AST::Members::t
101
121
 
@@ -107,6 +127,8 @@ module RBS
107
127
  end
108
128
 
109
129
  class DuplicatedMethodDefinitionError < DefinitionError
130
+ include DetailedMessageable
131
+
110
132
  type ty = Types::ClassSingleton | Types::ClassInstance | Types::Interface
111
133
  type original = DefinitionBuilder::MethodBuilder::Methods::Definition::original
112
134
 
@@ -143,6 +165,8 @@ module RBS
143
165
  # ```
144
166
  #
145
167
  class DuplicatedInterfaceMethodDefinitionError < DefinitionError
168
+ include DetailedMessageable
169
+
146
170
  type ty = Types::ClassSingleton | Types::ClassInstance | Types::Interface
147
171
  type mixin_member = AST::Members::Include | AST::Members::Extend
148
172
 
@@ -155,11 +179,15 @@ module RBS
155
179
  def type_name: () -> TypeName
156
180
 
157
181
  def qualified_method_name: () -> String
182
+
183
+ def location: () -> AST::Members::Mixin::loc?
158
184
  end
159
185
 
160
186
  # The `alias` member declares an alias from unknown method
161
187
  #
162
188
  class UnknownMethodAliasError < DefinitionError
189
+ include DetailedMessageable
190
+
163
191
  attr_reader type_name: TypeName
164
192
  attr_reader original_name: Symbol
165
193
  attr_reader aliased_name: Symbol
@@ -178,12 +206,16 @@ module RBS
178
206
  # The *overloading* method definition cannot find *non-overloading* method definition
179
207
  #
180
208
  class InvalidOverloadMethodError < DefinitionError
209
+ include DetailedMessageable
210
+
181
211
  attr_reader type_name: TypeName
182
212
  attr_reader method_name: Symbol
183
213
  attr_reader kind: :instance | :singleton
184
214
  attr_reader members: Array[AST::Members::MethodDefinition]
185
215
 
186
216
  def initialize: (type_name: TypeName, method_name: Symbol, kind: :instance | :singleton, members: Array[AST::Members::MethodDefinition]) -> void
217
+
218
+ def location: () -> AST::Members::MethodDefinition::loc?
187
219
  end
188
220
 
189
221
  class GenericParameterMismatchError < LoadingError
@@ -201,6 +233,8 @@ module RBS
201
233
  end
202
234
 
203
235
  class InvalidVarianceAnnotationError < DefinitionError
236
+ include DetailedMessageable
237
+
204
238
  attr_reader type_name: TypeName
205
239
  attr_reader param: AST::TypeParam
206
240
  attr_reader location: Location[untyped, untyped]?
@@ -209,6 +243,8 @@ module RBS
209
243
  end
210
244
 
211
245
  class RecursiveAliasDefinitionError < DefinitionError
246
+ include DetailedMessageable
247
+
212
248
  type ty = Types::ClassInstance | Types::ClassSingleton | Types::Interface
213
249
  type defn = DefinitionBuilder::MethodBuilder::Methods::Definition
214
250
 
@@ -223,6 +259,8 @@ module RBS
223
259
  # MixinClassError is raised if a include/prepend/extend has a class (not a module) to mix-in
224
260
  #
225
261
  class MixinClassError < DefinitionError
262
+ include DetailedMessageable
263
+
226
264
  type member = AST::Members::Include | AST::Members::Prepend | AST::Members::Extend
227
265
 
228
266
  attr_reader type_name: TypeName
@@ -240,6 +278,8 @@ module RBS
240
278
  # InheritModuleError is raised if a class definition inherits a module (not a class)
241
279
  #
242
280
  class InheritModuleError < DefinitionError
281
+ include DetailedMessageable
282
+
243
283
  attr_reader super_decl: AST::Declarations::Class::Super
244
284
 
245
285
  def initialize: (AST::Declarations::Class::Super) -> void
@@ -254,6 +294,8 @@ module RBS
254
294
  end
255
295
 
256
296
  class RecursiveTypeAliasError < BaseError
297
+ include DetailedMessageable
298
+
257
299
  attr_reader alias_names: Array[TypeName]
258
300
  attr_reader location: Location[untyped, untyped]?
259
301
 
@@ -263,6 +305,8 @@ module RBS
263
305
  end
264
306
 
265
307
  class NonregularTypeAliasError < BaseError
308
+ include DetailedMessageable
309
+
266
310
  # Diagnostic reported from `TypeAliasRegularity`.
267
311
  attr_reader diagnostic: TypeAliasRegularity::Diagnostic
268
312
 
@@ -273,6 +317,8 @@ module RBS
273
317
  end
274
318
 
275
319
  class CyclicTypeParameterBound < BaseError
320
+ include DetailedMessageable
321
+
276
322
  attr_reader location: Location[untyped, untyped]?
277
323
 
278
324
  # Array of parameters which contains cyclic dependencies.
@@ -295,16 +341,24 @@ module RBS
295
341
  # ```
296
342
  #
297
343
  class InconsistentClassModuleAliasError < BaseError
344
+ include DetailedMessageable
345
+
298
346
  attr_reader alias_entry: Environment::ModuleAliasEntry | Environment::ClassAliasEntry
299
347
 
300
348
  def initialize: (Environment::ModuleAliasEntry | Environment::ClassAliasEntry) -> void
349
+
350
+ def location: () -> AST::Declarations::AliasDecl::loc?
301
351
  end
302
352
 
303
353
  # A module/class alias declaration is cyclic
304
354
  #
305
355
  class CyclicClassAliasDefinitionError < BaseError
356
+ include DetailedMessageable
357
+
306
358
  attr_reader alias_entry: Environment::ModuleAliasEntry | Environment::ClassAliasEntry
307
359
 
308
360
  def initialize: (Environment::ModuleAliasEntry | Environment::ClassAliasEntry) -> void
361
+
362
+ def location: () -> AST::Declarations::AliasDecl::loc?
309
363
  end
310
364
  end
data/sig/parser.rbs CHANGED
@@ -2,7 +2,7 @@ module RBS
2
2
  class Parser
3
3
  # Parse a method type and return it
4
4
  #
5
- # When `range` keyword is specified, it starts parsing from the `begin` to the `endo` the range.
5
+ # When `range` keyword is specified, it starts parsing from the `begin` to the `end` of the range.
6
6
  #
7
7
  # ```ruby
8
8
  # RBS::Parser.parse_method_type("() -> void") # => `() -> void`
@@ -25,7 +25,7 @@ module RBS
25
25
 
26
26
  # Parse a type and return it
27
27
  #
28
- # When `range` keyword is specified, it starts parsing from the `begin` to the `endo` the range.
28
+ # When `range` keyword is specified, it starts parsing from the `begin` to the `end` of the range.
29
29
  #
30
30
  # ```ruby
31
31
  # RBS::Parser.parse_type("String") # => `String`