Dokumentation

Tree-sitter Engine

AST-basierte Signatur-Extraktion mit tree-sitter für 18 Programmiersprachen.

Seit v1.5.0 verwendet LeanCTX tree-sitter für die Signatur-Extraktion statt zeilenweisem Regex-Matching.

Warum tree-sitter?

FähigkeitRegex (alt)tree-sitter (neu)
Mehrzeilige SignaturenVerpasstVollständig geparst
Arrow FunctionsVerpasstVollständig geparst
Verschachtelte Klassen / MethodenEinrückungs-HeuristikAST-Scope-Tracking
Decorators / AttributeIgnoriertMit Definitionen verknüpft
Unterstützte Sprachen418
Genauigkeit~85%~99%

Unterstützte Sprachen

Jede Sprache hat dedizierte tree-sitter-Abfragen.

SpracheErweiterungenExtrahierte Definitionen
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, Vue und andere nicht unterstützte Erweiterungen fallen automatisch auf den regex-basierten Extraktor zurück.

So funktioniert es

Wenn du ctx_read mit --mode signatures oder --mode map verwendest:

  1. LeanCTX erkennt die Dateierweiterung und lädt die entsprechende tree-sitter-Grammatik.
  2. Der Quellcode wird in einem einzigen Durchlauf in einen AST geparst.
  3. Vorkompilierte SCM-Abfragen matchen Definitionsknoten.
  4. Jeder Treffer wird in ein kompaktes Signature-Objekt konvertiert.
  5. Die Signaturen werden in kompakter Notation formatiert.

Beispiel: Mehrzeilige Rust-Signatur

tree-sitter verarbeitet mehrzeilige Funktionen korrekt:

// 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>>

Beispiel: Arrow Functions (TypeScript)

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

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

Binärgrösse

Tree-sitter-Grammatiken erhöhen die Binärgrösse von ~5.7 MB auf ~17 MB.

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

Die Standard-Homebrew-Formel enthält tree-sitter mit allen 18 Sprachen.

Siehe auch