Skip to content

Commit 3f9a1ff

Browse files
committed
Skip type name resolution if resolved
1 parent 65371a2 commit 3f9a1ff

File tree

3 files changed

+42
-14
lines changed

3 files changed

+42
-14
lines changed

lib/rbs/environment.rb

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,28 @@ def validate_type_params
486486
end
487487
end
488488

489+
def resolve_signature(resolver, table, dirs, decls, only: nil)
490+
map = UseMap.new(table: table)
491+
dirs.each do |dir|
492+
case dir
493+
when AST::Directives::Use
494+
dir.clauses.each do |clause|
495+
map.build_map(clause)
496+
end
497+
end
498+
end
499+
500+
decls = decls.map do |decl|
501+
if only && !only.member?(decl)
502+
decl
503+
else
504+
resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
505+
end
506+
end
507+
508+
[dirs, decls]
509+
end
510+
489511
def resolve_type_names(only: nil)
490512
resolver = Resolver::TypeNameResolver.new(self)
491513
env = Environment.new
@@ -498,21 +520,9 @@ def resolve_type_names(only: nil)
498520
table.compute_children
499521

500522
signatures.each do |buffer, (dirs, decls)|
501-
map = UseMap.new(table: table)
502-
dirs.each do |dir|
503-
dir.clauses.each do |clause|
504-
map.build_map(clause)
505-
end
523+
unless dirs.find { _1.is_a?(AST::Directives::Resolved) }
524+
_, decls = resolve_signature(resolver, table, dirs, decls)
506525
end
507-
508-
decls = decls.map do |decl|
509-
if only && !only.member?(decl)
510-
decl
511-
else
512-
resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
513-
end
514-
end
515-
516526
env.add_signature(buffer: buffer, directives: dirs, decls: decls)
517527
end
518528

sig/environment.rbs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ module RBS
141141
#
142142
def resolve_type_names: (?only: Set[AST::Declarations::t]?) -> Environment
143143

144+
def resolve_signature: (Resolver::TypeNameResolver, UseMap::Table, Array[AST::Directives::t], Array[AST::Declarations::t], ?only: Set[AST::Declarations::t]?) -> [Array[AST::Directives::t], Array[AST::Declarations::t]]
145+
144146
def inspect: () -> String
145147

146148
def buffers: () -> Array[Buffer]

test/rbs/environment_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,4 +549,20 @@ class OB
549549
assert_operator env.class_decls, :key?, RBS::TypeName.parse("::OB")
550550
end
551551
end
552+
553+
def test_resolved_directive
554+
buf, dirs, decls = RBS::Parser.parse_signature(<<-RBS)
555+
# resolved: true
556+
557+
type t = String
558+
RBS
559+
560+
env = Environment.new
561+
env.add_signature(buffer: buf, directives: dirs, decls: decls)
562+
563+
env.resolve_type_names.tap do |env|
564+
alias_decl = env.type_alias_decls[RBS::TypeName.parse("::t")]
565+
assert_equal "String", alias_decl.decl.type.to_s
566+
end
567+
end
552568
end

0 commit comments

Comments
 (0)