rbs 3.9.2 → 4.0.0.dev.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 +1 -1
- data/.github/workflows/windows.yml +1 -1
- data/CHANGELOG.md +0 -13
- data/Rakefile +28 -21
- data/Steepfile +1 -0
- data/config.yml +232 -62
- data/ext/rbs_extension/ast_translation.c +1149 -0
- data/ext/rbs_extension/ast_translation.h +30 -0
- data/{src/constants.c → ext/rbs_extension/class_constants.c} +15 -1
- data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +10 -1
- data/ext/rbs_extension/extconf.rb +3 -1
- data/ext/rbs_extension/{location.c → legacy_location.c} +25 -34
- data/ext/rbs_extension/legacy_location.h +40 -0
- data/ext/rbs_extension/main.c +402 -8
- data/ext/rbs_extension/rbs_extension.h +3 -21
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +20 -0
- data/include/rbs/ast.h +748 -0
- data/include/rbs/defines.h +60 -0
- data/{ext/rbs_extension → include/rbs}/lexer.h +40 -32
- data/include/rbs/location.h +59 -0
- data/include/rbs/parser.h +151 -0
- data/include/rbs/string.h +49 -0
- data/include/rbs/util/rbs_allocator.h +38 -0
- data/include/rbs/util/rbs_assert.h +9 -0
- data/include/rbs/util/rbs_buffer.h +83 -0
- data/include/rbs/util/rbs_constant_pool.h +3 -64
- data/include/rbs/util/rbs_encoding.h +280 -0
- data/include/rbs/util/rbs_unescape.h +23 -0
- data/include/rbs.h +1 -2
- data/lib/rbs/annotate/formatter.rb +3 -13
- data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
- data/lib/rbs/annotate/rdoc_source.rb +1 -1
- data/lib/rbs/ast/ruby/annotations.rb +119 -0
- data/lib/rbs/ast/ruby/comment_block.rb +221 -0
- data/lib/rbs/ast/ruby/declarations.rb +86 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +213 -0
- data/lib/rbs/buffer.rb +104 -24
- data/lib/rbs/cli/validate.rb +39 -34
- data/lib/rbs/cli.rb +4 -5
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +63 -60
- data/lib/rbs/definition_builder/method_builder.rb +45 -30
- data/lib/rbs/definition_builder.rb +44 -9
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +185 -154
- data/lib/rbs/environment_loader.rb +2 -2
- data/lib/rbs/errors.rb +4 -3
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +206 -0
- data/lib/rbs/location_aux.rb +35 -3
- data/lib/rbs/parser_aux.rb +11 -1
- data/lib/rbs/prototype/runtime.rb +2 -2
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +4 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +12 -0
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +2 -2
- data/rbs.gemspec +1 -0
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/annotate/formatter.rbs +2 -2
- data/sig/annotate/rdoc_annotater.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +110 -0
- data/sig/ast/ruby/comment_block.rbs +119 -0
- data/sig/ast/ruby/declarations.rbs +60 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +72 -0
- data/sig/buffer.rbs +63 -5
- data/sig/definition.rbs +1 -0
- data/sig/definition_builder.rbs +1 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +22 -76
- data/sig/errors.rbs +13 -6
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +87 -0
- data/sig/location.rbs +32 -7
- data/sig/method_builder.rbs +7 -4
- data/sig/parser.rbs +16 -0
- data/sig/source.rbs +48 -0
- data/src/ast.c +1345 -0
- data/src/lexer.c +2867 -0
- data/src/lexer.re +151 -0
- data/{ext/rbs_extension → src}/lexstate.c +58 -42
- data/src/location.c +71 -0
- data/src/parser.c +3739 -0
- data/src/string.c +89 -0
- data/src/util/rbs_allocator.c +149 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +13 -81
- data/src/util/rbs_encoding.c +5273 -0
- data/src/util/rbs_unescape.c +130 -0
- data/stdlib/rdoc/0/code_object.rbs +2 -2
- data/stdlib/rdoc/0/comment.rbs +2 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/rdoc.rbs +6 -4
- data/stdlib/rdoc/0/store.rbs +1 -1
- metadata +70 -17
- data/ext/rbs_extension/lexer.c +0 -2728
- data/ext/rbs_extension/lexer.re +0 -147
- data/ext/rbs_extension/location.h +0 -85
- data/ext/rbs_extension/parser.c +0 -2982
- data/ext/rbs_extension/parser.h +0 -18
- data/ext/rbs_extension/parserstate.c +0 -411
- data/ext/rbs_extension/parserstate.h +0 -163
- data/ext/rbs_extension/unescape.c +0 -32
- data/include/rbs/ruby_objs.h +0 -72
- data/src/ruby_objs.c +0 -799
data/lib/rbs/environment.rb
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
module RBS
|
4
4
|
class Environment
|
5
|
-
attr_reader :declarations
|
6
|
-
|
7
5
|
attr_reader :class_decls
|
8
6
|
attr_reader :interface_decls
|
9
7
|
attr_reader :type_alias_decls
|
@@ -11,116 +9,17 @@ module RBS
|
|
11
9
|
attr_reader :global_decls
|
12
10
|
attr_reader :class_alias_decls
|
13
11
|
|
14
|
-
attr_reader :
|
15
|
-
|
16
|
-
module ContextUtil
|
17
|
-
def calculate_context(decls)
|
18
|
-
decls.inject(nil) do |context, decl| #$ Resolver::context
|
19
|
-
if (_, last = context)
|
20
|
-
last or raise
|
21
|
-
[context, last + decl.name]
|
22
|
-
else
|
23
|
-
[nil, decl.name.absolute!]
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class MultiEntry
|
30
|
-
D = _ = Struct.new(:decl, :outer, keyword_init: true) do
|
31
|
-
# @implements D[M]
|
32
|
-
|
33
|
-
include ContextUtil
|
34
|
-
|
35
|
-
def context
|
36
|
-
@context ||= calculate_context(outer + [decl])
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
attr_reader :name
|
41
|
-
attr_reader :decls
|
42
|
-
|
43
|
-
def initialize(name:)
|
44
|
-
@name = name
|
45
|
-
@decls = []
|
46
|
-
end
|
47
|
-
|
48
|
-
def insert(decl:, outer:)
|
49
|
-
decls << D.new(decl: decl, outer: outer)
|
50
|
-
@primary = nil
|
51
|
-
end
|
52
|
-
|
53
|
-
def validate_type_params
|
54
|
-
unless decls.empty?
|
55
|
-
hd_decl, *tl_decls = decls
|
56
|
-
raise unless hd_decl
|
57
|
-
|
58
|
-
hd_params = hd_decl.decl.type_params
|
59
|
-
|
60
|
-
tl_decls.each do |tl_decl|
|
61
|
-
tl_params = tl_decl.decl.type_params
|
62
|
-
|
63
|
-
unless compatible_params?(hd_params, tl_params)
|
64
|
-
raise GenericParameterMismatchError.new(name: name, decl: _ = tl_decl.decl)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def compatible_params?(ps1, ps2)
|
71
|
-
if ps1.size == ps2.size
|
72
|
-
ps1 == AST::TypeParam.rename(ps2, new_names: ps1.map(&:name))
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def type_params
|
77
|
-
primary.decl.type_params
|
78
|
-
end
|
79
|
-
|
80
|
-
def primary
|
81
|
-
raise "Not implemented"
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
class ModuleEntry < MultiEntry
|
86
|
-
def self_types
|
87
|
-
decls.flat_map do |d|
|
88
|
-
d.decl.self_types
|
89
|
-
end.uniq
|
90
|
-
end
|
91
|
-
|
92
|
-
def primary
|
93
|
-
@primary ||= begin
|
94
|
-
validate_type_params
|
95
|
-
decls.first or raise("decls cannot be empty")
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
class ClassEntry < MultiEntry
|
101
|
-
def primary
|
102
|
-
@primary ||= begin
|
103
|
-
validate_type_params
|
104
|
-
decls.find {|d| d.decl.super_class } || decls.first or raise("decls cannot be empty")
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
12
|
+
attr_reader :sources
|
108
13
|
|
109
14
|
class SingleEntry
|
110
15
|
attr_reader :name
|
111
|
-
attr_reader :
|
16
|
+
attr_reader :context
|
112
17
|
attr_reader :decl
|
113
18
|
|
114
|
-
def initialize(name:, decl:,
|
19
|
+
def initialize(name:, decl:, context:)
|
115
20
|
@name = name
|
116
21
|
@decl = decl
|
117
|
-
@
|
118
|
-
end
|
119
|
-
|
120
|
-
include ContextUtil
|
121
|
-
|
122
|
-
def context
|
123
|
-
@context ||= calculate_context(outer)
|
22
|
+
@context = context
|
124
23
|
end
|
125
24
|
end
|
126
25
|
|
@@ -143,9 +42,7 @@ module RBS
|
|
143
42
|
end
|
144
43
|
|
145
44
|
def initialize
|
146
|
-
@
|
147
|
-
@declarations = []
|
148
|
-
|
45
|
+
@sources = []
|
149
46
|
@class_decls = {}
|
150
47
|
@interface_decls = {}
|
151
48
|
@type_alias_decls = {}
|
@@ -156,9 +53,7 @@ module RBS
|
|
156
53
|
end
|
157
54
|
|
158
55
|
def initialize_copy(other)
|
159
|
-
@
|
160
|
-
@declarations = other.declarations.dup
|
161
|
-
|
56
|
+
@sources = other.sources.dup
|
162
57
|
@class_decls = other.class_decls.dup
|
163
58
|
@interface_decls = other.interface_decls.dup
|
164
59
|
@type_alias_decls = other.type_alias_decls.dup
|
@@ -370,7 +265,7 @@ module RBS
|
|
370
265
|
@normalize_module_name_cache[name] = normalized_type_name
|
371
266
|
end
|
372
267
|
|
373
|
-
def
|
268
|
+
def insert_rbs_decl(decl, context:, namespace:)
|
374
269
|
case decl
|
375
270
|
when AST::Declarations::Class, AST::Declarations::Module
|
376
271
|
name = decl.name.with_prefix(namespace)
|
@@ -384,9 +279,9 @@ module RBS
|
|
384
279
|
unless class_decls.key?(name)
|
385
280
|
case decl
|
386
281
|
when AST::Declarations::Class
|
387
|
-
class_decls[name] ||= ClassEntry.new(name
|
282
|
+
class_decls[name] ||= ClassEntry.new(name)
|
388
283
|
when AST::Declarations::Module
|
389
|
-
class_decls[name] ||= ModuleEntry.new(name
|
284
|
+
class_decls[name] ||= ModuleEntry.new(name)
|
390
285
|
end
|
391
286
|
end
|
392
287
|
|
@@ -394,17 +289,17 @@ module RBS
|
|
394
289
|
|
395
290
|
case
|
396
291
|
when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
|
397
|
-
existing_entry
|
292
|
+
existing_entry << [context, decl]
|
398
293
|
when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
|
399
|
-
existing_entry
|
294
|
+
existing_entry << [context, decl]
|
400
295
|
else
|
401
|
-
raise DuplicatedDeclarationError.new(name, decl, existing_entry.
|
296
|
+
raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary_decl)
|
402
297
|
end
|
403
298
|
|
404
|
-
|
405
|
-
|
299
|
+
inner_context = [context, name] #: Resolver::context
|
300
|
+
inner_namespace = name.to_namespace
|
406
301
|
decl.each_decl do |d|
|
407
|
-
|
302
|
+
insert_rbs_decl(d, context: inner_context, namespace: inner_namespace)
|
408
303
|
end
|
409
304
|
|
410
305
|
when AST::Declarations::Interface
|
@@ -414,7 +309,7 @@ module RBS
|
|
414
309
|
raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
|
415
310
|
end
|
416
311
|
|
417
|
-
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl,
|
312
|
+
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, context: context)
|
418
313
|
|
419
314
|
when AST::Declarations::TypeAlias
|
420
315
|
name = decl.name.with_prefix(namespace)
|
@@ -423,7 +318,7 @@ module RBS
|
|
423
318
|
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
424
319
|
end
|
425
320
|
|
426
|
-
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl,
|
321
|
+
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, context: context)
|
427
322
|
|
428
323
|
when AST::Declarations::Constant
|
429
324
|
name = decl.name.with_prefix(namespace)
|
@@ -433,18 +328,18 @@ module RBS
|
|
433
328
|
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
|
434
329
|
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
435
330
|
when ClassEntry, ModuleEntry
|
436
|
-
raise DuplicatedDeclarationError.new(name, decl, *entry.
|
331
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
437
332
|
end
|
438
333
|
end
|
439
334
|
|
440
|
-
constant_decls[name] = ConstantEntry.new(name: name, decl: decl,
|
335
|
+
constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
|
441
336
|
|
442
337
|
when AST::Declarations::Global
|
443
338
|
if entry = global_decls[decl.name]
|
444
339
|
raise DuplicatedDeclarationError.new(decl.name, decl, entry.decl)
|
445
340
|
end
|
446
341
|
|
447
|
-
global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl,
|
342
|
+
global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, context: context)
|
448
343
|
|
449
344
|
when AST::Declarations::ClassAlias, AST::Declarations::ModuleAlias
|
450
345
|
name = decl.new_name.with_prefix(namespace)
|
@@ -454,35 +349,109 @@ module RBS
|
|
454
349
|
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
|
455
350
|
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
456
351
|
when ClassEntry, ModuleEntry
|
457
|
-
raise DuplicatedDeclarationError.new(name, decl, *entry.
|
352
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
458
353
|
end
|
459
354
|
end
|
460
355
|
|
461
356
|
case decl
|
462
357
|
when AST::Declarations::ClassAlias
|
463
|
-
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl,
|
358
|
+
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
|
464
359
|
when AST::Declarations::ModuleAlias
|
465
|
-
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl,
|
360
|
+
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
def insert_ruby_decl(decl, context:, namespace:)
|
366
|
+
case decl
|
367
|
+
when AST::Ruby::Declarations::ClassDecl
|
368
|
+
name = decl.class_name.with_prefix(namespace)
|
369
|
+
|
370
|
+
if entry = constant_entry(name)
|
371
|
+
if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
|
372
|
+
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
373
|
+
end
|
374
|
+
if entry.is_a?(ModuleEntry)
|
375
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
entry = ClassEntry.new(name)
|
380
|
+
class_decls[name] = entry
|
381
|
+
|
382
|
+
entry << [context, decl]
|
383
|
+
|
384
|
+
inner_context = [context, name] #: Resolver::context
|
385
|
+
decl.each_decl do |member|
|
386
|
+
insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
|
387
|
+
end
|
388
|
+
|
389
|
+
when AST::Ruby::Declarations::ModuleDecl
|
390
|
+
name = decl.module_name.with_prefix(namespace)
|
391
|
+
|
392
|
+
if entry = constant_entry(name)
|
393
|
+
if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
|
394
|
+
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
395
|
+
end
|
396
|
+
if entry.is_a?(ClassEntry)
|
397
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
entry = ModuleEntry.new(name)
|
402
|
+
class_decls[name] = entry
|
403
|
+
|
404
|
+
entry << [context, decl]
|
405
|
+
|
406
|
+
inner_context = [context, name] #: Resolver::context
|
407
|
+
decl.each_decl do |member|
|
408
|
+
insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
|
466
409
|
end
|
467
410
|
end
|
468
411
|
end
|
469
412
|
|
470
|
-
def
|
471
|
-
|
472
|
-
|
473
|
-
|
413
|
+
def add_source(source)
|
414
|
+
sources << source
|
415
|
+
|
416
|
+
case source
|
417
|
+
when Source::RBS
|
418
|
+
source.declarations.each do |decl|
|
419
|
+
insert_rbs_decl(decl, context: nil, namespace: Namespace.root)
|
420
|
+
end
|
421
|
+
when Source::Ruby
|
422
|
+
source.declarations.each do |dir|
|
423
|
+
insert_ruby_decl(dir, context: nil, namespace: Namespace.root)
|
424
|
+
end
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
428
|
+
def each_rbs_source(&block)
|
429
|
+
if block
|
430
|
+
sources.each do |source|
|
431
|
+
if source.is_a?(Source::RBS)
|
432
|
+
yield source
|
433
|
+
end
|
434
|
+
end
|
435
|
+
else
|
436
|
+
enum_for(:each_rbs_source)
|
437
|
+
end
|
474
438
|
end
|
475
439
|
|
476
|
-
def
|
477
|
-
|
478
|
-
|
479
|
-
|
440
|
+
def each_ruby_source(&block)
|
441
|
+
if block
|
442
|
+
sources.each do |source|
|
443
|
+
if source.is_a?(Source::Ruby)
|
444
|
+
yield source
|
445
|
+
end
|
446
|
+
end
|
447
|
+
else
|
448
|
+
enum_for(:each_ruby_source)
|
480
449
|
end
|
481
450
|
end
|
482
451
|
|
483
452
|
def validate_type_params
|
484
453
|
class_decls.each_value do |decl|
|
485
|
-
decl.
|
454
|
+
decl.validate_type_params
|
486
455
|
end
|
487
456
|
end
|
488
457
|
|
@@ -501,7 +470,7 @@ module RBS
|
|
501
470
|
if only && !only.member?(decl)
|
502
471
|
decl
|
503
472
|
else
|
504
|
-
resolve_declaration(resolver, map, decl,
|
473
|
+
resolve_declaration(resolver, map, decl, context: nil, prefix: Namespace.root)
|
505
474
|
end
|
506
475
|
end
|
507
476
|
|
@@ -519,12 +488,22 @@ module RBS
|
|
519
488
|
table.known_types.merge(interface_decls.keys)
|
520
489
|
table.compute_children
|
521
490
|
|
522
|
-
|
523
|
-
resolve =
|
491
|
+
each_rbs_source do |source|
|
492
|
+
resolve = source.directives.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
|
524
493
|
if !resolve || resolve.value
|
525
|
-
_, decls = resolve_signature(resolver, table,
|
494
|
+
_, decls = resolve_signature(resolver, table, source.directives, source.declarations)
|
495
|
+
else
|
496
|
+
decls = source.declarations
|
497
|
+
end
|
498
|
+
env.add_source(Source::RBS.new(source.buffer, source.directives, decls))
|
499
|
+
end
|
500
|
+
|
501
|
+
each_ruby_source do |source|
|
502
|
+
decls = source.declarations.map do |decl|
|
503
|
+
resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
|
526
504
|
end
|
527
|
-
|
505
|
+
|
506
|
+
env.add_source(Source::Ruby.new(source.buffer, source.prism_result, decls, source.diagnostics))
|
528
507
|
end
|
529
508
|
|
530
509
|
env
|
@@ -545,7 +524,7 @@ module RBS
|
|
545
524
|
end
|
546
525
|
end
|
547
526
|
|
548
|
-
def resolve_declaration(resolver, map, decl,
|
527
|
+
def resolve_declaration(resolver, map, decl, context:, prefix:)
|
549
528
|
if decl.is_a?(AST::Declarations::Global)
|
550
529
|
# @type var decl: AST::Declarations::Global
|
551
530
|
return AST::Declarations::Global.new(
|
@@ -557,14 +536,11 @@ module RBS
|
|
557
536
|
)
|
558
537
|
end
|
559
538
|
|
560
|
-
context = resolver_context(*outer)
|
561
|
-
|
562
539
|
case decl
|
563
540
|
when AST::Declarations::Class
|
564
541
|
outer_context = context
|
565
542
|
inner_context = append_context(outer_context, decl)
|
566
543
|
|
567
|
-
outer_ = outer + [decl]
|
568
544
|
prefix_ = prefix + decl.name.to_namespace
|
569
545
|
AST::Declarations::Class.new(
|
570
546
|
name: decl.name.with_prefix(prefix),
|
@@ -585,7 +561,7 @@ module RBS
|
|
585
561
|
resolver,
|
586
562
|
map,
|
587
563
|
member,
|
588
|
-
|
564
|
+
context: inner_context,
|
589
565
|
prefix: prefix_
|
590
566
|
)
|
591
567
|
else
|
@@ -601,7 +577,6 @@ module RBS
|
|
601
577
|
outer_context = context
|
602
578
|
inner_context = append_context(outer_context, decl)
|
603
579
|
|
604
|
-
outer_ = outer + [decl]
|
605
580
|
prefix_ = prefix + decl.name.to_namespace
|
606
581
|
AST::Declarations::Module.new(
|
607
582
|
name: decl.name.with_prefix(prefix),
|
@@ -622,7 +597,7 @@ module RBS
|
|
622
597
|
resolver,
|
623
598
|
map,
|
624
599
|
member,
|
625
|
-
|
600
|
+
context: inner_context,
|
626
601
|
prefix: prefix_
|
627
602
|
)
|
628
603
|
else
|
@@ -685,6 +660,61 @@ module RBS
|
|
685
660
|
end
|
686
661
|
end
|
687
662
|
|
663
|
+
def resolve_ruby_decl(resolver, decl, context:, prefix:)
|
664
|
+
case decl
|
665
|
+
when AST::Ruby::Declarations::ClassDecl
|
666
|
+
full_name = decl.class_name.with_prefix(prefix)
|
667
|
+
inner_context = [context, full_name] #: Resolver::context
|
668
|
+
inner_prefix = full_name.to_namespace
|
669
|
+
|
670
|
+
AST::Ruby::Declarations::ClassDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
|
671
|
+
decl.members.each do |member|
|
672
|
+
case member
|
673
|
+
when AST::Ruby::Declarations::Base
|
674
|
+
resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
|
675
|
+
when AST::Ruby::Members::Base
|
676
|
+
resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
|
677
|
+
else
|
678
|
+
raise "Unknown member type: #{member.class}"
|
679
|
+
end
|
680
|
+
end
|
681
|
+
end
|
682
|
+
|
683
|
+
when AST::Ruby::Declarations::ModuleDecl
|
684
|
+
full_name = decl.module_name.with_prefix(prefix)
|
685
|
+
inner_context = [context, full_name] #: Resolver::context
|
686
|
+
inner_prefix = full_name.to_namespace
|
687
|
+
|
688
|
+
AST::Ruby::Declarations::ModuleDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
|
689
|
+
decl.members.each do |member|
|
690
|
+
case member
|
691
|
+
when AST::Ruby::Declarations::Base
|
692
|
+
resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
|
693
|
+
else
|
694
|
+
raise "Unknown member type: #{member.class}"
|
695
|
+
end
|
696
|
+
end
|
697
|
+
end
|
698
|
+
|
699
|
+
else
|
700
|
+
raise "Unknown declaration type: #{decl.class}"
|
701
|
+
end
|
702
|
+
end
|
703
|
+
|
704
|
+
def resolve_ruby_member(resolver, member, context:)
|
705
|
+
case member
|
706
|
+
when AST::Ruby::Members::DefMember
|
707
|
+
AST::Ruby::Members::DefMember.new(
|
708
|
+
member.buffer,
|
709
|
+
member.name,
|
710
|
+
member.node,
|
711
|
+
member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
712
|
+
)
|
713
|
+
else
|
714
|
+
raise "Unknown member type: #{member.class}"
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
688
718
|
def resolve_member(resolver, map, member, context:)
|
689
719
|
case member
|
690
720
|
when AST::Members::MethodDefinition
|
@@ -800,7 +830,7 @@ module RBS
|
|
800
830
|
end
|
801
831
|
|
802
832
|
def absolute_type_name(resolver, map, type_name, context:)
|
803
|
-
type_name = map.resolve(type_name)
|
833
|
+
type_name = map.resolve(type_name) if map
|
804
834
|
resolver.resolve(type_name, context: context) || type_name
|
805
835
|
end
|
806
836
|
|
@@ -816,15 +846,16 @@ module RBS
|
|
816
846
|
end
|
817
847
|
|
818
848
|
def buffers
|
819
|
-
|
849
|
+
sources.map(&:buffer)
|
820
850
|
end
|
821
851
|
|
822
852
|
def unload(buffers)
|
823
853
|
env = Environment.new
|
854
|
+
bufs = buffers.to_set
|
824
855
|
|
825
|
-
|
826
|
-
next if
|
827
|
-
env.
|
856
|
+
each_rbs_source do |source|
|
857
|
+
next if bufs.include?(source.buffer)
|
858
|
+
env.add_source(source)
|
828
859
|
end
|
829
860
|
|
830
861
|
env
|
@@ -122,7 +122,7 @@ module RBS
|
|
122
122
|
decls.each do |decl|
|
123
123
|
loaded << [decl, path, source]
|
124
124
|
end
|
125
|
-
env.
|
125
|
+
env.add_source(Source::RBS.new(buffer, dirs, decls))
|
126
126
|
end
|
127
127
|
|
128
128
|
loaded
|
@@ -161,7 +161,7 @@ module RBS
|
|
161
161
|
next if files.include?(path)
|
162
162
|
|
163
163
|
files << path
|
164
|
-
buffer = Buffer.new(name: path
|
164
|
+
buffer = Buffer.new(name: path, content: path.read(encoding: "UTF-8"))
|
165
165
|
|
166
166
|
_, dirs, decls = Parser.parse_signature(buffer)
|
167
167
|
|
data/lib/rbs/errors.rb
CHANGED
@@ -371,7 +371,7 @@ module RBS
|
|
371
371
|
def initialize(name:, entry:)
|
372
372
|
@name = name
|
373
373
|
@entry = entry
|
374
|
-
super "#{Location.to_string entry.
|
374
|
+
super "#{Location.to_string entry.primary_decl.location}: Superclass mismatch: #{name}"
|
375
375
|
end
|
376
376
|
end
|
377
377
|
|
@@ -408,10 +408,11 @@ module RBS
|
|
408
408
|
attr_reader :name
|
409
409
|
attr_reader :decl
|
410
410
|
|
411
|
-
def initialize(name:, decl:)
|
411
|
+
def initialize(name:, decl:, location: nil)
|
412
412
|
@name = name
|
413
413
|
@decl = decl
|
414
|
-
|
414
|
+
location ||= decl.location
|
415
|
+
super "#{Location.to_string location}: Generic parameters mismatch: #{name}"
|
415
416
|
end
|
416
417
|
end
|
417
418
|
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RBS
|
4
|
+
class InlineParser
|
5
|
+
class CommentAssociation
|
6
|
+
attr_reader :blocks, :associated_blocks, :start_line_map, :end_line_map
|
7
|
+
|
8
|
+
def initialize(blocks)
|
9
|
+
@blocks = blocks.sort_by {|block| block.start_line }
|
10
|
+
@associated_blocks = Set[].compare_by_identity
|
11
|
+
|
12
|
+
@start_line_map = {}
|
13
|
+
@end_line_map = {}
|
14
|
+
|
15
|
+
blocks.each do |block|
|
16
|
+
if block.leading?
|
17
|
+
end_line_map[block.end_line] = block
|
18
|
+
else
|
19
|
+
start_line_map[block.start_line] = block
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.build(buffer, result)
|
25
|
+
blocks = AST::Ruby::CommentBlock.build(buffer, result.comments)
|
26
|
+
new(blocks)
|
27
|
+
end
|
28
|
+
|
29
|
+
class Reference
|
30
|
+
attr_reader :block
|
31
|
+
|
32
|
+
def initialize(block, association)
|
33
|
+
@block = block
|
34
|
+
@associated_blocks = association
|
35
|
+
end
|
36
|
+
|
37
|
+
def associate!
|
38
|
+
@associated_blocks << block
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def associated?
|
43
|
+
@associated_blocks.include?(block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def leading_block(node)
|
48
|
+
start_line = node.location.start_line
|
49
|
+
|
50
|
+
if block = end_line_map.fetch(start_line - 1, nil)
|
51
|
+
Reference.new(block, associated_blocks)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def leading_block!(node)
|
56
|
+
if ref = leading_block(node)
|
57
|
+
unless ref.associated?
|
58
|
+
ref.associate!.block
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def trailing_block(node)
|
64
|
+
location =
|
65
|
+
if node.is_a?(Prism::Node)
|
66
|
+
node.location
|
67
|
+
else
|
68
|
+
node
|
69
|
+
end #: Prism::Location
|
70
|
+
end_line = location.end_line
|
71
|
+
if block = start_line_map.fetch(end_line, nil)
|
72
|
+
Reference.new(block, associated_blocks)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def trailing_block!(node)
|
77
|
+
if ref = trailing_block(node)
|
78
|
+
unless ref.associated?
|
79
|
+
ref.associate!.block
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def each_enclosed_block(node)
|
85
|
+
if block_given?
|
86
|
+
start_line = node.location.start_line
|
87
|
+
end_line = node.location.end_line
|
88
|
+
|
89
|
+
if start_line+1 < end_line
|
90
|
+
((start_line + 1)...end_line).each do |line|
|
91
|
+
if block = end_line_map.fetch(line, nil)
|
92
|
+
unless associated_blocks.include?(block)
|
93
|
+
associated_blocks << block
|
94
|
+
yield block
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
else
|
100
|
+
enum_for :each_enclosed_block, node
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def each_unassociated_block
|
105
|
+
if block_given?
|
106
|
+
blocks.each do |block|
|
107
|
+
unless associated_blocks.include?(block)
|
108
|
+
yield block
|
109
|
+
end
|
110
|
+
end
|
111
|
+
else
|
112
|
+
enum_for :each_unassociated_block
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|