v1.5.0 से, LeanCTX पंक्ति-दर-पंक्ति regex मिलान के बजाय सिग्नेचर एक्सट्रैक्शन के लिए tree-sitter का उपयोग करता है। Tree-sitter सोर्स कोड को एक पूर्ण Abstract Syntax Tree (AST) में पार्स करता है, जो बहु-पंक्ति सिग्नेचर, एरो फ़ंक्शन, डेकोरेटर और नेस्टेड परिभाषाओं का सटीक निष्कर्षण सक्षम करता है जो regex संभाल नहीं सकता।
tree-sitter क्यों?
| क्षमता | Regex (पुराना) | tree-sitter (नया) |
|---|---|---|
| बहु-पंक्ति सिग्नेचर | छूटा | पूरी तरह पार्स |
| एरो फ़ंक्शन | छूटा | पूरी तरह पार्स |
| नेस्टेड क्लास / मेथड | इंडेंटेशन अनुमानी | AST स्कोप ट्रैकिंग |
| डेकोरेटर / एट्रिब्यूट | अनदेखा | परिभाषाओं से संबद्ध |
| समर्थित भाषाएँ | 4 | 18 |
| सटीकता | ~85% | ~99% |
समर्थित भाषाएँ
प्रत्येक भाषा में समर्पित tree-sitter क्वेरी हैं जो निम्नलिखित परिभाषा प्रकार निकालती हैं:
| भाषा | एक्सटेंशन | निकाली गई परिभाषाएँ |
|---|---|---|
| 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 (.svelte), Vue (.vue), और अन्य असमर्थित एक्सटेंशन TS/JS-जैसे सिंटैक्स के लिए regex-आधारित एक्सट्रैक्टर पर स्वचालित रूप से फ़ॉलबैक होते हैं।
यह कैसे काम करता है
जब आप ctx_read को --mode signatures या --mode map के साथ उपयोग करते हैं:
- LeanCTX फ़ाइल एक्सटेंशन पहचानता है और संबंधित tree-sitter ग्रामर लोड करता है।
- सोर्स कोड को एक पास में AST में पार्स किया जाता है।
- पूर्व-कंपाइल SCM क्वेरी परिभाषा नोड (फ़ंक्शन, क्लास, स्ट्रक्ट, आदि) से मेल खाती हैं।
- प्रत्येक मैच को नाम, पैरामीटर, रिटर्न टाइप, विज़िबिलिटी और async स्थिति के साथ एक संक्षिप्त
Signatureऑब्जेक्ट में परिवर्तित किया जाता है। - सिग्नेचर संक्षिप्त नोटेशन (या TDD नोटेशन अगर सक्षम हो) का उपयोग करके फ़ॉर्मैट किए जाते हैं।
उदाहरण: बहु-पंक्ति Rust सिग्नेचर
regex एक्सट्रैक्टर इस बहु-पंक्ति फ़ंक्शन को मिस कर देगा। tree-sitter इसे सही ढंग से संभालता है:
// 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>> उदाहरण: एरो फ़ंक्शन (TypeScript)
// Source (TypeScript)
export const fetchData = async (url: string): Promise<Response> => {
return fetch(url);
};
// signatures mode output:
fn ⊛ fetchData(url:s) → Promise<Response> बाइनरी आकार
Tree-sitter ग्रामर में कंपाइल किए गए C पार्सर शामिल हैं, जो बाइनरी आकार को ~5.7 MB से ~17 MB तक बढ़ाता है। यदि आकार महत्वपूर्ण है, तो आप tree-sitter के बिना बिल्ड कर सकते हैं:
# Build from source without tree-sitter (regex-only, 4 languages)
cargo install lean-ctx --no-default-features डिफ़ॉल्ट Homebrew फ़ॉर्मूला और cargo install lean-ctx सभी 18 भाषाओं के साथ tree-sitter शामिल करते हैं।