Documentación

Motor tree-sitter

Extracción de firmas potenciada por AST usando tree-sitter para 18 lenguajes de programación.

Desde la v1.5.0, LeanCTX usa tree-sitter para la extracción de firmas en lugar de la coincidencia regex línea por línea. tree-sitter analiza el código fuente en un Árbol de Sintaxis Abstracta (AST) completo, permitiendo la extracción precisa de firmas multilínea, funciones flecha, decoradores y definiciones anidadas que regex no puede manejar.

¿Por qué tree-sitter?

CapacidadRegex (anterior)tree-sitter (nuevo)
Firmas multilíneaNo detectadasCompletamente analizadas
Funciones flechaNo detectadasCompletamente analizadas
Clases / métodos anidadosHeurística de indentaciónSeguimiento de alcance AST
Decoradores / atributosIgnoradosAsociados con definiciones
Lenguajes soportados418
Precisión~85%~99%

Lenguajes soportados

Cada lenguaje tiene consultas de tree-sitter dedicadas que extraen los siguientes tipos de definición:

LenguajeExtensionesDefiniciones extraídas
TypeScript.ts, .tsxfunction, class, abstract class, interface, type alias, method, arrow function
JavaScript.js, .jsxfunction, class, method, arrow function
Rust.rsfn, struct, enum, trait, impl, type, const
Python.pydef, class, async def
Go.gofunc, method, type (struct/interface)
Java.javaclass, interface, enum, method, constructor
C.c, .hfunction, struct, enum, typedef
C++.cpp, .cc, .hppfunction, class, struct, enum, namespace
Ruby.rbclass, module, method, singleton_method
C#.csclass, struct, interface, method, property, record
Kotlin.kt, .ktsclass, object, fun, property, interface
Swift.swiftclass, struct, enum, func, protocol, extension
PHP.phpclass, function, interface, trait, namespace
Bash / Shell.sh, .bashfunction
Dart.dartclass, mixin, extension, function, method, enum
Scala.scala, .scclass, object, trait, def, val
Elixir.ex, .exsdefmodule, def, defp, defmacro
Zig.zigfn, struct, enum, union

Svelte (.svelte), Vue (.vue) y otras extensiones no soportadas recurren automáticamente al extractor basado en regex para sintaxis similar a TS/JS.

Cómo funciona

Cuando usas ctx_read con --mode signatures o --mode map:

  1. LeanCTX detecta la extensión del archivo y carga la gramática de tree-sitter correspondiente.
  2. El código fuente se analiza en un AST en una sola pasada.
  3. Las consultas SCM precompiladas coinciden con nodos de definición (funciones, clases, structs, etc.).
  4. Cada coincidencia se convierte en un objeto Signature compacto con nombre, parámetros, tipo de retorno, visibilidad y estado async.
  5. Las firmas se formatean usando notación compacta (o notación TDD si está habilitada).

Ejemplo: firma Rust multilínea

El extractor regex no detectaría esta función multilínea. tree-sitter la maneja correctamente:

// Source (Rust)
pub fn complex_function<T: Display + Debug>(
    first_arg: &str,
    second_arg: Vec<T>,
    third_arg: Option<HashMap<String, Vec<u8>>>,
) -> Result<(), Box<dyn Error>> {
    Ok(())
}

// signatures mode output:
fn ⊛ complex_function(first_arg:&str, second_arg:Vec<T>, third_arg:Option<HashMap<String, Vec<u8>>>) → Result<(), Box<dyn Error>>

Ejemplo: funciones flecha (TypeScript)

// Source (TypeScript)
export const fetchData = async (url: string): Promise<Response> => {
    return fetch(url);
};

// signatures mode output:
fn ⊛ fetchData(url:s) → Promise<Response>

Tamaño del binario

Las gramáticas de tree-sitter incluyen parsers de C compilados, lo que aumenta el tamaño del binario de ~5.7 MB a ~17 MB. Si el tamaño es crítico, puedes compilar sin tree-sitter:

# Build from source without tree-sitter (regex-only, 4 languages)
cargo install lean-ctx --no-default-features

La fórmula predeterminada de Homebrew y cargo install lean-ctx incluyen tree-sitter con los 18 lenguajes.

Ver también