Sha256: 355b1ad009b8bf416eeb950f15616aede4ccd26dac94eea0325ade2dc9513022

Contents?: true

Size: 1.63 KB

Versions: 18

Compression:

Stored size: 1.63 KB

Contents

module RBS
  class Validator
    attr_reader :env
    attr_reader :resolver

    def initialize(env:, resolver:)
      @env = env
      @resolver = resolver
    end

    def absolute_type(type, context:)
      type.map_type_name do |type_name, _, type|
        resolver.resolve(type_name, context: context) || yield(type)
      end
    end

    # Validates presence of the relative type, and application arity match.
    def validate_type(type, context:)
      case type
      when Types::ClassInstance, Types::Interface
        if type.name.namespace.relative?
          type = absolute_type(type, context: context) do |type|
            NoTypeFoundError.check!(type.name.absolute!, env: env, location: type.location)
          end
        end

        type_params = case type
                      when Types::ClassInstance
                        env.class_decls[type.name]&.type_params
                      when Types::Interface
                        env.interface_decls[type.name]&.decl&.type_params
                      end

        unless type_params
          raise NoTypeFoundError.new(type_name: type.name, location: type.location)
        end

        InvalidTypeApplicationError.check!(
          type_name: type.name,
          args: type.args,
          params: type_params.each.map(&:name),
          location: type.location
        )

      when Types::Alias, Types::ClassSingleton
        type = absolute_type(type, context: context) { type.name.absolute! }
        NoTypeFoundError.check!(type.name, env: env, location: type.location)
      end

      type.each_type do |type|
        validate_type(type, context: context)
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
rbs-0.20.1 lib/rbs/validator.rb
rbs-0.20.0 lib/rbs/validator.rb
rbs-0.19.0 lib/rbs/validator.rb
rbs-0.18.1 lib/rbs/validator.rb
rbs-0.18.0 lib/rbs/validator.rb
rbs-0.17.0 lib/rbs/validator.rb
rbs-0.16.0 lib/rbs/validator.rb
rbs-0.15.0 lib/rbs/validator.rb
rbs-0.14.0 lib/rbs/validator.rb
rbs-0.13.1 lib/rbs/validator.rb
rbs-0.13.0 lib/rbs/validator.rb
rbs-0.12.2 lib/rbs/validator.rb
rbs-0.12.1 lib/rbs/validator.rb
rbs-0.12.0 lib/rbs/validator.rb
rbs-0.11.0 lib/rbs/validator.rb
rbs-0.10.0 lib/rbs/validator.rb
rbs-0.9.1 lib/rbs/validator.rb
rbs-0.9.0 lib/rbs/validator.rb