# Parse Code AST (multi-language)

Fuente conceptual: OpenViking `openviking/parse/parsers/code/ast/` (AGPL-3.0)
Reimplementar desde cero. No copiar codigo.

## Funcion a implementar

### parse_code_ast

- **Dominio:** core
- **Lang:** Python
- **Purity:** pure (opera sobre strings)
- **Signature:** `parse_code_ast(source_code: str, language: str) -> list[CodeEntity]`
- **Tipo de retorno:**
  ```python
  @dataclass
  class CodeEntity:
      kind: str           # "function" | "class" | "method" | "interface" | "type" | "struct" | "trait"
      name: str
      start_line: int
      end_line: int
      signature: str      # firma completa
      docstring: str | None
      children: list["CodeEntity"]  # metodos dentro de clases
  ```
- **Descripcion:** Extrae entidades de codigo (funciones, clases, metodos, tipos) de codigo fuente usando tree-sitter. Soporta multiples lenguajes.
- **Lenguajes soportados:**

| Lenguaje | tree-sitter grammar | Entidades extraidas |
|----------|--------------------|--------------------|
| Python | tree-sitter-python | function_definition, class_definition, decorated_definition |
| JavaScript/TypeScript | tree-sitter-javascript/typescript | function_declaration, class_declaration, interface_declaration, type_alias_declaration |
| Go | tree-sitter-go | function_declaration, method_declaration, type_declaration |
| Rust | tree-sitter-rust | function_item, struct_item, impl_item, trait_item |
| Java | tree-sitter-java | class_declaration, method_declaration, interface_declaration |
| C++ | tree-sitter-cpp | function_definition, class_specifier, template_declaration |

- **Algoritmo:**
  1. Seleccionar grammar de tree-sitter segun `language`
  2. Parsear source_code → AST
  3. Walk del AST buscando nodos relevantes segun el lenguaje
  4. Para cada nodo: extraer nombre, lineas, firma, docstring
  5. Para clases: recursion para extraer metodos como children
- **Deps:** `tree-sitter`, `tree-sitter-{language}` (uno por lenguaje)
- **Error type:** ValueError (lenguaje no soportado)
- **Notas:**
  - tree-sitter >= 0.23 usa nuevo API con `Language.build_library()`
  - Los grammars se instalan como paquetes pip: `pip install tree-sitter-python`
  - La firma se extrae del texto del nodo hasta el body
  - El docstring se extrae del primer string literal hijo (Python) o comentario previo (otros)
- **Tests:** codigo Python con funciones y clases, Go con funciones y tipos, TypeScript con interfaces, codigo vacio, codigo con errores de sintaxis (tree-sitter es tolerante)
