Class: RBS::Resolver::TypeNameResolver
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/rbs/resolver/type_name_resolver.rb |
Class Method Summary
- .new(env) ⇒ TypeNameResolver constructor
Instance Attribute Summary
- #all_names readonly
- #cache readonly
- #env readonly
Instance Method Summary
Constructor Details
.new(env) ⇒ TypeNameResolver
Instance Attribute Details
#all_names (readonly)
[ GitHub ]# File 'lib/rbs/resolver/type_name_resolver.rb', line 6
attr_reader :all_names
#cache (readonly)
[ GitHub ]# File 'lib/rbs/resolver/type_name_resolver.rb', line 7
attr_reader :cache
#env (readonly)
[ GitHub ]# File 'lib/rbs/resolver/type_name_resolver.rb', line 8
attr_reader :env
Instance Method Details
#has_name?(full_name) ⇒ Boolean
# File 'lib/rbs/resolver/type_name_resolver.rb', line 84
def has_name?(full_name) if all_names.include?(full_name) full_name end end
#partition(type_name)
[ GitHub ]# File 'lib/rbs/resolver/type_name_resolver.rb', line 51
def partition(type_name) if type_name.namespace.empty? head = type_name.name tail = nil else head, *tail = type_name.namespace.path head or raise tail = TypeName.new( name: type_name.name, namespace: Namespace.new(absolute: false, path: tail) ) end [head, tail] end
#resolve(type_name, context:)
[ GitHub ]# File 'lib/rbs/resolver/type_name_resolver.rb', line 28
def resolve(type_name, context:) if type_name.absolute? return type_name end try_cache([type_name, context]) do head, tail = partition(type_name) head = resolve_in(head, context) if head if tail absolute_name = tail.with_prefix(head.to_namespace) if env.normalize_type_name?(absolute_name) absolute_name end else head end end end end
#resolve_in(head, context)
[ GitHub ]# File 'lib/rbs/resolver/type_name_resolver.rb', line 69
def resolve_in(head, context) if context parent, child = context case child when false resolve_in(head, parent) when TypeName name = TypeName.new(name: head, namespace: child.to_namespace) has_name?(name) || resolve_in(head, parent) end else has_name?(TypeName.new(name: head, namespace: Namespace.root)) end end