class Steep::Index::SourceIndex

def add_definition(constant: nil, method: nil, definition:)

def add_definition(constant: nil, method: nil, definition:)
  @count += 1
  entry(constant: constant, method: method).add_definition(definition)
  self
end

def add_reference(constant: nil, method: nil, ref:)

def add_reference(constant: nil, method: nil, ref:)
  @count += 1
  entry(constant: constant, method: method).add_reference(ref)
  self
end

def entry(constant: nil, method: nil)

def entry(constant: nil, method: nil)
  case
  when constant
    constant_index[constant] ||= ConstantEntry.new(name: constant)
  when method
    method_index[method] ||= MethodEntry.new(name: method)
  else
    raise
  end
end

def initialize(source:, parent: nil)

def initialize(source:, parent: nil)
  @source = source
  @parent = parent
  @parent_count = parent&.count
  @count = @parent_count || 0
  @constant_index = {}
  @method_index = {}
end

def merge!(child)

def merge!(child)
  raise unless child.parent == self
  raise unless child.parent_count == count
  constant_index.merge!(child.constant_index) do |_, entry, child_entry|
    entry.merge!(child_entry)
  end
  method_index.merge!(child.method_index) do |_, entry, child_entry|
    entry.merge!(child_entry)
  end
  @count = child.count + 1
end

def new_child

def new_child
  SourceIndex.new(source: source, parent: self)
end