Seit v1.5.0 verwendet LeanCTX tree-sitter für die Signatur-Extraktion statt zeilenweisem Regex-Matching.
Warum tree-sitter?
| Fähigkeit | Regex (alt) | tree-sitter (neu) |
|---|---|---|
| Mehrzeilige Signaturen | Verpasst | Vollständig geparst |
| Arrow Functions | Verpasst | Vollständig geparst |
| Verschachtelte Klassen / Methoden | Einrückungs-Heuristik | AST-Scope-Tracking |
| Decorators / Attribute | Ignoriert | Mit Definitionen verknüpft |
| Unterstützte Sprachen | 4 | 18 |
| Genauigkeit | ~85% | ~99% |
Unterstützte Sprachen
Jede Sprache hat dedizierte tree-sitter-Abfragen.
| Sprache | Erweiterungen | Extrahierte Definitionen |
|---|---|---|
| TypeScript | .ts, .tsx | function, class, abstract class, interface, type alias, method, arrow function |
| JavaScript | .js, .jsx | function, class, method, arrow function |
| Rust | .rs | fn, struct, enum, trait, impl, type, const |
| Python | .py | def, class, async def |
| Go | .go | func, method, type (struct/interface) |
| Java | .java | class, interface, enum, method, constructor |
| C | .c, .h | function, struct, enum, typedef |
| C++ | .cpp, .cc, .hpp | function, class, struct, enum, namespace |
| Ruby | .rb | class, module, method, singleton_method |
| C# | .cs | class, struct, interface, method, property, record |
| Kotlin | .kt, .kts | class, object, fun, property, interface |
| Swift | .swift | class, struct, enum, func, protocol, extension |
| PHP | .php | class, function, interface, trait, namespace |
| Bash / Shell | .sh, .bash | function |
| Dart | .dart | class, mixin, extension, function, method, enum |
| Scala | .scala, .sc | class, object, trait, def, val |
| Elixir | .ex, .exs | defmodule, def, defp, defmacro |
| Zig | .zig | fn, 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:
- LeanCTX erkennt die Dateierweiterung und lädt die entsprechende tree-sitter-Grammatik.
- Der Quellcode wird in einem einzigen Durchlauf in einen AST geparst.
- Vorkompilierte SCM-Abfragen matchen Definitionsknoten.
- Jeder Treffer wird in ein kompaktes
Signature-Objekt konvertiert. - 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.