rbs 3.0.0.dev.1 → 3.0.0.dev.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +0 -3
- data/CHANGELOG.md +28 -0
- data/Gemfile.lock +2 -2
- data/README.md +1 -0
- data/Rakefile +75 -1
- data/core/array.rbs +1 -1
- data/core/builtin.rbs +1 -1
- data/core/hash.rbs +1 -1
- data/core/module.rbs +1 -1
- data/ext/rbs_extension/constants.c +16 -2
- data/ext/rbs_extension/constants.h +8 -1
- data/ext/rbs_extension/extconf.rb +1 -1
- data/ext/rbs_extension/lexer.c +834 -777
- data/ext/rbs_extension/lexer.h +3 -1
- data/ext/rbs_extension/lexer.re +3 -1
- data/ext/rbs_extension/lexstate.c +4 -2
- data/ext/rbs_extension/parser.c +264 -44
- data/ext/rbs_extension/ruby_objs.c +56 -2
- data/ext/rbs_extension/ruby_objs.h +7 -1
- data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
- data/lib/rbs/ast/declarations.rb +49 -2
- data/lib/rbs/ast/directives.rb +39 -0
- data/lib/rbs/cli.rb +32 -18
- data/lib/rbs/collection/config/lockfile_generator.rb +25 -20
- data/lib/rbs/collection/config.rb +2 -2
- data/lib/rbs/collection/sources/git.rb +1 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +24 -8
- data/lib/rbs/definition_builder.rb +8 -8
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +352 -83
- data/lib/rbs/environment_loader.rb +9 -7
- data/lib/rbs/environment_walker.rb +1 -1
- data/lib/rbs/errors.rb +34 -37
- data/lib/rbs/locator.rb +1 -1
- data/lib/rbs/parser_aux.rb +8 -6
- data/lib/rbs/resolver/constant_resolver.rb +23 -7
- data/lib/rbs/resolver/type_name_resolver.rb +2 -1
- data/lib/rbs/sorter.rb +3 -3
- data/lib/rbs/test/setup.rb +1 -1
- data/lib/rbs/type_alias_dependency.rb +1 -1
- data/lib/rbs/type_alias_regularity.rb +3 -3
- data/lib/rbs/validator.rb +23 -2
- data/lib/rbs/variance_calculator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +28 -2
- data/lib/rbs.rb +2 -2
- data/lib/rdoc_plugin/parser.rb +2 -2
- data/rbs.gemspec +1 -1
- data/sig/ancestor_graph.rbs +22 -2
- data/sig/collection/config/lockfile_generator.rbs +8 -10
- data/sig/collection/config.rbs +1 -1
- data/sig/collection/sources.rbs +12 -6
- data/sig/constant.rbs +1 -1
- data/sig/declarations.rbs +36 -3
- data/sig/definition.rbs +1 -1
- data/sig/definition_builder.rbs +0 -1
- data/sig/directives.rbs +61 -0
- data/sig/environment.rbs +150 -28
- data/sig/environment_loader.rbs +1 -1
- data/sig/errors.rbs +22 -1
- data/sig/parser.rbs +8 -15
- data/sig/resolver/constant_resolver.rbs +1 -2
- data/sig/shims/bundler.rbs +18 -0
- data/sig/shims/rubygems.rbs +6 -0
- data/sig/use_map.rbs +35 -0
- data/sig/validator.rbs +12 -5
- data/sig/writer.rbs +4 -2
- metadata +7 -9
- data/lib/rbs/constant_table.rb +0 -167
- data/lib/rbs/type_name_resolver.rb +0 -67
- data/sig/constant_table.rbs +0 -30
- data/sig/type_name_resolver.rbs +0 -26
- data/steep/Gemfile +0 -3
- data/steep/Gemfile.lock +0 -61
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RBS
|
4
|
+
module AST
|
5
|
+
module Directives
|
6
|
+
class Base
|
7
|
+
end
|
8
|
+
|
9
|
+
class Use < Base
|
10
|
+
class SingleClause
|
11
|
+
attr_reader :type_name, :new_name, :location
|
12
|
+
|
13
|
+
def initialize(type_name:, new_name:, location:)
|
14
|
+
@type_name = type_name
|
15
|
+
@new_name = new_name
|
16
|
+
@location = location
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class WildcardClause
|
21
|
+
attr_reader :namespace, :location
|
22
|
+
|
23
|
+
def initialize(namespace:, location:)
|
24
|
+
@location = location
|
25
|
+
@namespace = namespace
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_reader :clauses, :location
|
30
|
+
|
31
|
+
def initialize(clauses:, location:)
|
32
|
+
@clauses = clauses
|
33
|
+
@location = location
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/rbs/cli.rb
CHANGED
@@ -438,15 +438,15 @@ EOU
|
|
438
438
|
env = Environment.from_loader(loader).resolve_type_names
|
439
439
|
|
440
440
|
builder = DefinitionBuilder.new(env: env)
|
441
|
-
validator = Validator.new(env: env, resolver: TypeNameResolver.
|
441
|
+
validator = Validator.new(env: env, resolver: Resolver::TypeNameResolver.new(env))
|
442
442
|
|
443
443
|
env.class_decls.each do |name, decl|
|
444
444
|
stdout.puts "Validating class/module definition: `#{name}`..."
|
445
445
|
builder.build_instance(name).each_type do |type|
|
446
|
-
validator.validate_type type, context:
|
446
|
+
validator.validate_type type, context: nil
|
447
447
|
end
|
448
448
|
builder.build_singleton(name).each_type do |type|
|
449
|
-
validator.validate_type type, context:
|
449
|
+
validator.validate_type type, context: nil
|
450
450
|
end
|
451
451
|
|
452
452
|
d = decl.primary.decl
|
@@ -467,10 +467,15 @@ EOU
|
|
467
467
|
end
|
468
468
|
end
|
469
469
|
|
470
|
+
env.class_alias_decls.each do |name, entry|
|
471
|
+
stdout.puts "Validating class/module alias definition: `#{name}`..."
|
472
|
+
validator.validate_class_alias(entry: entry)
|
473
|
+
end
|
474
|
+
|
470
475
|
env.interface_decls.each do |name, decl|
|
471
476
|
stdout.puts "Validating interface: `#{name}`..."
|
472
477
|
builder.build_interface(name).each_type do |type|
|
473
|
-
validator.validate_type type, context:
|
478
|
+
validator.validate_type type, context: nil
|
474
479
|
end
|
475
480
|
|
476
481
|
validator.validate_type_params(
|
@@ -495,13 +500,13 @@ EOU
|
|
495
500
|
|
496
501
|
env.global_decls.each do |name, global|
|
497
502
|
stdout.puts "Validating global: `#{name}`..."
|
498
|
-
validator.validate_type global.decl.type, context:
|
503
|
+
validator.validate_type global.decl.type, context: nil
|
499
504
|
end
|
500
505
|
|
501
|
-
env.
|
506
|
+
env.type_alias_decls.each do |name, decl|
|
502
507
|
stdout.puts "Validating alias: `#{name}`..."
|
503
508
|
builder.expand_alias1(name).tap do |type|
|
504
|
-
validator.validate_type type, context:
|
509
|
+
validator.validate_type type, context: nil
|
505
510
|
end
|
506
511
|
validator.validate_type_alias(entry: decl)
|
507
512
|
end
|
@@ -537,14 +542,26 @@ EOU
|
|
537
542
|
env = Environment.from_loader(loader).resolve_type_names
|
538
543
|
|
539
544
|
builder = DefinitionBuilder.new(env: env)
|
540
|
-
|
545
|
+
resolver = Resolver::ConstantResolver.new(builder: builder)
|
541
546
|
|
542
|
-
|
543
|
-
stdout.puts "Context: #{
|
544
|
-
|
545
|
-
stdout.puts "Constant name: #{
|
547
|
+
resolver_context = context ? [nil, TypeName(context).absolute!] : nil #: Resolver::context
|
548
|
+
stdout.puts "Context: #{context}"
|
549
|
+
const_name = TypeName(args[0])
|
550
|
+
stdout.puts "Constant name: #{const_name}"
|
551
|
+
|
552
|
+
if const_name.absolute?
|
553
|
+
constant = resolver.table.constant(const_name)
|
554
|
+
else
|
555
|
+
head, *components = const_name.to_namespace.path
|
556
|
+
head or raise
|
546
557
|
|
547
|
-
|
558
|
+
constant = resolver.resolve(head, context: resolver_context)
|
559
|
+
constant = components.inject(constant) do |const, component|
|
560
|
+
if const
|
561
|
+
resolver.resolve_child(const.name, component)
|
562
|
+
end
|
563
|
+
end
|
564
|
+
end
|
548
565
|
|
549
566
|
if constant
|
550
567
|
stdout.puts " => #{constant.name}: #{constant.type}"
|
@@ -1043,15 +1060,12 @@ EOB
|
|
1043
1060
|
case args[0]
|
1044
1061
|
when 'install'
|
1045
1062
|
unless params[:frozen]
|
1046
|
-
|
1047
|
-
Collection::Config.generate_lockfile(config_path: config_path, gemfile_lock_path: gemfile_lock_path)
|
1063
|
+
Collection::Config.generate_lockfile(config_path: config_path, definition: Bundler.definition)
|
1048
1064
|
end
|
1049
1065
|
Collection::Installer.new(lockfile_path: lock_path, stdout: stdout).install_from_lockfile
|
1050
1066
|
when 'update'
|
1051
|
-
gemfile_lock_path = Bundler.default_lockfile
|
1052
|
-
|
1053
1067
|
# TODO: Be aware of argv to update only specified gem
|
1054
|
-
Collection::Config.generate_lockfile(config_path: config_path,
|
1068
|
+
Collection::Config.generate_lockfile(config_path: config_path, definition: Bundler.definition, with_lockfile: false)
|
1055
1069
|
Collection::Installer.new(lockfile_path: lock_path, stdout: stdout).install_from_lockfile
|
1056
1070
|
when 'init'
|
1057
1071
|
if config_path.exist?
|
@@ -20,15 +20,15 @@ module RBS
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
attr_reader :config, :lockfile, :
|
23
|
+
attr_reader :config, :lockfile, :definition, :existing_lockfile, :gem_hash
|
24
24
|
|
25
|
-
def self.generate(config:,
|
26
|
-
generator = new(config: config,
|
25
|
+
def self.generate(config:, definition:, with_lockfile: true)
|
26
|
+
generator = new(config: config, definition: definition, with_lockfile: with_lockfile)
|
27
27
|
generator.generate
|
28
28
|
generator.lockfile
|
29
29
|
end
|
30
30
|
|
31
|
-
def initialize(config:,
|
31
|
+
def initialize(config:, definition:, with_lockfile:)
|
32
32
|
@config = config
|
33
33
|
|
34
34
|
lockfile_path = Config.to_lockfile_path(config.config_path)
|
@@ -37,7 +37,7 @@ module RBS
|
|
37
37
|
@lockfile = Lockfile.new(
|
38
38
|
lockfile_path: lockfile_path,
|
39
39
|
path: config.repo_path_data,
|
40
|
-
gemfile_lock_path:
|
40
|
+
gemfile_lock_path: definition.lockfile.relative_path_from(lockfile_dir)
|
41
41
|
)
|
42
42
|
config.sources.each do |source|
|
43
43
|
case source
|
@@ -48,10 +48,13 @@ module RBS
|
|
48
48
|
|
49
49
|
if with_lockfile && lockfile_path.file?
|
50
50
|
@existing_lockfile = Lockfile.from_lockfile(lockfile_path: lockfile_path, data: YAML.load_file(lockfile_path.to_s))
|
51
|
-
validate_gemfile_lock_path!(lock: @existing_lockfile, gemfile_lock_path:
|
51
|
+
validate_gemfile_lock_path!(lock: @existing_lockfile, gemfile_lock_path: definition.lockfile)
|
52
52
|
end
|
53
53
|
|
54
|
-
@
|
54
|
+
@definition = definition
|
55
|
+
@gem_hash = definition.locked_gems.specs.each.with_object({}) do |spec, hash| #$ Hash[String, Bundler::LazySpecification]
|
56
|
+
hash[spec.name] = spec
|
57
|
+
end
|
55
58
|
end
|
56
59
|
|
57
60
|
def generate
|
@@ -67,8 +70,13 @@ module RBS
|
|
67
70
|
end
|
68
71
|
end
|
69
72
|
|
70
|
-
|
71
|
-
|
73
|
+
definition.dependencies.each do |dep|
|
74
|
+
if dep.autorequire && dep.autorequire.empty?
|
75
|
+
next
|
76
|
+
end
|
77
|
+
|
78
|
+
spec = gem_hash[dep.name] or raise "Cannot find `#{dep.name}` in bundler context"
|
79
|
+
assign_gem(name: dep.name, version: spec.version, ignored_gems: ignored_gems, src_data: nil)
|
72
80
|
end
|
73
81
|
|
74
82
|
lockfile.lockfile_path.write(YAML.dump(lockfile.to_lockfile))
|
@@ -82,7 +90,7 @@ module RBS
|
|
82
90
|
end
|
83
91
|
end
|
84
92
|
|
85
|
-
private def assign_gem(name:, version:,
|
93
|
+
private def assign_gem(name:, version:, src_data:, ignored_gems:)
|
86
94
|
return if ignored_gems.include?(name)
|
87
95
|
return if lockfile.gems.key?(name)
|
88
96
|
|
@@ -99,9 +107,8 @@ module RBS
|
|
99
107
|
if src_data
|
100
108
|
Sources.from_config_entry(src_data)
|
101
109
|
else
|
102
|
-
find_source(name: name)
|
110
|
+
find_source(name: name) or return
|
103
111
|
end
|
104
|
-
return unless source
|
105
112
|
|
106
113
|
installed_version = version
|
107
114
|
best_version = find_best_version(version: installed_version, versions: source.versions(name))
|
@@ -116,11 +123,15 @@ module RBS
|
|
116
123
|
locked or raise
|
117
124
|
|
118
125
|
lockfile.gems[name] = locked
|
119
|
-
source = locked[:source]
|
120
126
|
|
121
|
-
source.dependencies_of(locked[:name], locked[:version])&.each do |dep|
|
127
|
+
locked[:source].dependencies_of(locked[:name], locked[:version])&.each do |dep|
|
122
128
|
assign_stdlib(name: dep["name"], from_gem: name)
|
123
129
|
end
|
130
|
+
|
131
|
+
gem_hash[name].dependencies.each do |dep|
|
132
|
+
spec = gem_hash[dep.name]
|
133
|
+
assign_gem(name: dep.name, version: spec.version, src_data: nil, ignored_gems: ignored_gems)
|
134
|
+
end
|
124
135
|
end
|
125
136
|
|
126
137
|
private def assign_stdlib(name:, from_gem:)
|
@@ -150,12 +161,6 @@ module RBS
|
|
150
161
|
end
|
151
162
|
end
|
152
163
|
|
153
|
-
private def gemfile_lock_gems(&block)
|
154
|
-
gemfile_lock.specs.each do |spec|
|
155
|
-
yield spec
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
164
|
private def find_source(name:)
|
160
165
|
sources = config.sources
|
161
166
|
|
@@ -31,9 +31,9 @@ module RBS
|
|
31
31
|
|
32
32
|
# Generate a rbs lockfile from Gemfile.lock to `config_path`.
|
33
33
|
# If `with_lockfile` is true, it respects existing rbs lockfile.
|
34
|
-
def self.generate_lockfile(config_path:,
|
34
|
+
def self.generate_lockfile(config_path:, definition:, with_lockfile: true)
|
35
35
|
config = from_path(config_path)
|
36
|
-
lockfile = LockfileGenerator.generate(config: config,
|
36
|
+
lockfile = LockfileGenerator.generate(config: config, definition: definition, with_lockfile: with_lockfile)
|
37
37
|
|
38
38
|
[config, lockfile]
|
39
39
|
end
|
@@ -190,6 +190,8 @@ module RBS
|
|
190
190
|
end
|
191
191
|
|
192
192
|
def one_instance_ancestors(type_name)
|
193
|
+
type_name = env.normalize_module_name(type_name)
|
194
|
+
|
193
195
|
as = one_instance_ancestors_cache[type_name] and return as
|
194
196
|
|
195
197
|
entry = env.class_decls[type_name] or raise "Unknown name for one_instance_ancestors: #{type_name}"
|
@@ -210,6 +212,8 @@ module RBS
|
|
210
212
|
super_args = []
|
211
213
|
end
|
212
214
|
|
215
|
+
super_name = env.normalize_module_name(super_name)
|
216
|
+
|
213
217
|
NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
|
214
218
|
if super_class
|
215
219
|
InheritModuleError.check!(super_class, env: env)
|
@@ -236,7 +240,12 @@ module RBS
|
|
236
240
|
else
|
237
241
|
entry.self_types.each do |module_self|
|
238
242
|
NoSelfTypeFoundError.check!(module_self, env: env)
|
239
|
-
|
243
|
+
|
244
|
+
module_name = module_self.name
|
245
|
+
if module_name.class?
|
246
|
+
module_name = env.normalize_module_name(module_name)
|
247
|
+
end
|
248
|
+
self_types.push Definition::Ancestor::Instance.new(name: module_name, args: module_self.args, source: module_self)
|
240
249
|
end
|
241
250
|
end
|
242
251
|
end
|
@@ -253,6 +262,7 @@ module RBS
|
|
253
262
|
end
|
254
263
|
|
255
264
|
def one_singleton_ancestors(type_name)
|
265
|
+
type_name = env.normalize_module_name(type_name)
|
256
266
|
as = one_singleton_ancestors_cache[type_name] and return as
|
257
267
|
|
258
268
|
entry = env.class_decls[type_name] or raise "Unknown name for one_singleton_ancestors: #{type_name}"
|
@@ -270,6 +280,8 @@ module RBS
|
|
270
280
|
super_name = BuiltinNames::Object.name
|
271
281
|
end
|
272
282
|
|
283
|
+
super_name = env.normalize_module_name(super_name)
|
284
|
+
|
273
285
|
NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
|
274
286
|
if super_class
|
275
287
|
InheritModuleError.check!(super_class, env: env)
|
@@ -328,16 +340,18 @@ module RBS
|
|
328
340
|
when AST::Members::Include
|
329
341
|
module_name = member.name
|
330
342
|
module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
|
331
|
-
ancestor = Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
332
343
|
|
333
344
|
case
|
334
345
|
when member.name.class? && included_modules
|
335
346
|
MixinClassError.check!(type_name: type_name, env: env, member: member)
|
336
347
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
337
|
-
|
348
|
+
|
349
|
+
module_name = env.normalize_module_name(module_name)
|
350
|
+
included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
338
351
|
when member.name.interface? && included_interfaces
|
339
352
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
340
|
-
|
353
|
+
|
354
|
+
included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
341
355
|
end
|
342
356
|
|
343
357
|
when AST::Members::Prepend
|
@@ -345,7 +359,7 @@ module RBS
|
|
345
359
|
MixinClassError.check!(type_name: type_name, env: env, member: member)
|
346
360
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
347
361
|
|
348
|
-
module_name = member.name
|
362
|
+
module_name = env.normalize_module_name(member.name)
|
349
363
|
module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
|
350
364
|
|
351
365
|
prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
@@ -354,16 +368,18 @@ module RBS
|
|
354
368
|
when AST::Members::Extend
|
355
369
|
module_name = member.name
|
356
370
|
module_args = member.args
|
357
|
-
ancestor = Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
358
371
|
|
359
372
|
case
|
360
373
|
when member.name.class? && extended_modules
|
361
374
|
MixinClassError.check!(type_name: type_name, env: env, member: member)
|
362
375
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
363
|
-
|
376
|
+
|
377
|
+
module_name = env.normalize_module_name(module_name)
|
378
|
+
extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
364
379
|
when member.name.interface? && extended_interfaces
|
365
380
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
366
|
-
|
381
|
+
|
382
|
+
extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
367
383
|
end
|
368
384
|
end
|
369
385
|
end
|
@@ -3,7 +3,6 @@
|
|
3
3
|
module RBS
|
4
4
|
class DefinitionBuilder
|
5
5
|
attr_reader :env
|
6
|
-
attr_reader :type_name_resolver
|
7
6
|
attr_reader :ancestor_builder
|
8
7
|
attr_reader :method_builder
|
9
8
|
|
@@ -14,7 +13,6 @@ module RBS
|
|
14
13
|
|
15
14
|
def initialize(env:, ancestor_builder: nil, method_builder: nil)
|
16
15
|
@env = env
|
17
|
-
@type_name_resolver = TypeNameResolver.from_env(env)
|
18
16
|
@ancestor_builder = ancestor_builder || AncestorBuilder.new(env: env)
|
19
17
|
@method_builder = method_builder || MethodBuilder.new(env: env)
|
20
18
|
|
@@ -72,7 +70,7 @@ module RBS
|
|
72
70
|
entry = env.interface_decls[name] or raise "Unknown interface name: #{name}"
|
73
71
|
entry.decl.type_params
|
74
72
|
when name.alias?
|
75
|
-
entry = env.
|
73
|
+
entry = env.type_alias_decls[name] or raise "Unknown alias name: #{name}"
|
76
74
|
entry.decl.type_params
|
77
75
|
when name.class?
|
78
76
|
entry = env.class_decls[name] or raise "Unknown module name: #{name}"
|
@@ -150,6 +148,8 @@ module RBS
|
|
150
148
|
end
|
151
149
|
|
152
150
|
def build_instance(type_name)
|
151
|
+
type_name = env.normalize_module_name(type_name)
|
152
|
+
|
153
153
|
try_cache(type_name, cache: instance_cache) do
|
154
154
|
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
|
155
155
|
ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
|
@@ -278,6 +278,8 @@ module RBS
|
|
278
278
|
end
|
279
279
|
|
280
280
|
def build_singleton(type_name)
|
281
|
+
type_name = env.normalize_module_name(type_name)
|
282
|
+
|
281
283
|
try_cache type_name, cache: singleton_cache do
|
282
284
|
entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
|
283
285
|
ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
|
@@ -743,13 +745,13 @@ module RBS
|
|
743
745
|
end
|
744
746
|
|
745
747
|
def expand_alias1(type_name)
|
746
|
-
entry = env.
|
748
|
+
entry = env.type_alias_decls[type_name] or raise "Unknown alias name: #{type_name}"
|
747
749
|
as = entry.decl.type_params.each.map { Types::Bases::Any.new(location: nil) }
|
748
750
|
expand_alias2(type_name, as)
|
749
751
|
end
|
750
752
|
|
751
753
|
def expand_alias2(type_name, args)
|
752
|
-
entry = env.
|
754
|
+
entry = env.type_alias_decls[type_name] or raise "Unknown alias name: #{type_name}"
|
753
755
|
|
754
756
|
ensure_namespace!(type_name.namespace, location: entry.decl.location)
|
755
757
|
params = entry.decl.type_params.each.map(&:name)
|
@@ -803,9 +805,7 @@ module RBS
|
|
803
805
|
def validate_type_name(name, location)
|
804
806
|
name = name.absolute!
|
805
807
|
|
806
|
-
return if
|
807
|
-
return if name.interface? && env.interface_decls.key?(name)
|
808
|
-
return if name.alias? && env.alias_decls.key?(name)
|
808
|
+
return if env.type_name?(name)
|
809
809
|
|
810
810
|
raise NoTypeFoundError.new(type_name: name, location: location)
|
811
811
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RBS
|
4
|
+
class Environment
|
5
|
+
class UseMap
|
6
|
+
class Table
|
7
|
+
attr_reader :known_types, :children
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@known_types = Set[]
|
11
|
+
@children = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def compute_children
|
15
|
+
children.clear
|
16
|
+
|
17
|
+
known_types.each do |type|
|
18
|
+
unless type.namespace.empty?
|
19
|
+
children[type.namespace] ||= Set[]
|
20
|
+
children[type.namespace] << type
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_reader :use_dirs
|
29
|
+
|
30
|
+
def initialize(table:)
|
31
|
+
@use_dirs = []
|
32
|
+
@map = {}
|
33
|
+
@table = table
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_map(clause)
|
37
|
+
case clause
|
38
|
+
when AST::Directives::Use::SingleClause
|
39
|
+
if clause.new_name
|
40
|
+
@map[clause.new_name] = clause.type_name.absolute!
|
41
|
+
else
|
42
|
+
@map[clause.type_name.name] = clause.type_name.absolute!
|
43
|
+
end
|
44
|
+
when AST::Directives::Use::WildcardClause
|
45
|
+
@table.children.fetch(clause.namespace.absolute!).each do |child|
|
46
|
+
@map[child.name] = child
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def resolve?(type_name)
|
54
|
+
return if type_name.absolute?
|
55
|
+
|
56
|
+
hd, *tl = type_name.namespace.path
|
57
|
+
|
58
|
+
if hd
|
59
|
+
# namespace is not empty
|
60
|
+
if tn = @map[hd]
|
61
|
+
path = [*tn.namespace.path, tn.name, *tl]
|
62
|
+
TypeName.new(
|
63
|
+
namespace: Namespace.new(absolute: true, path: path),
|
64
|
+
name: type_name.name
|
65
|
+
)
|
66
|
+
end
|
67
|
+
else
|
68
|
+
@map[type_name.name]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def resolve(type_name)
|
73
|
+
resolve?(type_name) || type_name
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|