class Steep::Signature::Validator

def builder

def builder
  checker.factory.definition_builder
end

def each_error(&block)

def each_error(&block)
  if block_given?
    @errors.each(&block)
  else
    enum_for :each_error
  end
end

def env

def env
  checker.factory.env
end

def factory

def factory
  checker.factory
end

def has_error?

def has_error?
  !no_error?
end

def initialize(checker:)

def initialize(checker:)
  @checker = checker
  @errors = []
end

def no_error?

def no_error?
  @errors.empty?
end

def rescue_validation_errors

def rescue_validation_errors
  yield
rescue RBS::InvalidTypeApplicationError => exn
  @errors << Errors::InvalidTypeApplicationError.new(
    name: factory.type_name(exn.type_name),
    args: exn.args.map {|ty| factory.type(ty) },
    params: exn.params.each.map(&:name),
    location: exn.location
  )
rescue RBS::NoTypeFoundError => exn
  @errors << Errors::UnknownTypeNameError.new(
    name: factory.type_name(exn.type_name),
    location: exn.location
  )
end

def validate

def validate
  @errors = []
  validate_decl
  validate_const
  validate_global
end

def validate_alias

def validate_alias
  env.each_alias do |name, decl|
    rescue_validation_errors do
      Steep.logger.debug "#{Location.to_string decl.location}:\tValidating alias `#{name}`..."
      env.validate(decl.type, namespace: name.namespace)
    end
  end
end

def validate_const

def validate_const
  env.each_constant do |name, decl|
    rescue_validation_errors do
      Steep.logger.debug "#{Location.to_string decl.location}:\tValidating constant `#{name}`..."
      env.validate(decl.type, namespace: name.namespace)
    end
  end
end

def validate_decl

def validate_decl
  env.each_decl do |name, decl|
    validate_one_decl name, decl
  end
end

def validate_global

def validate_global
  env.each_global do |name, decl|
    rescue_validation_errors do
      Steep.logger.debug "#{Location.to_string decl.location}:\tValidating global `#{name}`..."
      env.validate(decl.type, namespace: RBS::Namespace.root)
    end
  end
end

def validate_one_decl(name, decl)

def validate_one_decl(name, decl)
  case decl
  when Declarations::Class
    rescue_validation_errors do
      Steep.logger.debug "#{Location.to_string decl.location}:\tValidating class definition `#{name}`..."
      builder.build_instance(decl.name.absolute!).each_type do |type|
        env.validate type, namespace: RBS::Namespace.root
      end
      builder.build_singleton(decl.name.absolute!).each_type do |type|
        env.validate type, namespace: RBS::Namespace.root
      end
    end
  when Declarations::Interface
    rescue_validation_errors do
      Steep.logger.debug "#{Location.to_string decl.location}:\tValidating interface `#{name}`..."
      builder.build_interface(decl.name.absolute!, decl).each_type do |type|
        env.validate type, namespace: RBS::Namespace.root
      end
    end
  end
end