架构

VS Code 中的 SharpLsp 架构相关输出

SharpLsp 基于三层架构构建,将快速语法操作与丰富语义分析的关注点分离。

第一层 — Rust LSP 宿主

宿主进程负责处理:

  • LSP 协议:基于 stdio 的 JSON-RPC,目标是符合 LSP 3.17 行为
  • 虚拟文件系统(VFS):带变更跟踪的内存文件状态
  • tree-sitter 解析:当前优先覆盖 C# 语法路径;F# 支持仍在推进
  • salsa 缓存:增量计算 — 仅重新处理变更的内容
  • 请求路由:快速语法请求留在 Rust 中,语义请求发送到 sidecar

第二层 — C# Sidecar(Roslyn)

提供以下功能的长运行 .NET 进程:

  • 用于解决方案/项目加载的 MSBuildWorkspace
  • Roslyn 支撑的 C# 功能:代码补全、诊断、代码操作、重构
  • 用于跳转到反编译源码的 ICSharpCode.Decompiler
  • 通过命名管道/Unix 域套接字的 MessagePack 序列化

第三层 — F# Sidecar(FCS)

用于 F# 支持的独立 .NET 进程:

  • 用于类型检查和分析的 FSharpChecker
  • 用于项目系统集成的 Ionide.ProjInfo
  • 用于额外诊断的 FSharpLint

IPC 协议

Rust 宿主与 .NET sidecar 之间的通信使用:

  • MessagePack 二进制序列化(紧凑、快速)
  • 命名管道(Windows)或 Unix 域套接字(Linux、macOS)
  • 4 字节小端序长度前缀
  • 目标:<500µs 往返开销

请求路由

类别 处理器 延迟目标 示例
纯语法 Rust (tree-sitter) <5ms documentSymbol、foldingRange
语义 Sidecar <200ms completion、hover、definition
混合 Rust + Sidecar <100ms semanticTokens
缓存 Rust (salsa) <1ms 重复请求,未变更文档