rbs 3.1.1 → 3.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +1 -1
- data/lib/rbs/definition_builder.rb +4 -3
- data/lib/rbs/environment.rb +73 -30
- data/lib/rbs/errors.rb +4 -4
- data/lib/rbs/resolver/type_name_resolver.rb +39 -6
- data/lib/rbs/type_alias_dependency.rb +12 -2
- data/lib/rbs/type_alias_regularity.rb +18 -11
- data/lib/rbs/validator.rb +29 -28
- data/lib/rbs/variance_calculator.rb +25 -22
- data/lib/rbs/version.rb +1 -1
- data/sig/definition_builder.rbs +4 -0
- data/sig/environment.rbs +27 -0
- data/sig/errors.rbs +6 -0
- data/sig/resolver/type_name_resolver.rbs +5 -1
- data/sig/type_alias_dependency.rbs +31 -0
- data/sig/type_alias_regularity.rbs +6 -0
- data/sig/validator.rbs +2 -2
- data/sig/variance_calculator.rbs +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b7971d4b64c169d220fe2c0895630a36ebc6505b68689fba0660be24bcd24c0
|
4
|
+
data.tar.gz: 2f6b8a68c5817d25c3ba179eb3965751f0b406c7dcf2d0812fe41d96bbac6e7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4647a2dce17379807dae65a355d0fb2174d18062dbeb98d51c0c06f125d19d665ff32e3528c7326925ba11abed838b0ffff35e3708a25931fa1c4ea8c25d5eae
|
7
|
+
data.tar.gz: 68e20554c2941971aa99015343ef59768a653ed23fc0d6b59eeb64223dff56e8c0aa61846402f28d5f8f9e5ce33763e116cdf08cb8ca9dcfb07177d1eeab9d68
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,15 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 3.1.2 (2023-07-27)
|
6
|
+
|
7
|
+
⚠️ Note that this patch level release may report additional validation errors that is caused by fix of type name resolution ([#1373](https://github.com/ruby/rbs/pull/1373)).
|
8
|
+
|
9
|
+
### Library changes
|
10
|
+
|
11
|
+
* Make `TypeNameResolver` more compatible with Ruby ([#1373](https://github.com/ruby/rbs/pull/1373))
|
12
|
+
* Fix module alias normalizations ([#1393](https://github.com/ruby/rbs/pull/1393))
|
13
|
+
|
5
14
|
## 3.1.1 (2023-07-18)
|
6
15
|
|
7
16
|
### Signature updates
|
data/Gemfile.lock
CHANGED
@@ -753,12 +753,14 @@ module RBS
|
|
753
753
|
end
|
754
754
|
|
755
755
|
def expand_alias1(type_name)
|
756
|
+
type_name = env.normalize_type_name(type_name)
|
756
757
|
entry = env.type_alias_decls[type_name] or raise "Unknown alias name: #{type_name}"
|
757
758
|
as = entry.decl.type_params.each.map { Types::Bases::Any.new(location: nil) }
|
758
759
|
expand_alias2(type_name, as)
|
759
760
|
end
|
760
761
|
|
761
762
|
def expand_alias2(type_name, args)
|
763
|
+
type_name = env.normalize_type_name(type_name)
|
762
764
|
entry = env.type_alias_decls[type_name] or raise "Unknown alias name: #{type_name}"
|
763
765
|
|
764
766
|
ensure_namespace!(type_name.namespace, location: entry.decl.location)
|
@@ -811,9 +813,8 @@ module RBS
|
|
811
813
|
end
|
812
814
|
|
813
815
|
def validate_type_name(name, location)
|
814
|
-
name = name.absolute!
|
815
|
-
|
816
|
-
return if env.type_name?(name)
|
816
|
+
name = name.absolute! unless name.absolute?
|
817
|
+
return if env.type_name?(env.normalize_type_name(name))
|
817
818
|
|
818
819
|
raise NoTypeFoundError.new(type_name: name, location: location)
|
819
820
|
end
|
data/lib/rbs/environment.rb
CHANGED
@@ -275,53 +275,96 @@ module RBS
|
|
275
275
|
class_entry(type_name) || module_entry(type_name) || constant_decls[type_name]
|
276
276
|
end
|
277
277
|
|
278
|
+
def normalize_type_name?(name)
|
279
|
+
if name.class?
|
280
|
+
normalize_module_name?(name)
|
281
|
+
else
|
282
|
+
unless name.namespace.empty?
|
283
|
+
parent = name.namespace.to_type_name
|
284
|
+
parent = normalize_module_name?(parent)
|
285
|
+
return parent unless parent
|
286
|
+
|
287
|
+
TypeName.new(namespace: parent.to_namespace, name: name.name)
|
288
|
+
else
|
289
|
+
name
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
def normalize_type_name!(name)
|
295
|
+
result = normalize_type_name?(name)
|
296
|
+
|
297
|
+
case result
|
298
|
+
when TypeName
|
299
|
+
result
|
300
|
+
when false
|
301
|
+
raise "Type name `#{name}` cannot be normalized because it's a cyclic definition"
|
302
|
+
when nil
|
303
|
+
raise "Type name `#{name}` cannot be normalized because of unknown type name in the path"
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def normalized_type_name?(type_name)
|
308
|
+
case
|
309
|
+
when type_name.interface?
|
310
|
+
interface_decls.key?(type_name)
|
311
|
+
when type_name.class?
|
312
|
+
class_decls.key?(type_name)
|
313
|
+
when type_name.alias?
|
314
|
+
type_alias_decls.key?(type_name)
|
315
|
+
else
|
316
|
+
false
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
def normalized_type_name!(name)
|
321
|
+
normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`, which is normalized to `#{normalize_type_name?(name)}`"
|
322
|
+
name
|
323
|
+
end
|
324
|
+
|
325
|
+
def normalize_type_name(name)
|
326
|
+
normalize_type_name?(name) || name
|
327
|
+
end
|
328
|
+
|
278
329
|
def normalize_module_name(name)
|
279
330
|
normalize_module_name?(name) or name
|
280
331
|
end
|
281
332
|
|
282
333
|
def normalize_module_name?(name)
|
283
334
|
raise "Class/module name is expected: #{name}" unless name.class?
|
284
|
-
name = name.absolute!
|
335
|
+
name = name.absolute! unless name.absolute?
|
285
336
|
|
286
337
|
if @normalize_module_name_cache.key?(name)
|
287
338
|
return @normalize_module_name_cache[name]
|
288
339
|
end
|
289
340
|
|
341
|
+
unless name.namespace.empty?
|
342
|
+
parent = name.namespace.to_type_name
|
343
|
+
if normalized_parent = normalize_module_name?(parent)
|
344
|
+
type_name = TypeName.new(namespace: normalized_parent.to_namespace, name: name.name)
|
345
|
+
else
|
346
|
+
@normalize_module_name_cache[name] = nil
|
347
|
+
return
|
348
|
+
end
|
349
|
+
else
|
350
|
+
type_name = name
|
351
|
+
end
|
352
|
+
|
290
353
|
@normalize_module_name_cache[name] = false
|
291
354
|
|
292
|
-
entry = constant_entry(
|
293
|
-
case entry
|
294
|
-
when ClassEntry, ModuleEntry
|
295
|
-
@normalize_module_name_cache[name] = entry.name
|
296
|
-
entry.name
|
355
|
+
entry = constant_entry(type_name)
|
297
356
|
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
357
|
+
normalized_type_name =
|
358
|
+
case entry
|
359
|
+
when ClassEntry, ModuleEntry
|
360
|
+
type_name
|
361
|
+
when ClassAliasEntry, ModuleAliasEntry
|
362
|
+
normalize_module_name?(entry.decl.old_name)
|
302
363
|
else
|
303
|
-
|
304
|
-
|
305
|
-
if normalized_parent = normalize_module_name?(parent)
|
306
|
-
@normalize_module_name_cache[name] =
|
307
|
-
if normalized_parent == parent
|
308
|
-
normalize_module_name?(old_name)
|
309
|
-
else
|
310
|
-
normalize_module_name?(
|
311
|
-
TypeName.new(name: old_name.name, namespace: normalized_parent.to_namespace)
|
312
|
-
)
|
313
|
-
end
|
314
|
-
else
|
315
|
-
@normalize_module_name_cache[name] = nil
|
316
|
-
end
|
364
|
+
nil
|
317
365
|
end
|
318
366
|
|
319
|
-
|
320
|
-
raise "#{name} is a constant name"
|
321
|
-
|
322
|
-
else
|
323
|
-
@normalize_module_name_cache[name] = nil
|
324
|
-
end
|
367
|
+
@normalize_module_name_cache[name] = normalized_type_name
|
325
368
|
end
|
326
369
|
|
327
370
|
def insert_decl(decl, outer:, namespace:)
|
data/lib/rbs/errors.rb
CHANGED
@@ -185,7 +185,8 @@ module RBS
|
|
185
185
|
end
|
186
186
|
|
187
187
|
def self.check!(super_decl, env:)
|
188
|
-
|
188
|
+
super_name = env.normalize_type_name(super_decl.name)
|
189
|
+
return if env.class_decl?(super_name) || env.class_alias?(super_name)
|
189
190
|
|
190
191
|
raise new(super_decl)
|
191
192
|
end
|
@@ -205,9 +206,8 @@ module RBS
|
|
205
206
|
end
|
206
207
|
|
207
208
|
def self.check!(self_type, env:)
|
208
|
-
|
209
|
-
|
210
|
-
(env.module_name?(type_name) || env.interface_name?(type_name)) or raise new(type_name: type_name, location: self_type.location)
|
209
|
+
self_name = env.normalize_type_name(self_type.name)
|
210
|
+
(env.module_name?(self_name) || env.interface_name?(self_name)) or raise new(type_name: self_type.name, location: self_type.location)
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
@@ -5,10 +5,12 @@ module RBS
|
|
5
5
|
class TypeNameResolver
|
6
6
|
attr_reader :all_names
|
7
7
|
attr_reader :cache
|
8
|
+
attr_reader :env
|
8
9
|
|
9
10
|
def initialize(env)
|
10
11
|
@all_names = Set[]
|
11
12
|
@cache = {}
|
13
|
+
@env = env
|
12
14
|
|
13
15
|
all_names.merge(env.class_decls.keys)
|
14
16
|
all_names.merge(env.interface_decls.keys)
|
@@ -29,22 +31,53 @@ module RBS
|
|
29
31
|
end
|
30
32
|
|
31
33
|
try_cache([type_name, context]) do
|
32
|
-
|
34
|
+
head, tail = partition(type_name)
|
35
|
+
|
36
|
+
head = resolve_in(head, context)
|
37
|
+
|
38
|
+
if head
|
39
|
+
if tail
|
40
|
+
absolute_name = tail.with_prefix(head.to_namespace)
|
41
|
+
if env.normalize_type_name?(absolute_name)
|
42
|
+
absolute_name
|
43
|
+
end
|
44
|
+
else
|
45
|
+
head
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def partition(type_name)
|
52
|
+
if type_name.namespace.empty?
|
53
|
+
head = type_name.name
|
54
|
+
tail = nil
|
55
|
+
else
|
56
|
+
head, *tail = type_name.namespace.path
|
57
|
+
|
58
|
+
head or raise
|
59
|
+
|
60
|
+
tail = TypeName.new(
|
61
|
+
name: type_name.name,
|
62
|
+
namespace: Namespace.new(absolute: false, path: tail)
|
63
|
+
)
|
33
64
|
end
|
65
|
+
|
66
|
+
[head, tail]
|
34
67
|
end
|
35
68
|
|
36
|
-
def resolve_in(
|
69
|
+
def resolve_in(head, context)
|
37
70
|
if context
|
38
71
|
parent, child = context
|
39
72
|
case child
|
40
73
|
when false
|
41
|
-
resolve_in(
|
74
|
+
resolve_in(head, parent)
|
42
75
|
when TypeName
|
43
|
-
name =
|
44
|
-
has_name?(name) || resolve_in(
|
76
|
+
name = TypeName.new(name: head, namespace: child.to_namespace)
|
77
|
+
has_name?(name) || resolve_in(head, parent)
|
45
78
|
end
|
46
79
|
else
|
47
|
-
has_name?(
|
80
|
+
has_name?(TypeName.new(name: head, namespace: Namespace.root))
|
48
81
|
end
|
49
82
|
end
|
50
83
|
|
@@ -20,7 +20,7 @@ module RBS
|
|
20
20
|
# Construct transitive closure, if not constructed already
|
21
21
|
transitive_closure() unless @dependencies
|
22
22
|
|
23
|
-
|
23
|
+
alias_name = env.normalize_type_name!(alias_name)
|
24
24
|
@dependencies[alias_name][alias_name]
|
25
25
|
end
|
26
26
|
|
@@ -49,6 +49,16 @@ module RBS
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
def direct_dependencies_of(name)
|
53
|
+
name = env.normalize_type_name!(name)
|
54
|
+
@direct_dependencies[name]
|
55
|
+
end
|
56
|
+
|
57
|
+
def dependencies_of(name)
|
58
|
+
name = env.normalize_type_name!(name)
|
59
|
+
@dependencies[name].each_key.to_set
|
60
|
+
end
|
61
|
+
|
52
62
|
private
|
53
63
|
|
54
64
|
# Constructs directed graph recursively
|
@@ -61,7 +71,7 @@ module RBS
|
|
61
71
|
end
|
62
72
|
when RBS::Types::Alias
|
63
73
|
# Append type name if the type is an alias
|
64
|
-
result << type.name
|
74
|
+
result << env.normalize_type_name(type.name)
|
65
75
|
end
|
66
76
|
|
67
77
|
result
|
@@ -37,10 +37,12 @@ module RBS
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def validate_alias_type(alias_type, names, types)
|
40
|
-
|
41
|
-
|
40
|
+
alias_name = env.normalize_type_name?(alias_type.name) or return
|
41
|
+
|
42
|
+
if names.include?(alias_name)
|
43
|
+
if ex_type = types[alias_name]
|
42
44
|
unless compatible_args?(ex_type.args, alias_type.args)
|
43
|
-
diagnostics[
|
45
|
+
diagnostics[alias_name] ||=
|
44
46
|
Diagnostic.new(type_name: alias_type.name, nonregular_type: alias_type)
|
45
47
|
end
|
46
48
|
|
@@ -49,7 +51,7 @@ module RBS
|
|
49
51
|
types[alias_type.name] = alias_type
|
50
52
|
end
|
51
53
|
|
52
|
-
expanded = builder.expand_alias2(
|
54
|
+
expanded = builder.expand_alias2(alias_name, alias_type.args)
|
53
55
|
each_alias_type(expanded) do |at|
|
54
56
|
validate_alias_type(at, names, types)
|
55
57
|
end
|
@@ -75,22 +77,27 @@ module RBS
|
|
75
77
|
end
|
76
78
|
|
77
79
|
def nonregular?(type_name)
|
78
|
-
diagnostics[type_name]
|
80
|
+
diagnostics[env.normalize_type_name!(type_name)]
|
79
81
|
end
|
80
82
|
|
81
83
|
def each_mutual_alias_defs(&block)
|
82
|
-
# @type var each_node:
|
83
|
-
each_node =
|
84
|
+
# @type var each_node: ^() { (TypeName) -> void } -> void
|
85
|
+
each_node = -> (&block) do
|
84
86
|
env.type_alias_decls.each_value do |decl|
|
85
|
-
|
87
|
+
if normalized = env.normalize_type_name?(decl.name)
|
88
|
+
block[normalized]
|
89
|
+
end
|
86
90
|
end
|
87
91
|
end
|
88
|
-
|
89
|
-
each_child
|
92
|
+
|
93
|
+
# @type var each_child: ^(TypeName) { (TypeName) -> void } -> void
|
94
|
+
each_child = -> (name, &block) do
|
90
95
|
if env.type_alias_decls.key?(name)
|
91
96
|
type = builder.expand_alias1(name)
|
92
97
|
each_alias_type(type) do |ty|
|
93
|
-
|
98
|
+
if normalized = env.normalize_type_name?(ty.name)
|
99
|
+
block[normalized]
|
100
|
+
end
|
94
101
|
end
|
95
102
|
end
|
96
103
|
end
|
data/lib/rbs/validator.rb
CHANGED
@@ -12,9 +12,9 @@ module RBS
|
|
12
12
|
@definition_builder = DefinitionBuilder.new(env: env)
|
13
13
|
end
|
14
14
|
|
15
|
-
def absolute_type(type, context
|
15
|
+
def absolute_type(type, context:, &block)
|
16
16
|
type.map_type_name do |type_name, _, type|
|
17
|
-
resolver.resolve(type_name, context: context) || yield(type)
|
17
|
+
resolver.resolve(type_name, context: context) || (block ? yield(type) : type_name)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -22,33 +22,34 @@ module RBS
|
|
22
22
|
def validate_type(type, context:)
|
23
23
|
case type
|
24
24
|
when Types::ClassInstance, Types::Interface, Types::Alias
|
25
|
-
|
26
|
-
if type.name.namespace.relative?
|
27
|
-
type = _ = absolute_type(type, context: context) do |_|
|
28
|
-
NoTypeFoundError.check!(type.name.absolute!, env: env, location: type.location)
|
29
|
-
end
|
30
|
-
end
|
25
|
+
type = absolute_type(type, context: context) #: Types::ClassInstance | Types::Interface | Types::Alias
|
31
26
|
|
32
27
|
definition_builder.validate_type_name(type.name, type.location)
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
29
|
+
normalized_type_name = env.normalize_type_name?(type.name)
|
30
|
+
|
31
|
+
if normalized_type_name
|
32
|
+
type_params =
|
33
|
+
case type
|
34
|
+
when Types::ClassInstance
|
35
|
+
entry = env.class_decls[normalized_type_name] or raise
|
36
|
+
entry.type_params
|
37
|
+
when Types::Interface
|
38
|
+
env.interface_decls[normalized_type_name].decl.type_params
|
39
|
+
when Types::Alias
|
40
|
+
env.type_alias_decls[normalized_type_name].decl.type_params
|
41
|
+
end
|
42
|
+
|
43
|
+
InvalidTypeApplicationError.check!(
|
44
|
+
type_name: type.name,
|
45
|
+
args: type.args,
|
46
|
+
params: type_params.each.map(&:name),
|
47
|
+
location: type.location
|
48
|
+
)
|
49
|
+
end
|
50
50
|
|
51
51
|
when Types::ClassSingleton
|
52
|
+
type = absolute_type(type, context: context) #: Types::ClassSingleton
|
52
53
|
definition_builder.validate_type_presence(type)
|
53
54
|
end
|
54
55
|
|
@@ -115,14 +116,14 @@ module RBS
|
|
115
116
|
end
|
116
117
|
|
117
118
|
def validate_type_params(params, type_name: , method_name: nil, location:)
|
118
|
-
# @type var each_node:
|
119
|
-
each_node =
|
119
|
+
# @type var each_node: ^() { (Symbol) -> void } -> void
|
120
|
+
each_node = -> (&block) do
|
120
121
|
params.each do |param|
|
121
122
|
block[param.name]
|
122
123
|
end
|
123
124
|
end
|
124
|
-
# @type var each_child:
|
125
|
-
each_child =
|
125
|
+
# @type var each_child: ^(Symbol) { (Symbol) -> void } -> void
|
126
|
+
each_child = -> (name, &block) do
|
126
127
|
if param = params.find {|p| p.name == name }
|
127
128
|
if b = param.upper_bound
|
128
129
|
b.free_variables.each do |tv|
|
@@ -108,8 +108,11 @@ module RBS
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def in_type_alias(name:)
|
111
|
+
env.normalized_type_name!(name)
|
112
|
+
|
111
113
|
decl = env.type_alias_decls[name].decl or raise
|
112
114
|
variables = decl.type_params.each.map(&:name)
|
115
|
+
|
113
116
|
Result.new(variables: variables).tap do |result|
|
114
117
|
type(decl.type, result: result, context: :covariant)
|
115
118
|
end
|
@@ -129,30 +132,30 @@ module RBS
|
|
129
132
|
end
|
130
133
|
end
|
131
134
|
when Types::ClassInstance, Types::Interface, Types::Alias
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
when :contravariant
|
153
|
-
type(ty, result: result, context: negate(context))
|
135
|
+
if type_name = env.normalize_type_name?(type.name)
|
136
|
+
type_params = case type
|
137
|
+
when Types::ClassInstance
|
138
|
+
env.class_decls[type_name].type_params
|
139
|
+
when Types::Interface
|
140
|
+
env.interface_decls[type_name].decl.type_params
|
141
|
+
when Types::Alias
|
142
|
+
env.type_alias_decls[type_name].decl.type_params
|
143
|
+
end
|
144
|
+
|
145
|
+
type.args.each.with_index do |ty, i|
|
146
|
+
if var = type_params[i]
|
147
|
+
case var.variance
|
148
|
+
when :invariant
|
149
|
+
type(ty, result: result, context: :invariant)
|
150
|
+
when :covariant
|
151
|
+
type(ty, result: result, context: context)
|
152
|
+
when :contravariant
|
153
|
+
type(ty, result: result, context: negate(context))
|
154
|
+
end
|
154
155
|
end
|
155
156
|
end
|
157
|
+
else
|
158
|
+
raise NoTypeFoundError.new(type_name: type.name, location: type.location)
|
156
159
|
end
|
157
160
|
when Types::Proc
|
158
161
|
function(type.type, result: result, context: context)
|
data/lib/rbs/version.rb
CHANGED
data/sig/definition_builder.rbs
CHANGED
@@ -71,12 +71,16 @@ module RBS
|
|
71
71
|
# Assumes the type names are already resolved.
|
72
72
|
# Raises NoTypeFoundError in case of failure.
|
73
73
|
#
|
74
|
+
# Normalizes type names in the given type automatically.
|
75
|
+
#
|
74
76
|
def validate_type_presence: (Types::t) -> void
|
75
77
|
|
76
78
|
# Validates presence of an absolute type name
|
77
79
|
#
|
78
80
|
# Raises NoTypeFoundError in case of error.
|
79
81
|
#
|
82
|
+
# Normalizes the given type name automatically.
|
83
|
+
#
|
80
84
|
def validate_type_name: (TypeName, Location[untyped, untyped]?) -> void
|
81
85
|
|
82
86
|
# Returns a new DefinitionBuilder with updated Environment, AncestorBuilder, and exceptions
|
data/sig/environment.rbs
CHANGED
@@ -224,6 +224,33 @@ module RBS
|
|
224
224
|
#
|
225
225
|
def normalize_module_name: (TypeName) -> TypeName
|
226
226
|
|
227
|
+
# Returns a normalized module/class name or a type name with a normalized namespace
|
228
|
+
#
|
229
|
+
# * Calls `#absolute!` for relative module names
|
230
|
+
# * Returns `nil` if the typename cannot be found
|
231
|
+
# * Returns `false` if the name is cyclic
|
232
|
+
#
|
233
|
+
def normalize_type_name?: (TypeName) -> (TypeName | nil | false)
|
234
|
+
|
235
|
+
# Normalize the type name or raises an error
|
236
|
+
#
|
237
|
+
def normalize_type_name!: (TypeName) -> TypeName
|
238
|
+
|
239
|
+
# Returns a normalized module/class name or a type name with a normalized namespace
|
240
|
+
#
|
241
|
+
# * Calls `#absolute!` for relative module names
|
242
|
+
# * Returns the typename itself if the name cannot be normalized
|
243
|
+
#
|
244
|
+
def normalize_type_name: (TypeName) -> TypeName
|
245
|
+
|
246
|
+
# Returns `true` if given type name is normalized
|
247
|
+
#
|
248
|
+
def normalized_type_name?: (TypeName) -> bool
|
249
|
+
|
250
|
+
# Returns the given type name if it's normalized, or raises
|
251
|
+
#
|
252
|
+
def normalized_type_name!: (TypeName) -> TypeName
|
253
|
+
|
227
254
|
# Runs generics type params validation over each class definitions
|
228
255
|
def validate_type_params: () -> void
|
229
256
|
|
data/sig/errors.rbs
CHANGED
@@ -90,6 +90,8 @@ module RBS
|
|
90
90
|
|
91
91
|
def initialize: (type_name: TypeName, location: Location[untyped, untyped]?) -> void
|
92
92
|
|
93
|
+
# The type name in `self` is automatically normalized
|
94
|
+
#
|
93
95
|
def self.check!: (AST::Declarations::Module::Self, env: Environment) -> void
|
94
96
|
end
|
95
97
|
|
@@ -244,6 +246,10 @@ module RBS
|
|
244
246
|
|
245
247
|
def location: () -> Location[untyped, untyped]?
|
246
248
|
|
249
|
+
# Confirms if `super` inherits specifies a class
|
250
|
+
#
|
251
|
+
# Automatically normalize the name of super.
|
252
|
+
#
|
247
253
|
def self.check!: (AST::Declarations::Class::Super, env: Environment) -> void
|
248
254
|
end
|
249
255
|
|
@@ -17,6 +17,8 @@ module RBS
|
|
17
17
|
|
18
18
|
private
|
19
19
|
|
20
|
+
attr_reader env: Environment
|
21
|
+
|
20
22
|
attr_reader all_names: Set[TypeName]
|
21
23
|
|
22
24
|
attr_reader cache: Hash[query, TypeName?]
|
@@ -25,7 +27,9 @@ module RBS
|
|
25
27
|
|
26
28
|
def try_cache: (query) { () -> TypeName? } -> TypeName?
|
27
29
|
|
28
|
-
def resolve_in: (
|
30
|
+
def resolve_in: (Symbol, context) -> TypeName?
|
31
|
+
|
32
|
+
def partition: (TypeName) -> [Symbol, TypeName?]
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
@@ -1,14 +1,45 @@
|
|
1
1
|
module RBS
|
2
|
+
# TypeAliasDependency calculates the dependnecies between type aliases
|
3
|
+
#
|
4
|
+
# The dependencies are normalized automatically.
|
5
|
+
#
|
2
6
|
class TypeAliasDependency
|
3
7
|
attr_reader env: Environment
|
4
8
|
|
9
|
+
# A hash table from type alias name to it's direct dependencies
|
10
|
+
#
|
11
|
+
# The source type name and dependencies are normalized.
|
12
|
+
#
|
5
13
|
attr_reader direct_dependencies: Hash[TypeName, Set[TypeName]]
|
14
|
+
|
15
|
+
# A hash table from type alias name to a hash name with keys of transitive dependnecies
|
16
|
+
#
|
17
|
+
# The source type name and dependencies are normalized.
|
18
|
+
#
|
6
19
|
attr_reader dependencies: Hash[TypeName, Hash[TypeName, bool]]
|
7
20
|
|
8
21
|
def initialize: (env: Environment) -> void
|
9
22
|
|
23
|
+
# Returns `true` if given type alias is circular
|
24
|
+
#
|
25
|
+
# Normalized given type name automatically.
|
26
|
+
#
|
10
27
|
def circular_definition?: (TypeName alias_name) -> bool
|
11
28
|
|
29
|
+
# Returns the set of direct dependencies from the given type name
|
30
|
+
#
|
31
|
+
# Given type name will be normalized automatically.
|
32
|
+
# Returns normalized type names.
|
33
|
+
#
|
34
|
+
def direct_dependencies_of: (TypeName) -> Set[TypeName]
|
35
|
+
|
36
|
+
# Returns the set of dependencies from the given type name
|
37
|
+
#
|
38
|
+
# Given type name will be normalized automatically.
|
39
|
+
# Returns normalized type names.
|
40
|
+
#
|
41
|
+
def dependencies_of: (TypeName) -> Set[TypeName]
|
42
|
+
|
12
43
|
def build_dependencies: () -> void
|
13
44
|
|
14
45
|
def transitive_closure: () -> void
|
@@ -36,6 +36,9 @@ module RBS
|
|
36
36
|
|
37
37
|
attr_reader builder: DefinitionBuilder
|
38
38
|
|
39
|
+
# Diagnostics of each type aliases.
|
40
|
+
# The type names are normalized.
|
41
|
+
#
|
39
42
|
attr_reader diagnostics: Hash[TypeName, Diagnostic]
|
40
43
|
|
41
44
|
# `Diagnostic` represents an non-regular type alias declaration error.
|
@@ -70,6 +73,8 @@ module RBS
|
|
70
73
|
# Returns `Diagnostic` instance if the alias type is nonregular.
|
71
74
|
# Regurns `nil` if the alias type is regular.
|
72
75
|
#
|
76
|
+
# Normalizes the given type name automatically.
|
77
|
+
#
|
73
78
|
def nonregular?: (TypeName) -> Diagnostic?
|
74
79
|
|
75
80
|
def validate: () -> void
|
@@ -87,6 +92,7 @@ module RBS
|
|
87
92
|
|
88
93
|
def each_alias_type: (Types::t) { (Types::Alias) -> void } -> void
|
89
94
|
|
95
|
+
# Yields set of normalized type names
|
90
96
|
def each_mutual_alias_defs: () { (Set[TypeName]) -> void } -> void
|
91
97
|
end
|
92
98
|
end
|
data/sig/validator.rbs
CHANGED
@@ -46,7 +46,7 @@ module RBS
|
|
46
46
|
#
|
47
47
|
# - The right hand side can be normalized
|
48
48
|
# - No mixing alias declaration between class and modules
|
49
|
-
#
|
49
|
+
#
|
50
50
|
def validate_class_alias: (entry: Environment::ClassAliasEntry | Environment::ModuleAliasEntry) -> void
|
51
51
|
|
52
52
|
private
|
@@ -54,6 +54,6 @@ module RBS
|
|
54
54
|
# Resolves relative type names to absolute type names in given context.
|
55
55
|
# Yields the type when the type name resolution using `#resolver` fails.
|
56
56
|
#
|
57
|
-
def absolute_type: (Types::t, context: Resolver::context) { (Types::t) -> TypeName } -> Types::t
|
57
|
+
def absolute_type: (Types::t, context: Resolver::context) ?{ (Types::t) -> TypeName } -> Types::t
|
58
58
|
end
|
59
59
|
end
|
data/sig/variance_calculator.rbs
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: RBS is the language for type signatures for Ruby and standard library
|
14
14
|
definitions.
|