アーキテクチャ

SharpLsp は、エディタープロトコルの処理と、コンパイラーに基づくセマンティック解析を分離しています。
graph LR
Editor([エディター / IDE])
subgraph T1[第 1 層 — Rust LSP ホスト]
direction TB
LSP[LSP サーバー\nJSON-RPC over stdio]
Router[リクエストルーター]
VFS[仮想ファイルシステム]
TS[tree-sitter\nC#]
LSP --> Router
LSP --> VFS
VFS --> TS
end
IPC[[IPC\nMessagePack\n名前付きパイプ / Unix ソケット]]
subgraph T2[第 2 層 — C# サイドカー]
direction TB
Roslyn[Roslyn\nMSBuildWorkspace]
Decompiler[ICSharpCode.Decompiler]
CSharpFeatures[補完\n診断\nリファクタリング]
Roslyn --> Decompiler
Roslyn --> CSharpFeatures
end
subgraph T3[第 3 層 — F# サイドカー]
direction TB
FCS[FSharpChecker]
Project[F# project options]
FSharpFeatures[補完\n診断\nリファクタリング]
Project --> FCS
FCS --> FSharpFeatures
end
Editor -- LSP 3.17 --> LSP
Router -- C# syntax --> TS
Router -- C# / F# semantics --> IPC
IPC <--> Roslyn
IPC <--> FCS
第 1 層 — Rust LSP ホスト
ホストプロセスは次を担当します。
- stdio 上の LSP 3.17 JSON-RPC
- 全文書同期とメモリ内 VFS
- ドキュメントシンボル、ワークスペースシンボル、折りたたみ、選択範囲、リンク編集、構文の事前検証に使う C# の tree-sitter 解析
- 適切な言語サイドカーへのルーティング
- サイドカーの起動、ヘルスチェック、再起動バックオフ、シャットダウン
- 診断の配信、NuGet リクエスト、プロファイラーリクエストの処理
現在、ホストに含まれる tree-sitter 文法は C# 用だけです。F# のドキュメントシンボルとワークスペースシンボルは FCS へルーティングされます。F# の折りたたみと選択範囲はまだ利用できません。
tree-sitter はインクリメンタル解析向けに設計されていますが、現在の全文同期処理では、変更のたびに新しいツリーから C# 文書を再解析します。現在の SharpLsp は salsa に依存していません。
第 2 層 — C# サイドカー
長時間動作する .NET 10 プロセスが Roslyn と MSBuildWorkspace をホストします。C# の補完、ホバー、診断、ナビゲーション、参照検索、名前変更、コードアクション、セマンティックトークン、インレイヒント、コードレンズ、階層クエリを提供します。C# のドキュメントシンボルとワークスペースシンボルは、このサイドカーではなく Rust ホストの tree-sitter 解析が提供します。
共有の ICSharpCode.Decompiler コンポーネントが、多くの BCL シンボルや参照アセンブリ内のシンボルについて、メタデータからソース位置を生成します。
第 3 層 — F# サイドカー
独立した .NET 10 プロセスが FSharpChecker をホストします。SharpLsp 独自のプロジェクト/オプション処理で F# プロジェクト情報を読み込み、F# の補完、ホバー、シグネチャヘルプ、診断、ナビゲーション、参照検索、名前変更、シンボル、コードアクション、セマンティックトークン、インレイヒント、コードレンズ、階層クエリを提供します。
Fantomas によるフォーマット処理はサイドカー内に存在しますが、意図的にホストからルーティングも通知もされていません。FSharpLint は依存関係に含まれていますが、診断パイプラインには接続されていません。
IPC
ホストは次の仕組みで各サイドカーと通信します。
- MessagePack ペイロード
- Windows では名前付きパイプ、Linux と macOS では Unix ドメインソケット
- 4 バイトのリトルエンディアン長さプレフィックス
- 対応付けられたリクエスト/レスポンスのエンベロープ
サイドカーに障害が発生しても、ホストは停止しません。ライフサイクルマネージャーがプロセスを利用不可として扱い、再起動バックオフを適用し、代替プロセスを起動できます。
リクエストルーティング
| リクエスト種別 | 現在の経路 | 例 |
|---|---|---|
| C# 構文 | Rust + tree-sitter | ドキュメントシンボル、ワークスペースシンボル、折りたたみ、選択範囲 |
| F# シンボル | F# サイドカー + FCS | ドキュメントシンボル、ワークスペースシンボル |
| C# セマンティック処理 | C# サイドカー + Roslyn | 補完、ホバー、定義、コードアクション |
| F# セマンティック処理 | F# サイドカー + FCS | 補完、ホバー、定義、シグネチャヘルプ |
| ホストサービス | Rust | 診断の配信、NuGet オーケストレーション、プロファイリング |
どちらの言語についてもフォーマット機能は通知されません。C# には CSharpier、F# には専用の Fantomas 統合を使用してください。
プロジェクト内の別の場所に記載されているレイテンシ値は、エンジニアリング上の目標です。すべてのリポジトリ、マシン、コールドスタート状態で保証されるものではありません。