Skip to content

Commit d2cce4f

Browse files
committed
Add RBS::Source::RBS class
1 parent bdf857e commit d2cce4f

File tree

11 files changed

+159
-86
lines changed

11 files changed

+159
-86
lines changed

lib/rbs.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
require "rbs/ast/members"
2525
require "rbs/ast/annotation"
2626
require "rbs/ast/visitor"
27+
require "rbs/source"
2728
require "rbs/environment"
2829
require "rbs/environment/use_map"
2930
require "rbs/environment/class_entry"

lib/rbs/cli.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,9 @@ def run_ast(args, options)
175175

176176
env = Environment.from_loader(loader).resolve_type_names
177177

178-
decls = env.declarations.select do |decl|
179-
loc = decl.location or raise
178+
decls = env.sources.select do |source|
180179
# @type var name: String
181-
name = loc.buffer.name
180+
name = source.buffer.name.to_s
182181

183182
patterns.empty? || patterns.any? do |pat|
184183
case pat
@@ -188,7 +187,7 @@ def run_ast(args, options)
188187
name.end_with?(pat) || File.fnmatch(pat, name, File::FNM_EXTGLOB)
189188
end
190189
end
191-
end
190+
end.flat_map { _1.declarations }
192191

193192
stdout.print JSON.generate(decls)
194193
stdout.flush

lib/rbs/environment.rb

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22

33
module RBS
44
class Environment
5-
attr_reader :declarations
6-
75
attr_reader :class_decls
86
attr_reader :interface_decls
97
attr_reader :type_alias_decls
108
attr_reader :constant_decls
119
attr_reader :global_decls
1210
attr_reader :class_alias_decls
1311

14-
attr_reader :signatures
12+
attr_reader :sources
1513

1614
class SingleEntry
1715
attr_reader :name
@@ -44,9 +42,7 @@ class GlobalEntry < SingleEntry
4442
end
4543

4644
def initialize
47-
@signatures = {}
48-
@declarations = []
49-
45+
@sources = []
5046
@class_decls = {}
5147
@interface_decls = {}
5248
@type_alias_decls = {}
@@ -57,9 +53,7 @@ def initialize
5753
end
5854

5955
def initialize_copy(other)
60-
@signatures = other.signatures.dup
61-
@declarations = other.declarations.dup
62-
56+
@sources = other.sources.dup
6357
@class_decls = other.class_decls.dup
6458
@interface_decls = other.interface_decls.dup
6559
@type_alias_decls = other.type_alias_decls.dup
@@ -368,16 +362,21 @@ def insert_decl(decl, context:, namespace:)
368362
end
369363
end
370364

371-
def <<(decl)
372-
declarations << decl
373-
insert_decl(decl, context: nil, namespace: Namespace.root)
374-
self
365+
def add_source(source)
366+
sources << source
367+
368+
source.declarations.each do |decl|
369+
insert_decl(decl, context: nil, namespace: Namespace.root)
370+
end
375371
end
376372

377-
def add_signature(buffer:, directives:, decls:)
378-
signatures[buffer] = [directives, decls]
379-
decls.each do |decl|
380-
self << decl
373+
def each_rbs_source(&block)
374+
if block
375+
sources.each do |source|
376+
yield source
377+
end
378+
else
379+
enum_for(:each_rbs_source)
381380
end
382381
end
383382

@@ -420,12 +419,14 @@ def resolve_type_names(only: nil)
420419
table.known_types.merge(interface_decls.keys)
421420
table.compute_children
422421

423-
signatures.each do |buffer, (dirs, decls)|
424-
resolve = dirs.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
422+
each_rbs_source do |source|
423+
resolve = source.directives.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
425424
if !resolve || resolve.value
426-
_, decls = resolve_signature(resolver, table, dirs, decls)
425+
_, decls = resolve_signature(resolver, table, source.directives, source.declarations)
426+
else
427+
decls = source.declarations
427428
end
428-
env.add_signature(buffer: buffer, directives: dirs, decls: decls)
429+
env.add_source(Source::RBS.new(source.buffer, source.directives, decls))
429430
end
430431

431432
env
@@ -713,15 +714,16 @@ def inspect
713714
end
714715

715716
def buffers
716-
signatures.keys
717+
sources.map(&:buffer)
717718
end
718719

719720
def unload(buffers)
720721
env = Environment.new
722+
bufs = buffers.to_set
721723

722-
signatures.each do |buf, (dirs, decls)|
723-
next if buffers.include?(buf)
724-
env.add_signature(buffer: buf, directives: dirs, decls: decls)
724+
each_rbs_source do |source|
725+
next if bufs.include?(source.buffer)
726+
env.add_source(source)
725727
end
726728

727729
env

lib/rbs/environment_loader.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ def load(env:)
122122
decls.each do |decl|
123123
loaded << [decl, path, source]
124124
end
125-
env.add_signature(buffer: buffer, directives: dirs, decls: decls)
125+
env.add_source(Source::RBS.new(buffer, dirs, decls))
126126
end
127127

128128
loaded

lib/rbs/source.rb

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# frozen_string_literal: true
2+
3+
module RBS
4+
module Source
5+
class RBS
6+
attr_reader :buffer, :directives, :declarations
7+
8+
def initialize(buffer, directives, decls)
9+
@buffer = buffer
10+
@directives = directives
11+
@declarations = decls
12+
end
13+
14+
def each_type_name(&block)
15+
if block
16+
set = Set[] #: Set[TypeName]
17+
declarations.each do |decl|
18+
each_declaration_type_name(set, decl, &block)
19+
end
20+
else
21+
enum_for :each_type_name
22+
end
23+
end
24+
25+
def each_declaration_type_name(names, decl, &block)
26+
case decl
27+
when AST::Declarations::Class
28+
decl.each_decl { each_declaration_type_name(names, _1, &block) }
29+
type_name = decl.name
30+
when AST::Declarations::Module
31+
decl.each_decl { each_declaration_type_name(names, _1, &block) }
32+
type_name = decl.name
33+
when AST::Declarations::Interface
34+
type_name = decl.name
35+
when AST::Declarations::TypeAlias
36+
type_name = decl.name
37+
when AST::Declarations::ModuleAlias
38+
type_name = decl.new_name
39+
when AST::Declarations::ClassAlias
40+
type_name = decl.new_name
41+
end
42+
43+
if type_name
44+
unless names.include?(type_name)
45+
yield type_name
46+
names << type_name
47+
end
48+
end
49+
end
50+
end
51+
end
52+
end

sig/environment.rbs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ module RBS
3030
class GlobalEntry < SingleEntry[Symbol, AST::Declarations::Global]
3131
end
3232

33-
# Top level declarations
34-
attr_reader declarations: Array[AST::Declarations::t]
33+
# Array of source objects loaded in the environment
34+
#
35+
attr_reader sources: Array[Source::RBS]
3536

3637
# Class declarations
3738
attr_reader class_decls: Hash[TypeName, ModuleEntry | ClassEntry]
@@ -50,10 +51,6 @@ module RBS
5051
# Global declarations
5152
attr_reader global_decls: Hash[Symbol, GlobalEntry]
5253

53-
# A hash from Buffer to it's contents
54-
#
55-
attr_reader signatures: Hash[Buffer, [Array[AST::Directives::t], Array[AST::Declarations::t]]]
56-
5754
def initialize: () -> void
5855

5956
def initialize_copy: (Environment) -> void
@@ -62,11 +59,10 @@ module RBS
6259
#
6360
def self.from_loader: (EnvironmentLoader) -> Environment
6461

65-
def add_signature: (buffer: Buffer, directives: Array[AST::Directives::t], decls: Array[AST::Declarations::t]) -> void
62+
def add_source: (Source::RBS) -> void
6663

67-
# Insert a toplevel declaration into the environment
68-
#
69-
def <<: (AST::Declarations::t decl) -> self
64+
def each_rbs_source: () { (Source::RBS) -> void } -> void
65+
| () -> Enumerator[Source::RBS]
7066

7167
# Insert a declaration into the environment
7268
#

sig/source.rbs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module RBS
2+
module Source
3+
class RBS
4+
attr_reader buffer: Buffer
5+
6+
attr_reader directives: Array[AST::Directives::t]
7+
8+
attr_reader declarations: Array[AST::Declarations::t]
9+
10+
def initialize: (Buffer, Array[AST::Directives::t], Array[AST::Declarations::t]) -> void
11+
12+
# Enumerates defined type names in the source
13+
#
14+
# The order is undefined. Deduplicated per source object.
15+
#
16+
def each_type_name: () { (TypeName) -> void } -> void
17+
| () -> Enumerator[TypeName]
18+
19+
private def each_declaration_type_name: (Set[TypeName], AST::Declarations::t) { (TypeName) -> void } -> void
20+
end
21+
end
22+
end

test/rbs/definition_builder_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2323,7 +2323,7 @@ class Foo
23232323
end
23242324
DEF
23252325
RBS::Parser.parse_signature(rbs).tap do |buf, dirs, decls|
2326-
env.add_signature(buffer: buf, directives: dirs, decls: decls)
2326+
env.add_source(RBS::Source::RBS.new(buf, dirs, decls))
23272327
end
23282328
definition_builder = RBS::DefinitionBuilder.new(env: env.resolve_type_names)
23292329
definition_builder.build_instance(RBS::TypeName.parse("::Foo")).tap do |defn|

0 commit comments

Comments
 (0)