.cr
Crystal
(text/x-crystal)
require "tree_sitter"

require "./extract_symbols.cr"

class GitFOSS::Code::Indexer
  VERSION = "0.1.0"

  LANGUAGE = "c"

  @parser = TreeSitter::Parser.new
  @files = [] of String
  @symbols = {} of String => Array(CodeSymbol)

  def initialize
    TreeSitter::Repository.preload_all
  end

  def files=(values : Array(String))
    @files = values
  end

  def get_files_symbols : Hash(String, Array(CodeSymbol))
    @files.each do |p|
      @symbols[p] = get_symbols(p)
    end
    @symbols
  end

  def get_symbols(
    file_path : String
  ) : Array(CodeSymbol)
    symbols = [] of CodeSymbol

    path = Path[file_path]
    File.open(path) do |f|
      file = RepositoryFile.new(
        name: path.basename,
        content: f.gets_to_end,
      )
      @parser = TreeSitter::Parser.new (LANGUAGE)

      io = IO::Memory.new(file.content)
      tree = @parser.parse(nil, io)

      symbols = extract_symbols(
        @parser,
        tree.root_node,
        file,
      )

      pp tree.root_node
      pp symbols
    end

    symbols
  end
end

code_indexer = GitFOSS::Code::Indexer.new

# pp TreeSitter::Repository.language_names

code_indexer.files = [
  # "/home/xana/Dev/gitfoss-code-indexer/src/extract_symbols.cr",
  # "/home/xana/Dev/gitfoss-code-indexer/shard.yml",
  # "/home/xana/Dev/gitfoss/app/islands/RepositoriesList.tsx",
  "/home/xana/Dev/crystal-os/src/kernel/archive/c/main.c"
]

symbols = code_indexer.get_files_symbols
pp symbols