アーキテクチャ

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

SharpLsp は、軽量な構文処理と豊かなセマンティック解析を分離する 3 層アーキテクチャで構築されています。

graph LR
    Editor([Editor / IDE])

    subgraph T1[Tier 1 — Rust LSP Host]
        direction TB
        LSP[LSP Server\nJSON-RPC over stdio]
        Router[Request Router]
        VFS[Virtual File System]
        TS[tree-sitter\nC# and F# grammars]
        Salsa[salsa cache]
        LSP --> Router
        LSP --> VFS
        VFS --> TS
        TS --> Salsa
    end

    IPC[[IPC\nMessagePack\nnamed pipes / Unix sockets]]

    subgraph T2[Tier 2 — C# Sidecar]
        direction TB
        Roslyn[Roslyn\nMSBuildWorkspace]
        Decompiler[ICSharpCode.Decompiler]
        CSharpFeatures[completions\ndiagnostics\nrefactoring]
        Roslyn --> Decompiler
        Roslyn --> CSharpFeatures
    end

    subgraph T3[Tier 3 — F# Sidecar]
        direction TB
        FCS[FSharpChecker]
        ProjInfo[Ionide.ProjInfo]
        Fantomas[Fantomas]
        FSharpLint[FSharpLint]
        FCS --> ProjInfo
        FCS --> Fantomas
        FCS --> FSharpLint
    end

    Editor -- LSP 3.17 --> LSP
    Router -- syntax under 5ms --> Salsa
    Router -- semantic under 200ms --> IPC
    IPC <--> Roslyn
    IPC <--> FCS

第 1 層 — Rust LSP ホスト

ホストプロセスは次を担当します。

  • LSP プロトコル: stdio 上の JSON-RPC。LSP 3.17 の動作を対象にします
  • 仮想ファイルシステム(VFS): 変更追跡付きのメモリ上ファイル状態
  • tree-sitter 解析: サブミリ秒級のインクリメンタル C# 解析。F# 文法統合は進行中で、F# の構文機能はサイドカーへルーティングされます
  • salsa キャッシュ: インクリメンタル計算。変更されたものだけを再処理します
  • リクエストルーティング: 高速な構文リクエストは Rust に残し、セマンティックリクエストはサイドカーへ送ります

第 2 層 — C# サイドカー(Roslyn)

長時間動作する .NET 10 プロセスで、次を提供します。

  • ソリューションとプロジェクトを読み込む MSBuildWorkspace
  • Roslyn ベースの C# 機能: 補完、診断、コードアクション、リファクタリング
  • 逆コンパイル済みソースへの移動に使う ICSharpCode.Decompiler
  • 名前付きパイプ / Unix ドメインソケット上の MessagePack シリアライズ

第 3 層 — F# サイドカー(FCS)

F# サポート用の独立した .NET 10 プロセスです。

  • 型チェックと解析を行う FSharpChecker
  • プロジェクトシステム統合のための Ionide.ProjInfo
  • 追加診断のための FSharpLint

IPC プロトコル

Rust ホストと .NET サイドカーの通信には次を使います。

  • MessagePack バイナリシリアライズ(小さく高速)
  • 名前付きパイプ(Windows)または Unix ドメインソケット(Linux、macOS)
  • 4 バイト little-endian 長プレフィックスフレーミング
  • 目標: 往復オーバーヘッド <500µs

リクエストルーティング

カテゴリ ハンドラー レイテンシ目標
構文のみ Rust (tree-sitter) <5ms documentSymbol、foldingRange
セマンティック サイドカー <200ms completion、hover、definition
ハイブリッド Rust + サイドカー <100ms semanticTokens
キャッシュ済み Rust (salsa) <1ms 変更されていない文書への繰り返しリクエスト