Sha256: 84d0d822465884760a9c06496bdbb6154dc75ead5b0b2d141fcc97b2428d594f

Contents?: true

Size: 1.58 KB

Versions: 12

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

module RBS
  class TypeNameResolver
    Query = _ = Struct.new(:type_name, :context, keyword_init: true)

    attr_reader :all_names
    attr_reader :cache

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

    def self.from_env(env)
      new.add_names(env.class_decls.keys)
        .add_names(env.interface_decls.keys)
        .add_names(env.alias_decls.keys)
    end

    def add_names(names)
      all_names.merge(names)
      self
    end

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

    def resolve(type_name, context:)
      if type_name.absolute?
        return type_name
      end

      query = Query.new(type_name: type_name, context: context)
      try_cache(query) do
        path_head, *path_tail = type_name.split
        raise unless path_head

        name_head = TypeName.new(name: path_head, namespace: Namespace.empty)

        absolute_head = context.find do |namespace|
          # @type break: TypeName
          full_name = name_head.with_prefix(namespace)
          has_name?(full_name) and break full_name
        end

        case absolute_head
        when TypeName
          has_name?(Namespace.new(path: absolute_head.to_namespace.path.push(*path_tail), absolute: true).to_type_name)
        when Namespace
          # This cannot happen because the `context.find` doesn't return a Namespace.
          raise
        end
      end
    end

    def has_name?(full_name)
      if all_names.include?(full_name)
        full_name
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 2 rubygems

Version Path
getargv-0.3.3-universal-darwin vendor/bundle/ruby/3.3.0/gems/rbs-2.8.4/lib/rbs/type_name_resolver.rb
rbs-2.8.4 lib/rbs/type_name_resolver.rb
rbs-2.8.3 lib/rbs/type_name_resolver.rb
rbs-3.0.0.dev.1 lib/rbs/type_name_resolver.rb
rbs-2.8.2 lib/rbs/type_name_resolver.rb
rbs-2.8.1 lib/rbs/type_name_resolver.rb
rbs-2.8.0 lib/rbs/type_name_resolver.rb
rbs-2.8.0.pre.1 lib/rbs/type_name_resolver.rb
rbs-2.7.0 lib/rbs/type_name_resolver.rb
rbs-2.7.0.pre.3 lib/rbs/type_name_resolver.rb
rbs-2.7.0.pre.2 lib/rbs/type_name_resolver.rb
rbs-2.7.0.pre.1 lib/rbs/type_name_resolver.rb