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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/CHANGELOG.md +65 -0
- data/Gemfile +0 -1
- data/Rakefile +3 -2
- data/Steepfile +2 -0
- data/bin/rbs-prof +1 -1
- data/core/array.rbs +10 -6
- data/core/complex.rbs +1 -1
- data/core/enumerable.rbs +15 -1
- data/core/enumerator.rbs +4 -0
- data/core/file.rbs +2 -1
- data/core/integer.rbs +2 -1
- data/core/module.rbs +1 -1
- data/core/rational.rbs +2 -1
- data/core/string.rbs +2 -1
- data/core/symbol.rbs +2 -1
- data/core/thread.rbs +14 -1
- data/core/time.rbs +2 -1
- data/docs/stdlib.md +1 -1
- data/lib/rbs.rb +3 -0
- data/lib/rbs/ancestor_graph.rb +90 -0
- data/lib/rbs/ast/members.rb +13 -0
- data/lib/rbs/char_scanner.rb +20 -0
- data/lib/rbs/definition_builder.rb +50 -25
- data/lib/rbs/definition_builder/method_builder.rb +23 -2
- data/lib/rbs/environment.rb +42 -5
- data/lib/rbs/environment_walker.rb +4 -4
- data/lib/rbs/errors.rb +32 -17
- data/lib/rbs/parser.rb +437 -416
- data/lib/rbs/parser.y +29 -16
- data/lib/rbs/test/type_check.rb +7 -3
- data/lib/rbs/version.rb +1 -1
- data/sig/ancestor_graph.rbs +40 -0
- data/sig/char_scanner.rbs +9 -0
- data/sig/definition_builder.rbs +5 -1
- data/sig/environment.rbs +22 -2
- data/sig/environment_walker.rbs +39 -0
- data/sig/errors.rbs +42 -17
- data/sig/members.rbs +2 -0
- data/sig/method_builder.rbs +2 -0
- data/sig/parser.rbs +11 -4
- data/sig/polyfill.rbs +0 -14
- data/sig/types.rbs +7 -1
- data/stdlib/bigdecimal/0/big_decimal.rbs +1 -1
- data/stdlib/cgi/0/core.rbs +595 -0
- data/stdlib/date/0/date.rbs +1 -1
- data/stdlib/json/0/json.rbs +288 -0
- data/stdlib/pathname/0/pathname.rbs +2 -1
- data/stdlib/rubygems/0/basic_specification.rbs +3 -0
- data/stdlib/rubygems/0/config_file.rbs +3 -0
- data/stdlib/rubygems/0/dependency_installer.rbs +5 -0
- data/stdlib/rubygems/0/installer.rbs +3 -0
- data/stdlib/rubygems/0/path_support.rbs +3 -0
- data/stdlib/rubygems/0/platform.rbs +3 -0
- data/stdlib/rubygems/0/request_set.rbs +7 -0
- data/stdlib/rubygems/0/requirement.rbs +3 -0
- data/stdlib/rubygems/0/rubygems.rbs +710 -0
- data/stdlib/rubygems/0/source_list.rbs +2 -0
- data/stdlib/rubygems/0/specification.rbs +3 -0
- data/stdlib/rubygems/0/stream_ui.rbs +3 -0
- data/stdlib/rubygems/0/uninstaller.rbs +3 -0
- data/stdlib/rubygems/0/version.rbs +228 -0
- data/stdlib/set/0/set.rbs +7 -0
- data/stdlib/strscan/0/string_scanner.rbs +582 -0
- data/stdlib/timeout/0/timeout.rbs +57 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +144 -7
- data/steep/Gemfile.lock +17 -19
- metadata +24 -2
data/lib/rbs/ast/members.rb
CHANGED
@@ -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
|
-
|
143
|
-
|
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,
|
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,
|
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.
|
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
|
-
|
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
|
-
|
751
|
+
super_method = methods[name]
|
747
752
|
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
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,
|
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,
|
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
|
data/lib/rbs/environment.rb
CHANGED
@@ -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.
|
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
|
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
|
-
|
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[@
|
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 =
|
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
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
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 <
|
336
|
+
class RecursiveAliasDefinitionError < DefinitionError
|
322
337
|
attr_reader :type
|
323
338
|
attr_reader :defs
|
324
339
|
|