प्रलेखन

Tree-sitter इंजन

18 प्रोग्रामिंग भाषाओं के लिए tree-sitter का उपयोग करके AST-संचालित सिग्नेचर एक्सट्रैक्शन।

v1.5.0 से, LeanCTX पंक्ति-दर-पंक्ति regex मिलान के बजाय सिग्नेचर एक्सट्रैक्शन के लिए tree-sitter का उपयोग करता है। Tree-sitter सोर्स कोड को एक पूर्ण Abstract Syntax Tree (AST) में पार्स करता है, जो बहु-पंक्ति सिग्नेचर, एरो फ़ंक्शन, डेकोरेटर और नेस्टेड परिभाषाओं का सटीक निष्कर्षण सक्षम करता है जो regex संभाल नहीं सकता।

tree-sitter क्यों?

क्षमताRegex (पुराना)tree-sitter (नया)
बहु-पंक्ति सिग्नेचरछूटापूरी तरह पार्स
एरो फ़ंक्शनछूटापूरी तरह पार्स
नेस्टेड क्लास / मेथडइंडेंटेशन अनुमानीAST स्कोप ट्रैकिंग
डेकोरेटर / एट्रिब्यूटअनदेखापरिभाषाओं से संबद्ध
समर्थित भाषाएँ418
सटीकता~85%~99%

समर्थित भाषाएँ

प्रत्येक भाषा में समर्पित tree-sitter क्वेरी हैं जो निम्नलिखित परिभाषा प्रकार निकालती हैं:

भाषाएक्सटेंशननिकाली गई परिभाषाएँ
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), और अन्य असमर्थित एक्सटेंशन TS/JS-जैसे सिंटैक्स के लिए regex-आधारित एक्सट्रैक्टर पर स्वचालित रूप से फ़ॉलबैक होते हैं।

यह कैसे काम करता है

जब आप ctx_read को --mode signatures या --mode map के साथ उपयोग करते हैं:

  1. LeanCTX फ़ाइल एक्सटेंशन पहचानता है और संबंधित tree-sitter ग्रामर लोड करता है।
  2. सोर्स कोड को एक पास में AST में पार्स किया जाता है।
  3. पूर्व-कंपाइल SCM क्वेरी परिभाषा नोड (फ़ंक्शन, क्लास, स्ट्रक्ट, आदि) से मेल खाती हैं।
  4. प्रत्येक मैच को नाम, पैरामीटर, रिटर्न टाइप, विज़िबिलिटी और async स्थिति के साथ एक संक्षिप्त Signature ऑब्जेक्ट में परिवर्तित किया जाता है।
  5. सिग्नेचर संक्षिप्त नोटेशन (या 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 शामिल करते हैं।

यह भी देखें