class Steep::Subtyping::VariableOccurence

def self.from_method_type(method_type)

def self.from_method_type(method_type)
  self.new.tap do |occurence|
    occurence.add_method_type(method_type)
  end
end

def add_method_type(method_type)

def add_method_type(method_type)
  method_type.params.each_type do |type|
    each_var(type) do |var|
      params << var
    end
  end
  each_var(method_type.return_type) do |var|
    returns << var
  end
  method_type.block&.yield_self do |block|
    block.type.params.each_type do |type|
      each_var(type) do |var|
        params << var
      end
    end
    each_var(block.type.return_type) do |var|
      returns << var
    end
  end
end

def each_var(type, &block)

def each_var(type, &block)
  type.free_variables.each(&block)
end

def initialize

def initialize
  @params = Set.new
  @returns = Set.new
end

def strictly_return?(var)

def strictly_return?(var)
  !params.member?(var) && returns.member?(var)
end