アーキテクチャ

VS Code で表示した SharpLsp のアーキテクチャ

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 統合を使用してください。

プロジェクト内の別の場所に記載されているレイテンシ値は、エンジニアリング上の目標です。すべてのリポジトリ、マシン、コールドスタート状態で保証されるものではありません。