Sha256: 7e9e6ba339384f6943bafb8e53953009105bcc0ad98f467bcc4af467f3f27a63

Contents?: true

Size: 1.76 KB

Versions: 17

Compression:

Stored size: 1.76 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
        # @type var type: Types::ClassInstance | Types::Interface
        if type.name.namespace.relative?
          type = _ = absolute_type(type, context: context) do |_|
            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 var type: 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

17 entries across 17 versions & 1 rubygems

Version Path
rbs-1.3.3 lib/rbs/validator.rb
rbs-1.3.2 lib/rbs/validator.rb
rbs-1.3.1 lib/rbs/validator.rb
rbs-1.3.0 lib/rbs/validator.rb
rbs-1.2.1 lib/rbs/validator.rb
rbs-1.2.0 lib/rbs/validator.rb
rbs-1.1.1 lib/rbs/validator.rb
rbs-1.1.0 lib/rbs/validator.rb
rbs-1.0.6 lib/rbs/validator.rb
rbs-1.0.5 lib/rbs/validator.rb
rbs-1.0.4 lib/rbs/validator.rb
rbs-1.0.3 lib/rbs/validator.rb
rbs-1.0.2 lib/rbs/validator.rb
rbs-1.0.1 lib/rbs/validator.rb
rbs-1.0.0 lib/rbs/validator.rb
rbs-1.0.0.pre2 lib/rbs/validator.rb
rbs-1.0.0.pre lib/rbs/validator.rb