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