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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.github/workflows/windows.yml +1 -1
  4. data/CHANGELOG.md +0 -13
  5. data/Rakefile +28 -21
  6. data/Steepfile +1 -0
  7. data/config.yml +232 -62
  8. data/ext/rbs_extension/ast_translation.c +1149 -0
  9. data/ext/rbs_extension/ast_translation.h +30 -0
  10. data/{src/constants.c → ext/rbs_extension/class_constants.c} +15 -1
  11. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +10 -1
  12. data/ext/rbs_extension/extconf.rb +3 -1
  13. data/ext/rbs_extension/{location.c → legacy_location.c} +25 -34
  14. data/ext/rbs_extension/legacy_location.h +40 -0
  15. data/ext/rbs_extension/main.c +402 -8
  16. data/ext/rbs_extension/rbs_extension.h +3 -21
  17. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  18. data/ext/rbs_extension/rbs_string_bridging.h +20 -0
  19. data/include/rbs/ast.h +748 -0
  20. data/include/rbs/defines.h +60 -0
  21. data/{ext/rbs_extension → include/rbs}/lexer.h +40 -32
  22. data/include/rbs/location.h +59 -0
  23. data/include/rbs/parser.h +151 -0
  24. data/include/rbs/string.h +49 -0
  25. data/include/rbs/util/rbs_allocator.h +38 -0
  26. data/include/rbs/util/rbs_assert.h +9 -0
  27. data/include/rbs/util/rbs_buffer.h +83 -0
  28. data/include/rbs/util/rbs_constant_pool.h +3 -64
  29. data/include/rbs/util/rbs_encoding.h +280 -0
  30. data/include/rbs/util/rbs_unescape.h +23 -0
  31. data/include/rbs.h +1 -2
  32. data/lib/rbs/annotate/formatter.rb +3 -13
  33. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  34. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  35. data/lib/rbs/ast/ruby/annotations.rb +119 -0
  36. data/lib/rbs/ast/ruby/comment_block.rb +221 -0
  37. data/lib/rbs/ast/ruby/declarations.rb +86 -0
  38. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
  39. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  40. data/lib/rbs/ast/ruby/members.rb +213 -0
  41. data/lib/rbs/buffer.rb +104 -24
  42. data/lib/rbs/cli/validate.rb +39 -34
  43. data/lib/rbs/cli.rb +4 -5
  44. data/lib/rbs/definition.rb +6 -1
  45. data/lib/rbs/definition_builder/ancestor_builder.rb +63 -60
  46. data/lib/rbs/definition_builder/method_builder.rb +45 -30
  47. data/lib/rbs/definition_builder.rb +44 -9
  48. data/lib/rbs/environment/class_entry.rb +69 -0
  49. data/lib/rbs/environment/module_entry.rb +66 -0
  50. data/lib/rbs/environment.rb +185 -154
  51. data/lib/rbs/environment_loader.rb +2 -2
  52. data/lib/rbs/errors.rb +4 -3
  53. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  54. data/lib/rbs/inline_parser.rb +206 -0
  55. data/lib/rbs/location_aux.rb +35 -3
  56. data/lib/rbs/parser_aux.rb +11 -1
  57. data/lib/rbs/prototype/runtime.rb +2 -2
  58. data/lib/rbs/source.rb +99 -0
  59. data/lib/rbs/subtractor.rb +4 -3
  60. data/lib/rbs/version.rb +1 -1
  61. data/lib/rbs.rb +12 -0
  62. data/lib/rdoc/discover.rb +1 -1
  63. data/lib/rdoc_plugin/parser.rb +2 -2
  64. data/rbs.gemspec +1 -0
  65. data/sig/ancestor_builder.rbs +1 -1
  66. data/sig/annotate/formatter.rbs +2 -2
  67. data/sig/annotate/rdoc_annotater.rbs +1 -1
  68. data/sig/ast/ruby/annotations.rbs +110 -0
  69. data/sig/ast/ruby/comment_block.rbs +119 -0
  70. data/sig/ast/ruby/declarations.rbs +60 -0
  71. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  72. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  73. data/sig/ast/ruby/members.rbs +72 -0
  74. data/sig/buffer.rbs +63 -5
  75. data/sig/definition.rbs +1 -0
  76. data/sig/definition_builder.rbs +1 -1
  77. data/sig/environment/class_entry.rbs +50 -0
  78. data/sig/environment/module_entry.rbs +50 -0
  79. data/sig/environment.rbs +22 -76
  80. data/sig/errors.rbs +13 -6
  81. data/sig/inline_parser/comment_association.rbs +71 -0
  82. data/sig/inline_parser.rbs +87 -0
  83. data/sig/location.rbs +32 -7
  84. data/sig/method_builder.rbs +7 -4
  85. data/sig/parser.rbs +16 -0
  86. data/sig/source.rbs +48 -0
  87. data/src/ast.c +1345 -0
  88. data/src/lexer.c +2867 -0
  89. data/src/lexer.re +151 -0
  90. data/{ext/rbs_extension → src}/lexstate.c +58 -42
  91. data/src/location.c +71 -0
  92. data/src/parser.c +3739 -0
  93. data/src/string.c +89 -0
  94. data/src/util/rbs_allocator.c +149 -0
  95. data/src/util/rbs_assert.c +19 -0
  96. data/src/util/rbs_buffer.c +54 -0
  97. data/src/util/rbs_constant_pool.c +13 -81
  98. data/src/util/rbs_encoding.c +5273 -0
  99. data/src/util/rbs_unescape.c +130 -0
  100. data/stdlib/rdoc/0/code_object.rbs +2 -2
  101. data/stdlib/rdoc/0/comment.rbs +2 -0
  102. data/stdlib/rdoc/0/options.rbs +76 -0
  103. data/stdlib/rdoc/0/rdoc.rbs +6 -4
  104. data/stdlib/rdoc/0/store.rbs +1 -1
  105. metadata +70 -17
  106. data/ext/rbs_extension/lexer.c +0 -2728
  107. data/ext/rbs_extension/lexer.re +0 -147
  108. data/ext/rbs_extension/location.h +0 -85
  109. data/ext/rbs_extension/parser.c +0 -2982
  110. data/ext/rbs_extension/parser.h +0 -18
  111. data/ext/rbs_extension/parserstate.c +0 -411
  112. data/ext/rbs_extension/parserstate.h +0 -163
  113. data/ext/rbs_extension/unescape.c +0 -32
  114. data/include/rbs/ruby_objs.h +0 -72
  115. data/src/ruby_objs.c +0 -799
