ドキュメント

tree-sitter エンジン

18のプログラミング言語に対応した tree-sitter による AST 駆動のシグネチャ抽出。

v1.5.0 以降、LeanCTX は行単位の正規表現マッチングの代わりに tree-sitter をシグネチャ抽出に使用しています。tree-sitter はソースコードを完全な抽象構文木(AST)に解析し、正規表現では処理できない複数行シグネチャ、アロー関数、デコレータ、ネストされた定義の正確な抽出を可能にします。

なぜ tree-sitter か?

機能正規表現(旧)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 ライクな構文の正規表現ベースエクストラクタに自動的にフォールバックします。

仕組み

ctx_read--mode signatures または --mode map を使用する場合:

  1. LeanCTX がファイル拡張子を検出し、対応する tree-sitter 文法をロードします。
  2. ソースコードが1回のパスで AST に解析されます。
  3. プリコンパイル済みの SCM クエリが定義ノード(関数、クラス、構造体など)にマッチします。
  4. 各マッチは、名前、パラメータ、戻り値の型、可視性、非同期ステータスを含むコンパクトな Signature オブジェクトに変換されます。
  5. シグネチャはコンパクト記法(または 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 が付属しています。

関連項目