v1.5.0 以降、LeanCTX は行単位の正規表現マッチングの代わりに tree-sitter をシグネチャ抽出に使用しています。tree-sitter はソースコードを完全な抽象構文木(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 文法をロードします。
- ソースコードが1回のパスで AST に解析されます。
- プリコンパイル済みの SCM クエリが定義ノード(関数、クラス、構造体など)にマッチします。
- 各マッチは、名前、パラメータ、戻り値の型、可視性、非同期ステータスを含むコンパクトな
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 が付属しています。