@@ -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 :signatures
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 :outer
16
+ attr_reader :context
112
17
  attr_reader :decl
113
18
 
114
- def initialize(name:, decl:, outer:)
19
+ def initialize(name:, decl:, context:)
115
20
  @name = name
116
21
  @decl = decl
117
- @outer = outer
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
- @signatures = {}
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
- @signatures = other.signatures.dup
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 insert_decl(decl, outer:, namespace:)
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: name)
282
+ class_decls[name] ||= ClassEntry.new(name)
388
283
  when AST::Declarations::Module
389
- class_decls[name] ||= ModuleEntry.new(name: 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.insert(decl: decl, outer: outer)
292
+ existing_entry << [context, decl]
398
293
  when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
399
- existing_entry.insert(decl: decl, outer: outer)
294
+ existing_entry << [context, decl]
400
295
  else
401
- raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
296
+ raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary_decl)
402
297
  end
403
298
 
404
- prefix = outer + [decl]
405
- ns = name.to_namespace
299
+ inner_context = [context, name] #: Resolver::context
300
+ inner_namespace = name.to_namespace
406
301
  decl.each_decl do |d|
407
- insert_decl(d, outer: prefix, namespace: ns)
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, outer: outer)
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, outer: outer)
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.decls.map(&:decl))
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, outer: outer)
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, outer: outer)
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.decls.map(&:decl))
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, outer: outer)
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, outer: outer)
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 <<(decl)
471
- declarations << decl
472
- insert_decl(decl, outer: [], namespace: Namespace.root)
473
- self
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 add_signature(buffer:, directives:, decls:)
477
- signatures[buffer] = [directives, decls]
478
- decls.each do |decl|
479
- self << decl
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.primary
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, outer: [], prefix: Namespace.root)
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
- signatures.each do |buffer, (dirs, decls)|
523
- resolve = dirs.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
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, dirs, decls)
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
- env.add_signature(buffer: buffer, directives: dirs, decls: decls)
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, outer:, prefix:)
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
- outer: outer_,
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
- outer: outer_,
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
- signatures.keys
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
- signatures.each do |buf, (dirs, decls)|
826
- next if buffers.include?(buf)
827
- env.add_signature(buffer: buf, directives: dirs, decls: decls)
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.add_signature(buffer: buffer, directives: dirs, decls: decls)
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.to_s, content: path.read(encoding: "UTF-8"))
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.primary.decl.location}: Superclass mismatch: #{name}"
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
- super "#{Location.to_string decl.location}: Generic parameters mismatch: #{name}"
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