module Solargraph::TypeChecker::Checks

Helper methods for performing type checks

Public Instance Methods

any_types_match?(api_map, expected, inferred) click to toggle source

@param api_map [ApiMap] @param expected [ComplexType] @param inferred [ComplexType] @return [Boolean]

# File lib/solargraph/type_checker/checks.rb, line 52
def any_types_match? api_map, expected, inferred
  return duck_types_match?(api_map, expected, inferred) if expected.duck_type?
  expected.each do |exp|
    next if exp.duck_type?
    inferred.each do |inf|
      # return true if exp == inf || api_map.super_and_sub?(fuzz(inf), fuzz(exp))
      return true if exp == inf || either_way?(api_map, inf, exp)
    end
  end
  false
end
duck_types_match?(api_map, expected, inferred) click to toggle source

@param api_map [ApiMap] @param expected [ComplexType] @param inferred [ComplexType] @return [Boolean]

# File lib/solargraph/type_checker/checks.rb, line 68
def duck_types_match? api_map, expected, inferred
  raise ArgumentError, 'Expected type must be duck type' unless expected.duck_type?
  expected.each do |exp|
    next unless exp.duck_type?
    quack = exp.to_s[1..-1]
    return false if api_map.get_method_stack(inferred.namespace, quack, scope: inferred.scope).empty?
  end
  true
end
either_way?(api_map, cls1, cls2) click to toggle source

@param api_map [ApiMap] @param cls1 [ComplexType] @param cls2 [ComplexType] @return [Boolean]

# File lib/solargraph/type_checker/checks.rb, line 92
def either_way?(api_map, cls1, cls2)
  f1 = fuzz(cls1)
  f2 = fuzz(cls2)
  api_map.super_and_sub?(f1, f2) || api_map.super_and_sub?(f2, f1)
end
fuzz(type) click to toggle source

@param type [ComplexType] @return [String]

# File lib/solargraph/type_checker/checks.rb, line 80
def fuzz type
  if type.parameters?
    type.name
  else
    type.tag
  end
end
types_match?(api_map, expected, inferred) click to toggle source

Compare an expected type with an inferred type. Common usage is to check if the type declared in a method's @return tag matches the type inferred from static analysis of the code.

@param api_map [ApiMap] @param expected [ComplexType] @param inferred [ComplexType] @return [Boolean]

# File lib/solargraph/type_checker/checks.rb, line 18
def types_match? api_map, expected, inferred
  return true if expected.to_s == inferred.to_s
  matches = []
  expected.each do |exp|
    found = false
    inferred.each do |inf|
      # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
      if either_way?(api_map, inf, exp)
        found = true
        matches.push inf
        break
      end
    end
    return false unless found
  end
  inferred.each do |inf|
    next if matches.include?(inf)
    found = false
    expected.each do |exp|
      # if api_map.super_and_sub?(fuzz(inf), fuzz(exp))
      if either_way?(api_map, inf, exp)
        found = true
        break
      end
    end
    return false unless found
  end
  true
end