rbs 3.1.3 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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`