Skip to content

refactor(tree_sitter): let Tree own the source and positions so nodes borrow it and trees are Send - #35

Merged
tanzaku merged 2 commits into
mainfrom
refactor/owned-tree
Oct 29, 2026
Merged

tanzaku merged 2 commits into
mainfrom
refactor/owned-tree

Conversation

@tanzaku

@tanzaku tanzaku commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator

概要

tree_sitter モジュールの Tree / Node / TreeCursor は、位置情報の表を Rc<HashMap<TextRange, Range>> で共有していました。そのため Send ではなく、パースしたツリーを持ったまま .await をまたぐことや、別スレッドへ渡すことができませんでした。

この PR では Tree がソース・ルート・位置情報の表を所有し、Node は &Tree を借用する形に変えます。これで Tree / Node / TreeCursor はすべて Send + Sync になります。

変更内容

  • Tree が src・root・range_map を所有する
  • Node<'a> は { tree: &'a Tree, node_or_token } だけを持つ Copy 型にする(clone のコストが無くなる)
  • 追加した API
    • Node::is_token()
    • Tree::source()
    • TreeCursor::source()
  • 破壊的変更
    • 公開していたフィールドを private にする
    • as_tree_sitter_cursor を削除する

影響

  • 変更したファイルは crates/postgresql-cst-parser/src/tree_sitter.rs だけです。
  • 利用側は .clone() を消すことと、フィールドへの直接アクセスをアクセサに置き換えることが必要になります。

確認

  • 既存のテストがすべて通ること
  • Tree / Node / TreeCursor が Send + Sync であること(コンパイル時のアサーションで確認)

@tanzaku
tanzaku merged commit 056c1c7 into main Oct 29, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant