class Steep::Interface::Shape::MethodOverload

def initialize(method_type, defs)

def initialize(method_type, defs)
  @method_type = method_type
  @method_defs = defs.sort_by do |defn|
    buf = +""
    if loc = defn.type.location
      buf << loc.buffer.name.to_s
      buf << ":"
      buf << loc.start_pos.to_s
    end
    buf
  end
  @method_defs.uniq!
end

def method_decls(name)

def method_decls(name)
  method_defs.map do |defn|
    type_name = defn.implemented_in || defn.defined_in
    if name == :new && defn.member.is_a?(RBS::AST::Members::MethodDefinition) && defn.member.name == :initialize
      method_name = SingletonMethodName.new(type_name: type_name, method_name: name)
    else
      method_name =
        if defn.member.kind == :singleton
          SingletonMethodName.new(type_name: defn.defined_in, method_name: name)
        else
          # Call the `self?` method an instance method, because the definition is done with instance method definition, not with singleton method
          InstanceMethodName.new(type_name: defn.defined_in, method_name: name)
        end
    end
    TypeInference::MethodCall::MethodDecl.new(method_def: defn, method_name: method_name)
  end
end

def subst(s)

def subst(s)
  overload = MethodOverload.new(method_type.subst(s), [])
  overload.method_defs.replace(method_defs)
  overload
end