rbs 3.1.1 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38298f073fa4b8e071ba2f38a13640e4143a4a64981e16535a214364ce99a536
4
- data.tar.gz: 0a818cb58aac7767500da1bd57b4a06d193232a1c8b0fa88537c372af542b180
3
+ metadata.gz: 3eecea95d764201e888ed754df209a3c948d8f703bc31453f53dcef86690ac35
4
+ data.tar.gz: 43d8c75f856ca9d9790b5ef451407dc9a9ea21c8dec48708cc425633f1faaa2a
5
5
  SHA512:
6
- metadata.gz: cf52478cb1f82d103499796eae6e946925b79faca65cf7c52665ebb9966fcf3d8f2a344bf7806dffe7abe8d8e8f5b49e01c0e4bb58bb54fb870104582a84d2e6
7
- data.tar.gz: f63f19cff5e7246dc3d9e6fe6c1ed46256eae0f83f6c939d50bda1adb5ff78de8e71c4f9864c6059da338485046ad7b936b8b65d1d838610eebb4bf902013bad
6
+ metadata.gz: 7ae9f227f01d1ffe6ec4a8653eac72a83394300e8674d70694ee31abdc2bea71371d07652c9557e5721a352ecb7b063b9373b8589ab9caa2e1513a71809fb790
7
+ data.tar.gz: ae92f774b5f1f1992cb2f6f364205e10e6044e761e68fee7356f1836e352c4f5519d1039fe2ecdd14dc88e70d0f8a276da52775f171def6214f0db9e29a23541
data/CHANGELOG.md CHANGED
@@ -2,24 +2,41 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 3.1.3 (2023-07-31)
6
+
7
+ ### Library changes
8
+
9
+ #### rbs collection
10
+
11
+ * Generate gem specific sources in lockfile (Backport [#1402](https://github.com/ruby/rbs/pull/1402))
12
+
13
+ ## 3.1.2 (2023-07-27)
14
+
15
+ ⚠️ 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)).
16
+
17
+ ### Library changes
18
+
19
+ * Make `TypeNameResolver` more compatible with Ruby (Backport [#1373](https://github.com/ruby/rbs/pull/1373))
20
+ * Fix module alias normalizations (Backport [#1393](https://github.com/ruby/rbs/pull/1393))
21
+
5
22
  ## 3.1.1 (2023-07-18)
6
23
 
7
24
  ### Signature updates
8
25
 
9
- * Removed `GC.verify_transient_heap_internal_consistency` ([#1374](https://github.com/ruby/rbs/pull/1374))
26
+ * Removed `GC.verify_transient_heap_internal_consistency` (Backport [#1374](https://github.com/ruby/rbs/pull/1374))
10
27
 
11
28
  ### Library changes
12
29
 
13
- * Relax rdoc version requirement in RDoc plugin ([#1333](https://github.com/ruby/rbs/pull/1333))
30
+ * Relax rdoc version requirement in RDoc plugin (Backport [#1333](https://github.com/ruby/rbs/pull/1333))
14
31
 
15
32
  #### rbs collection
16
33
 
17
- * Spec may be missing when rbs_collection.yaml declares dependency ([#1378](https://github.com/ruby/rbs/pull/1378))
34
+ * Spec may be missing when rbs_collection.yaml declares dependency (Backport [#1378](https://github.com/ruby/rbs/pull/1378))
18
35
 
19
36
  ### Miscellaneous
20
37
 
21
- * Handle connection error with Resolv_test.rb ([#1356](https://github.com/ruby/rbs/pull/1356))
22
- * Fix broken CI ([#1353](https://github.com/ruby/rbs/pull/1353))
38
+ * Handle connection error with Resolv_test.rb (Backport [#1356](https://github.com/ruby/rbs/pull/1356))
39
+ * Fix broken CI (Backport [#1353](https://github.com/ruby/rbs/pull/1353))
23
40
 
24
41
  ## 3.1.0 (2023-04-26)
25
42
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbs (3.1.1)
4
+ rbs (3.1.3)
5
5
 
6
6
  PATH
7
7
  remote: test/assets/test-gem
@@ -20,7 +20,7 @@ module RBS
20
20
  end
21
21
  end
22
22
 
23
- attr_reader :config, :lockfile, :definition, :existing_lockfile, :gem_hash
23
+ attr_reader :config, :lockfile, :definition, :existing_lockfile, :gem_hash, :gem_entries
24
24
 
25
25
  def self.generate(config:, definition:, with_lockfile: true)
26
26
  generator = new(config: config, definition: definition, with_lockfile: with_lockfile)
@@ -31,6 +31,11 @@ module RBS
31
31
  def initialize(config:, definition:, with_lockfile:)
32
32
  @config = config
33
33
 
34
+ @gem_entries = config.gems.each.with_object({}) do |entry, hash| #$ Hash[String, gem_entry?]
35
+ name = entry["name"]
36
+ hash[name] = entry
37
+ end
38
+
34
39
  lockfile_path = Config.to_lockfile_path(config.config_path)
35
40
  lockfile_dir = lockfile_path.parent
36
41
 
@@ -58,15 +63,13 @@ module RBS
58
63
  end
59
64
 
60
65
  def generate
61
- ignored_gems = config.gems.select {|gem| gem["ignore"] }.map {|gem| gem["name"] }.to_set
62
-
63
66
  config.gems.each do |gem|
64
67
  if Sources::Stdlib.instance.has?(gem["name"], nil) || gem.dig("source", "type") == "stdlib"
65
- unless ignored_gems.include?(gem["name"])
68
+ unless gem.fetch("ignore", false)
66
69
  assign_stdlib(name: gem["name"], from_gem: nil)
67
70
  end
68
71
  else
69
- assign_gem(name: gem["name"], version: gem["version"], ignored_gems: ignored_gems, src_data: gem["source"])
72
+ assign_gem(name: gem["name"], version: gem["version"])
70
73
  end
71
74
  end
72
75
 
@@ -76,7 +79,7 @@ module RBS
76
79
  end
77
80
 
78
81
  if spec = gem_hash[dep.name]
79
- assign_gem(name: dep.name, version: spec.version, ignored_gems: ignored_gems, src_data: nil, skip: dep.source.is_a?(Bundler::Source::Gemspec))
82
+ assign_gem(name: dep.name, version: spec.version, skip: dep.source.is_a?(Bundler::Source::Gemspec))
80
83
  end
81
84
  end
82
85
 
@@ -91,8 +94,12 @@ module RBS
91
94
  end
92
95
  end
93
96
 
94
- private def assign_gem(name:, version:, src_data:, ignored_gems:, skip: false)
95
- return if ignored_gems.include?(name)
97
+ private def assign_gem(name:, version:, skip: false)
98
+ entry = gem_entries[name]
99
+ src_data = entry&.fetch("source", nil)
100
+ ignored = entry&.fetch("ignore", false)
101
+
102
+ return if ignored
96
103
  return if lockfile.gems.key?(name)
97
104
 
98
105
  unless skip
@@ -136,7 +143,7 @@ module RBS
136
143
  if spec = gem_hash.fetch(name, nil)
137
144
  spec.dependencies.each do |dep|
138
145
  if dep_spec = gem_hash[dep.name]
139
- assign_gem(name: dep.name, version: dep_spec.version, src_data: nil, ignored_gems: ignored_gems)
146
+ assign_gem(name: dep.name, version: dep_spec.version)
140
147
  end
141
148
  end
142
149
  else
@@ -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
@@ -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! if name.relative!
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(name)
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
- when ClassAliasEntry, ModuleAliasEntry
299
- old_name = entry.decl.old_name
300
- if old_name.namespace.empty?
301
- @normalize_module_name_cache[name] = normalize_module_name?(old_name)
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
- parent = old_name.namespace.to_type_name
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
- when ConstantEntry
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
- return if env.class_decl?(super_decl.name) || env.class_alias?(super_decl.name)
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
- type_name = self_type.name
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
- resolve_in(type_name, context)
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(type_name, context)
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(type_name, parent)
74
+ resolve_in(head, parent)
42
75
  when TypeName
43
- name = type_name.with_prefix(child.to_namespace)
44
- has_name?(name) || resolve_in(type_name, parent)
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?(type_name.absolute!)
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
- # Check for recursive type alias
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
- if names.include?(alias_type.name)
41
- if ex_type = types[alias_type.name]
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[alias_type.name] ||=
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(alias_type.name, alias_type.args)
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: TSort::_EachNode[TypeName]
83
- each_node = __skip__ = -> (&block) do
84
+ # @type var each_node: ^() { (TypeName) -> void } -> void
85
+ each_node = -> (&block) do
84
86
  env.type_alias_decls.each_value do |decl|
85
- block[decl.name]
87
+ if normalized = env.normalize_type_name?(decl.name)
88
+ block[normalized]
89
+ end
86
90
  end
87
91
  end
88
- # @type var each_child: TSort::_EachChild[TypeName]
89
- each_child = __skip__ = -> (name, &block) do
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
- block[ty.name]
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
- # @type var type: Types::ClassInstance | Types::Interface | Types::Alias
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
- type_params = case type
35
- when Types::ClassInstance
36
- entry = env.normalized_module_class_entry(type.name) or raise
37
- entry.type_params
38
- when Types::Interface
39
- env.interface_decls[type.name].decl.type_params
40
- when Types::Alias
41
- env.type_alias_decls[type.name].decl.type_params
42
- end
43
-
44
- InvalidTypeApplicationError.check!(
45
- type_name: type.name,
46
- args: type.args,
47
- params: type_params.each.map(&:name),
48
- location: type.location
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: TSort::_EachNode[Symbol]
119
- each_node = __skip__ = -> (&block) do
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: TSort::_EachChild[Symbol]
125
- each_child = __skip__ = -> (name, &block) do
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
- NoTypeFoundError.check!(type.name,
133
- env: env,
134
- location: type.location)
135
-
136
- type_params = case type
137
- when Types::ClassInstance
138
- env.class_decls[env.normalize_module_name(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))
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RBS
4
- VERSION = "3.1.1"
4
+ VERSION = "3.1.3"
5
5
  end
@@ -22,6 +22,9 @@ module RBS
22
22
  # A hash table to look up a spec from name of the gem
23
23
  attr_reader gem_hash: Hash[String, Bundler::LazySpecification]
24
24
 
25
+ # A hash table to look up a gem entry in collection config from the name of the gem
26
+ attr_reader gem_entries: Hash[String, gem_entry?]
27
+
25
28
  def self.generate: (config: Config, definition: Bundler::Definition, ?with_lockfile: boolish) -> Lockfile
26
29
 
27
30
  def initialize: (config: Config, definition: Bundler::Definition, with_lockfile: boolish) -> void
@@ -38,7 +41,7 @@ module RBS
38
41
  #
39
42
  # * If `skip:` is true, it skips adding the gem, but adds it's dependencies.
40
43
  #
41
- def assign_gem: (name: String, version: String?, src_data: Sources::source_entry?, ignored_gems: Set[String], ?skip: bool) -> void
44
+ def assign_gem: (name: String, version: String?, ?skip: bool) -> void
42
45
 
43
46
  def assign_stdlib: (name: String, from_gem: String?) -> void
44
47
 
@@ -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: (TypeName, context) -> TypeName?
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
@@ -72,6 +72,8 @@ module RBS
72
72
 
73
73
  def in_inherit: (name: TypeName, args: Array[Types::t], variables: Array[Symbol]) -> Result
74
74
 
75
+ # The type name must be normalized
76
+ #
75
77
  def in_type_alias: (name: TypeName) -> Result
76
78
 
77
79
  private
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.1
4
+ version: 3.1.3
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-18 00:00:00.000000000 Z
11
+ date: 2023-07-31 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.