class Steep::TypeInference::TypeEnv

def [](name)

def [](name)
  case name
  when Symbol
    case
    when local_variable_name?(name)
      local_variable_types[name]&.[](0)
    when instance_variable_name?(name)
      instance_variable_types[name]
    when global_name?(name)
      global_types[name]
    else
      raise "Unexpected variable name: #{name}"
    end
  when Parser::AST::Node
    case name.type
    when :lvar
      self[name.children[0]]
    when :send
      if (call, type = pure_method_calls[name])
        type || call.return_type
      end
    end
  end
end