123456789_123456789_123456789_123456789_123456789_

Class: RBS::Resolver::TypeNameResolver

Relationships & Source Files
Inherits: Object
Defined in: lib/rbs/resolver/type_name_resolver.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(env) ⇒ TypeNameResolver

[ GitHub ]

  
# File 'lib/rbs/resolver/type_name_resolver.rb', line 10

def initialize(env)
  @all_names = Set[]
  @cache = {}
  @env = env

  all_names.merge(env.class_decls.keys)
  all_names.merge(env.interface_decls.keys)
  all_names.merge(env.type_alias_decls.keys)
  all_names.merge(env.class_alias_decls.keys)
end

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

[ GitHub ]

  
# 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

#try_cache(query)

[ GitHub ]

  
# File 'lib/rbs/resolver/type_name_resolver.rb', line 21

def try_cache(query)
  cache.fetch(query) do
    result = yield
    cache[query] = result
  end
end