class Tapioca::Static::SymbolTableParser

def fully_qualified_name(name)

def fully_qualified_name(name)
  [*@parents, name].join("::")
end

def initialize

def initialize
  @symbols = T.let(Set.new, T::Set[String])
  @parents = T.let([], T::Array[String])
end

def parse_json(json_string)

def parse_json(json_string)
  obj = JSON.parse(json_string)
  parser = SymbolTableParser.new
  parser.parse_object(obj)
  parser.symbols
rescue JSON::ParserError
  Set.new
end

def parse_object(object)

def parse_object(object)
  children = object.fetch("children", [])
  children.each do |child|
    kind = child.fetch("kind")
    name = child.fetch("name")
    name = name.fetch("name") if name.is_a?(Hash)
    next if name.nil?
    next unless SKIP_PARSE_KINDS.include?(kind)
    # Turn singleton class names to attached class names
    if (match_data = name.match(/<Class:(.*)>/))
      name = match_data[1]
    end
    next if name.match?(/[<>()$]/)
    next if name.match?(/^[0-9]+$/)
    next if name == "T::Helpers"
    @symbols.add(fully_qualified_name(name))
    @parents << name
    parse_object(child)
    @parents.pop
  end
end