v1.5.0 থেকে, LeanCTX লাইন-বাই-লাইন রেজেক্স ম্যাচিং-এর পরিবর্তে সিগনেচার এক্সট্রাকশনের জন্য tree-sitter ব্যবহার করে। Tree-sitter সোর্স কোডকে একটি সম্পূর্ণ Abstract Syntax Tree (AST)-তে পার্স করে, যা মাল্টি-লাইন সিগনেচার, অ্যারো ফাংশন, ডেকোরেটর এবং নেস্টেড সংজ্ঞার নির্ভুল এক্সট্রাকশন সক্ষম করে যা রেজেক্স পরিচালনা করতে পারে না।
কেন tree-sitter?
| সক্ষমতা | রেজেক্স (পুরনো) | 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-সদৃশ সিনট্যাক্সের জন্য স্বয়ংক্রিয়ভাবে রেজেক্স-ভিত্তিক এক্সট্রাক্টরে ফলব্যাক করে।
কীভাবে কাজ করে
আপনি যখন ctx_read-এ --mode signatures বা --mode map ব্যবহার করেন:
- LeanCTX ফাইল এক্সটেনশন সনাক্ত করে এবং সংশ্লিষ্ট tree-sitter গ্রামার লোড করে।
- সোর্স কোড একটি একক পাসে AST-তে পার্স করা হয়।
- প্রি-কম্পাইলড SCM কোয়েরি সংজ্ঞা নোড (ফাংশন, ক্লাস, স্ট্রাক্ট, ইত্যাদি) ম্যাচ করে।
- প্রতিটি ম্যাচ নাম, প্যারামিটার, রিটার্ন টাইপ, ভিজিবিলিটি এবং async স্ট্যাটাসসহ একটি কমপ্যাক্ট
Signatureঅবজেক্টে রূপান্তরিত হয়। - সিগনেচারগুলো কমপ্যাক্ট নোটেশন (বা TDD নোটেশন সক্রিয় থাকলে) ব্যবহার করে ফরম্যাট করা হয়।
উদাহরণ: মাল্টি-লাইন Rust সিগনেচার
রেজেক্স এক্সট্রাক্টর এই মাল্টি-লাইন ফাংশন মিস করবে। 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 অন্তর্ভুক্ত করে।