C# LSP
C# code intelligence via csharp-ls — a lightweight Roslyn-based language server.
Capabilities
- Go-to-definition: Jump to symbol definitions across solution
- Find references: Locate all usages of a symbol
- Hover info: Type signatures, XML docs, parameter info
- Diagnostics: Real-time compiler errors and warnings
- Document symbols: List classes, methods, properties in a file
- Workspace symbol search: Find symbols across the entire solution
Supported extensions: .cs, .csx
Prerequisites
- .NET SDK (9.0+): https://dot.net/download
- Python 3: Required to run the lsp-query daemon
.slnor.csproj: Project file is required (loose .cs files give limited results)
Setup
Run the one-time setup script (idempotent — safe to re-run):
bash {baseDir}/scripts/setup.sh # setup only
bash {baseDir}/scripts/setup.sh --verify # setup + verification test
What it does:
- Checks for .NET SDK
- Installs
csharp-lsviadotnet tool install --global - Registers
~/.dotnet/toolsin PATH - Creates
lsp-querysymlink - Creates cache directory
Usage
# Set workspace to the directory containing .sln/.csproj
export LSP_WORKSPACE=/path/to/project
# Go to definition
lsp-query definition src/Program.cs 15 8
# Find all references
lsp-query references src/Models/User.cs 42 10
# Type info / hover
lsp-query hover src/Services/AuthService.cs 30 22
# List symbols in a file
lsp-query symbols src/Program.cs
# Search symbols across workspace
lsp-query workspace-symbols "UserService"
# Compiler diagnostics
lsp-query diagnostics src/Program.cs
# Check running servers
lsp-query servers
# Shut down daemon
lsp-query shutdown
Line/column numbers are 1-indexed.
Architecture
lsp-query CLI → Unix Socket → lsp-query daemon (Python)
↓
csharp-ls (subprocess, stdin/stdout JSON-RPC)
↓
Roslyn (.sln → full type system)
- Daemon: Auto-forks on first call. Shuts down after 5 min idle.
- csharp-ls: Starts on first C# query. Shuts down after 5 min idle.
- Cold start: Solution loading takes 30–60s for large projects. Subsequent queries ~200ms.
Project Detection
- Solution file (
.sln) — best: enables cross-project references - Project file (
.csproj) — good: single project analysis - Loose
.csfiles — limited: basic syntax only
What's Included
{baseDir}/
├── SKILL.md # This file
└── scripts/
├── setup.sh # One-time setup (idempotent)
└── lsp-query.py # LSP daemon + CLI (self-contained)
Troubleshooting
- Install fails (
DotnetToolSettings.xml): Pin version withdotnet tool install --global csharp-ls --version 0.20.0 - Empty results: Check that
LSP_WORKSPACEpoints to a directory with.slnor.csproj - Slow first query: Normal — Roslyn project loading takes 30–60s for large solutions
- PATH issues: Add
export PATH="$PATH:$HOME/.dotnet/tools"to your shell profile - Stale daemon: Run
lsp-query shutdownand retry