class Steep::TypeInference::LocalVariableTypeEnv

def join(*envs)

def join(*envs)
  if envs.empty?
    self
  else
    env = envs.inject do |env1, env2|
      assigned_types = {}
      declared_types = {}
      (env1.vars + env2.vars).each do |var|
        e1 = env1.entry(var)
        e2 = env2.entry(var)
        je = join_entry(e1, e2)
        if env1.declared_types.key?(var) || env2.declared_types.key?(var)
          declared_types[var] = je
        else
          assigned_types[var] = je
        end
      end
      LocalVariableTypeEnv.new(
        subtyping: subtyping,
        self_type: self_type,
        declared_types: declared_types,
        assigned_types: assigned_types
      )
    end
    decls = env.declared_types.merge(declared_types)
    assignments = env.assigned_types.reject {|var, _| decls.key?(var) }
    update(
      declared_types: decls,
      assigned_types: assignments,
    )
  end
end