<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>SharpLsp</title>
  <subtitle>Open-source .NET language server for C# and F#. Full Roslyn IntelliSense, diagnostics, refactoring, and NuGet management in VS Code, Zed, Neovim, and every LSP-compatible editor.</subtitle>
  <link href="https://sharplsp.dev/feed.xml" rel="self"/>
  <link href="https://sharplsp.dev/"/>
  <updated>2026-06-09T21:57:22Z</updated>
  <id>https://sharplsp.dev/</id>
  <author><name>SharpLsp Team</name></author>
  <entry>
    <title>Introducing SharpLsp: The .NET LSP Built in Rust</title>
    <link href="https://sharplsp.dev/blog/introducing-sharplsp/"/>
    <id>https://sharplsp.dev/blog/introducing-sharplsp/</id>
    <updated>2026-03-20T00:00:00Z</updated>
    <content type="html">https://sharplsp.dev/%3Cp%3EWe%20are%20done%20waiting.%3C/p%3E%3Cp%3EThe%20.NET%20developer%20experience%20outside%20of%20Windows%20is%20broken.%20Not%20theoretically%20%E2%80%94%20provably,%20in%20public,%20with%20a%20%3Ca%20href=%22https:/github.com/dotnet/vscode-csharp/issues/5276%22%3E12-to-1%20community%20rejection%3C/a%3E%20of%20Microsoft&#39;s%20closed-source%20tooling%20announcement%20and%20a%20retirement%20post%20that%20told%20Mac%20developers%20to%20run%20Windows%20in%20a%20VM.%20SharpLsp%20is%20the%20community&#39;s%20answer:%20an%20open-source,%20editor-agnostic%20Language%20Server%20for%20C#%20and%20F#%20%E2%80%94%20built%20in%20Rust,%20powered%20by%20%3Ca%20href=%22https://github.com/dotnet/roslyn%22%3ERoslyn%3C/a%3E%20and%20%3Ca%20href=%22https://fsharp.github.io/fsharp-compiler-docs/%22%3EFSharp.Compiler.Service%3C/a%3E.%20MIT%20licensed.%20Zero%20proprietary%20dependencies.%20One%20install%20that%20serves%20every%20editor%20on%20the%20machine.%3C/p%3E%3Ch2%20id=%22the-situation-is-worse-than-you-think%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-situation-is-worse-than-you-think%22%3EThe%20Situation%20Is%20Worse%20Than%20You%20Think%3C/a%3E%3C/h2%3E%3Cp%3EEvery%20option%20available%20to%20a%20.NET%20developer%20today%20has%20a%20disqualifying%20flaw.%20Not%20a%20quirk%20%E2%80%94%20a%20structural%20problem%20that%20cannot%20be%20patched%20away.%20Understanding%20how%20we%20got%20here%20is%20important%20for%20understanding%20why%20SharpLsp%20had%20to%20exist,%20and%20why%20half-measures%20have%20failed%20to%20fix%20anything.%3C/p%3E%3Cp%3EFor%20the%20better%20part%20of%20a%20decade,%20.NET%20developers%20outside%20Visual%20Studio%20have%20navigated%20a%20fractured,%20unequal,%20and%20increasingly%20proprietary%20tooling%20landscape.%20OmniSharp%20was%20the%20community&#39;s%20workaround.%20Ionide%20was%20the%20F#%20community&#39;s%20workaround.%20A%20proliferation%20of%20community-maintained%20LSP%20configuration%20snippets%20for%20Neovim%20and%20Helix%20%E2%80%94%20all%20workarounds.%20None%20of%20them%20the%20real%20thing.%20Microsoft%20repeatedly%20allowed%20the%20community%20to%20absorb%20the%20cost%20of%20the%20problem%20while%20retaining%20control%20over%20the%20solution.%3C/p%3E%3Cp%3EThe%20core%20issue%20is%20structural.%20Microsoft%20controls%20the%20C#%20language.%20Microsoft%20controls%20the%20Roslyn%20compiler.%20Microsoft%20controls%20the%20dominant%20VS%20Code%20extension%20namespace.%20And%20Microsoft&#39;s%20commercial%20incentives%20are%20not%20aligned%20with%20giving%20developers%20world-class,%20open,%20portable%20tooling.%20Visual%20Studio&#39;s%20commercial%20value%20depends%20partly%20on%20its%20platform%20lock-in.%20C#%20Dev%20Kit&#39;s%20value%20to%20Microsoft%20lies%20in%20its%20ability%20to%20grow%20the%20VS%20Code%20ecosystem%20%E2%80%94%20not%20in%20being%20available%20everywhere.%3C/p%3E%3Ch3%20id=%22visual-studio-windows-only-full-stop%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#visual-studio-windows-only-full-stop%22%3EVisual%20Studio:%20Windows%20Only,%20Full%20Stop%3C/a%3E%3C/h3%3E%3Cp%3EVisual%20Studio%20remains%20Windows-only.%20In%20August%202023,%20Microsoft%20announced%20the%20retirement%20of%20Visual%20Studio%20for%20Mac,%20effective%20August%2031,%202024.%20The%20%3Ca%20href=%22https://devblogs.microsoft.com/visualstudio/visual-studio-for-mac-retirement-announcement/%22%3Eofficial%20retirement%20post%3C/a%3E%20listed%20the%20alternatives%20for%20Mac%20developers%20who%20need%20F#:%3C/p%3E%3Cblockquote%3E%3Cp%3E%3Cstrong%3E&amp;quot;Visual%20Studio%20IDE%20running%20on%20Windows%20in%20a%20VM%20on%20Mac:%20This%20option%20will%20cover%20the%20broadest%20IDE%20needs%20such%20as%20legacy%20project%20support%20for%20Xamarin,%20F#,%20and%20remote%20development%20experiences%20on%20iOS%20by%20using%20a%20virtual%20machine%20(VM).&amp;quot;%3C/strong%3E%3C/p%3E%3C/blockquote%3E%3Cp%3EThat%20is%20not%20a%20workaround.%20That%20is%20Microsoft%20telling%20F#%20developers%20on%20Mac%20to%20run%20a%20foreign%20operating%20system%20inside%20their%20computer%20to%20write%20code%20in%20their%20language%20of%20choice.%20On%20Reddit&#39;s%20r/dotnet,%20user%20%3Cstrong%3EAbsurdPreferred%3C/strong%3E%20captured%20the%20broader%20community%20reaction:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;This%20is%20not%20surprising%20to%20me%20at%20all.%20Visual%20Studio%20for%20Mac%20is%20horrible%20and%20it%20was%20clear%20that%20MS%20didn&#39;t%20care%20about%20it%20at%20all.%20I%20hated%20using%20it%20so%20much%20that%20I%20switched%20to%20Rider%20on%20Mac.%20Then%20loved%20that%20so%20much,%20I%20switched%20to%20Rider%20when%20I%20do%20dev%20work%20on%20PC.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EUser%20%3Cstrong%3Eleeharrison1984%3C/strong%3E%20added%20what%20many%20had%20been%20thinking%20for%20years:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;VS%20for%20Mac%20has%20been%20a%20joke%20for%20years%20and%20severely%20lacked%20features%20that%20existed%20in%20Windows%20VS%20for%20years.%20In%20the%20last%20few%20years,%20if%20ever%20I%20found%20myself%20on%20a%20Mac%20and%20needed%20to%20do%20some%20C#%20work,%20I&#39;m%20opening%20VS%20Code.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EThe%20retirement%20was%20not%20a%20surprise%20to%20anyone%20paying%20attention.%20Visual%20Studio%20for%20Mac%20had%20always%20been%20a%20second-tier%20experience%20%E2%80%94%20a%20Xamarin%20Studio%20rebranding%20that%20never%20caught%20up%20to%20its%20Windows%20counterpart.%20What%20was%20striking%20was%20the%20explicit%20official%20advice%20to%20run%20a%20Windows%20VM.%20It%20confirmed%20what%20the%20ecosystem%20had%20quietly%20accepted:%20if%20you%20are%20a%20serious%20.NET%20developer%20on%20macOS%20or%20Linux,%20Microsoft%20does%20not%20have%20a%20compelling%20story%20for%20you.%3C/p%3E%3Ch3%20id=%22c-dev-kit-closed-core-enterprise-paywall-vs-code-only%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#c-dev-kit-closed-core-enterprise-paywall-vs-code-only%22%3EC#%20Dev%20Kit:%20Closed%20Core,%20Enterprise%20Paywall,%20VS%20Code%20Only%3C/a%3E%3C/h3%3E%3Cp%3EThe%20replacement%20Microsoft%20offered%20was%20%3Ca%20href=%22https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit%22%3EC#%20Dev%20Kit%3C/a%3E.%20It%20shipped%20in%202023%20to%20a%20hostile%20reception.%20In%20%3Ca%20href=%22https://github.com/dotnet/vscode-csharp/issues/5276%22%3EGitHub%20issue%20#5276%3C/a%3E%20%E2%80%94%20the%20roadmap%20announcement%20where%20Microsoft%20revealed%20the%20extension&#39;s%20LSP%20host%20would%20contain%20closed-source%20components%20%E2%80%94%20the%20community%20pushed%20back%20hard.%3C/p%3E%3Cp%3EThe%20announcement%20itself%20contained%20this%20key%20line:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;The%20&#39;LSP%20Tools%20Host&#39;%20will%20not%20be%20open-sourced,%20but%20we%20plan%20to%20communicate%20with%20the%20community%20along%20the%20way%20to%20help%20guide%20our%20future%20plans.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EGitHub%20user%20%3Cstrong%3EGerardSmit%3C/strong%3E%20articulated%20the%20fundamental%20contradiction:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;I%20feel%20like%20Microsoft%20has%20noticed%20the%20amount%20of%20installs%20the%20C#%20extension%20has%20and%20has%20to%20step%20(aka%20embrace)%20in.%20I%20feel%20like%20VSCode%20was%20always%20about%20(almost)%20open-source%20so%20this%20feels%20like%20a%20step%20in%20the%20bad%20direction.%20Currently%20the%20extension%20has%2016M%20installs.%20Will%20all%20these%20installs%20automatically%20switch%20to%20the%20closed-source%20part%20of%20the%20extension?&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EUser%20%3Cstrong%3Emhmd-azeez%3C/strong%3E%20proposed%20the%20obvious%20alternative:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;While%20&#39;C#%20in%20VS%20Code&#39;%20getting%20some%20love%20is%20very%20much%20welcome,%20the%20new%20LSP%20implementation%20not%20being%20open%20source%20is%20a%20weird%20decision.%20I%20hope%20Microsoft%20reconsiders%20it.%20If%20it&#39;s%20about%20IntelliCode,%20then%20they%20can%20make%20the%20LSP%20server%20extensible%20and%20open%20source,%20with%20some%20optional%20closed%20source%20components.%20GitHub%20Copilot%20lives%20as%20a%20separate%20extension%20and%20works%20everywhere,%20maybe%20a%20similar%20method%20can%20be%20used%20for%20IntelliCode%20in%20VS%20Code%20too?&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EUser%20%3Cstrong%3Ejasiozet%3C/strong%3E%20was%20blunter:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;It&#39;s%20sad%20and%20short-sighted%20when%20Microsoft%20tries%20to%20jockey%20for%20power%20in%20the%20short-run%20by%20making%20user-hostile%20decisions.%20This%20seems%20like%20another%20instance%20of%20embrace/extend/extinguish.%20It&#39;s%20predictable%20by%20now,%20but%20I&#39;m%20not%20happy%20about%20it!&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EThe%20closed-source%20core%20was%20not%20the%20only%20problem.%20The%20%3Ca%20href=%22https://marketplace.visualstudio.com/items/ms-dotnettools.csdevkit/license%22%3EC#%20Dev%20Kit%20license%3C/a%3E%20contains%20a%20hard%20enterprise%20restriction%20that%20excludes%20any%20organization%20with%20more%20than%20250%20users%20or%20more%20than%20$1,000,000%20USD%20in%20annual%20revenue%20from%20using%20the%20extension%20without%20a%20paid%20Visual%20Studio%20subscription.%20That%20threshold%20captures%20most%20funded%20startups,%20mid-sized%20engineering%20teams,%20and%20profitable%20small%20businesses.%20The%20extension%20had%2016%20million%20installs%20at%20the%20time%20of%20announcement.%20The%20overwhelming%20majority%20of%20those%20users%20had%20no%20idea%20they%20were%20subject%20to%20a%20commercial%20license%20restriction.%3C/p%3E%3Cp%3EC#%20Dev%20Kit%20is%20also%20%3Cstrong%3EVS%20Code%20only%3C/strong%3E.%20It%20will%20not%20work%20in%20Neovim,%20Helix,%20Emacs,%20Zed,%20or%20any%20other%20LSP-capable%20editor.%20As%20user%20%3Cstrong%3EGerardSmit%3C/strong%3E%20noted%20in%20the%20issue%20thread:%20&amp;quot;I%20assume%20that%20Microsoft%20won&#39;t%20make%20extensions%20for%20these%20editors.&amp;quot;%20They%20were%20right.%20Microsoft%20confirmed%20it%20%E2%80%94%20no%20change%20to%20debugger%20licensing,%20no%20support%20planned%20for%20non-VS%20Code%20editors.%20If%20you%20live%20in%20a%20terminal-centric%20workflow,%20you%20are%20simply%20not%20the%20audience%20for%20C#%20Dev%20Kit.%3C/p%3E%3Ch3%20id=%22omnisharp-the-communitys-orphan%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#omnisharp-the-communitys-orphan%22%3EOmniSharp:%20The%20Community&#39;s%20Orphan%3C/a%3E%3C/h3%3E%3Cp%3EOmniSharp%20was%20the%20open-source%20workhorse%20that%20powered%20the%20original%20C#%20extension%20for%20years.%20It%20worked%20across%20editors,%20it%20was%20MIT%20licensed,%20and%20it%20was%20community-maintained%20%E2%80%94%20in%20theory.%20In%20practice,%20as%20one%20developer%20noted%20in%20the%20issue%20#5276%20thread:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;We&#39;ll%20see%20how%20much%20love%20the%20open-source%20LSP%20server%20will%20get%20but%20I%20don&#39;t%20have%20much%20hope.%20This%20year,%20JoeRobich%20and%2050Wliu%20have%20made%20the%20most%20commits%20and%20are%20both%20working%20at%20Microsoft.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EOmniSharp&#39;s%20continued%20health%20depends%20on%20whether%20Microsoft%20employees%20choose%20to%20prioritize%20it.%20That%20is%20not%20independence.%20That%20is%20dependency%20with%20a%20community%20face.%20When%20Microsoft&#39;s%20strategic%20direction%20shifted%20toward%20the%20new%20LSP%20host,%20development%20focus%20shifted%20with%20it.%20OmniSharp%20is%20not%20dead,%20but%20it%20is%20not%20where%20the%20investment%20is%20going.%3C/p%3E%3Cp%3EUser%20%3Cstrong%3Ecodymullins%3C/strong%3E%20raised%20the%20concern%20that%20underpins%20this%20entire%20problem%20space:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Closed%20tools%20all%20get%20sunset%20eventually,%20then%20we&#39;ll%20have%20to%20port%20all%20our%20code.%20I&#39;ve%20worked%20at%20places%20where%20my%20whole%20job%20was%20porting%20from%20some%20closed%20source%20language%20that&#39;s%20no%20longer%20supported.%20Better%20to%20do%20it%20on%20your%20own%20schedule%20than%20be%20forced%20to%20unexpectedly.%20At%20least%20with%20OmniSharp%20there%20was%20a%20plan%20b%20%E2%80%94%20it%20wasn&#39;t%20great%20but%20it%20existed.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Ch3%20id=%22rider-excellent-but-proprietary%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#rider-excellent-but-proprietary%22%3ERider:%20Excellent%20but%20Proprietary%3C/a%3E%3C/h3%3E%3Cp%3EJetBrains%20Rider%20is%20the%20best%20IDE%20available%20for%20.NET%20outside%20of%20Visual%20Studio%20on%20Windows.%20That%20is%20a%20genuine%20compliment%20%E2%80%94%20Rider%20has%20genuinely%20excellent%20F#%20support,%20a%20fast%20project%20loading%20experience,%20and%20a%20UI%20that%20cross-platform%20.NET%20developers%20have%20voted%20for%20with%20their%20wallets.%20As%20one%20r/fsharp%20user%20put%20it:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;The%20F#%20intellisense%20experience%20in%20Rider%20is%20rock-solid.%20Rivals%20Visual%20Studio.%20F#%20feels%20like%20a%20first-class%20citizen%20in%20Rider.&amp;quot;%20%E2%80%94%20%3Cstrong%3EJwosty%3C/strong%3E,%20r/fsharp%3C/p%3E%3C/blockquote%3E%3Cp%3EAnd%20user%20%3Cstrong%3Eyankun0567%3C/strong%3E%20on%20r/dotnet%20stated%20the%20obvious%20conclusion:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Regarding%20that%20VS%20(not%20Code!)%20is%20Windows%20only,%20but%20.NET%20is%20cross-platform%20%E2%80%94%20it%20is%20no%20surprise%20that%20a%20cross-platform%20IDE%20catches%20up.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EBut%20Rider%20requires%20a%20paid%20commercial%20license.%20It%20is%20closed-source.%20Your%20workflow%20depends%20on%20JetBrains%20keeping%20it%20commercially%20viable%20and%20maintaining%20favorable%20pricing.%20User%20%3Cstrong%3Effffrozen%3C/strong%3E%20on%20the%20VS%20for%20Mac%20retirement%20thread%20expressed%20the%20wish%20many%20developers%20share:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;If%20Rider%20had%20a%20one-off%20purchase,%20I&#39;d%20buy%20it%20in%20a%20heartbeat.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EThe%20broader%20point%20is%20not%20that%20Rider%20is%20bad.%20It%20is%20that%20a%20proprietary%20IDE%20is%20not%20a%20durable%20answer%20for%20an%20open%20ecosystem.%20The%20.NET%20runtime%20is%20open.%20The%20C#%20compiler%20is%20open.%20The%20F#%20compiler%20is%20open.%20The%20Language%20Server%20Protocol%20is%20open.%20The%20editor%20tooling%20should%20be%20open%20too.%3C/p%3E%3Ch2%20id=%22what-we-have-built%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-we-have-built%22%3EWhat%20We%20Have%20Built%3C/a%3E%3C/h2%3E%3Cp%3ESharpLsp%20is%20not%20a%20promise.%20It%20is%20working%20software.%20The%20VS%20Code%20extension%20is%20the%20first%20editor%20integration,%20but%20the%20architecture%20is%20deliberately%20editor-agnostic%20from%20day%20one%20%E2%80%94%20a%20single%20%3Ccode%3Esharplsp%3C/code%3E%20binary%20on%20%3Ccode%3E$PATH%3C/code%3E%20that%20any%20LSP-capable%20editor%20can%20launch.%3C/p%3E%3Cp%3EThe%20key%20architectural%20insight%20is%20that%20we%20do%20not%20reimplement%20what%20the%20compilers%20already%20know.%20We%20call%20them.%20Roslyn%20for%20C#.%20FSharp.Compiler.Service%20for%20F#.%20Everything%20semantic%20%E2%80%94%20completions,%20diagnostics,%20hover,%20go-to-definition,%20rename%20%E2%80%94%20comes%20from%20the%20actual%20compilers%20via%20a%20thin%20IPC%20bridge.%20We%20own%20the%20LSP%20protocol%20layer,%20the%20virtual%20file%20system,%20and%20the%20syntax-level%20features%20via%20tree-sitter.%20The%20compilers%20own%20correctness.%20This%20is%20not%20a%20compromise.%20It%20is%20the%20correct%20design.%3C/p%3E%3Ch3%20id=%22solution-explorer%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#solution-explorer%22%3ESolution%20Explorer%3C/a%3E%3C/h3%3E%3Cp%3EThe%20first%20thing%20you%20see%20when%20you%20open%20a%20.NET%20workspace%20in%20SharpLsp%20is%20a%20proper%20Solution%20Explorer.%20Not%20a%20file%20tree%20%E2%80%94%20a%20%3Ccode%3E.sln%3C/code%3E-aware%20hierarchy%20that%20understands%20projects,%20namespaces,%20and%20types,%20the%20way%20Visual%20Studio%20does,%20but%20available%20on%20every%20platform%20in%20every%20editor.%20The%20tree%20is%20built%20from%20the%20actual%20MSBuild%20project%20graph,%20not%20guessed%20from%20folder%20structure.%20It%20knows%20the%20difference%20between%20a%20project%20reference%20and%20a%20NuGet%20dependency,%20and%20it%20reflects%20that%20in%20the%20sidebar.%3C/p%3E%3Cp%3EThis%20matters%20more%20than%20it%20sounds.%20Visual%20Studio&#39;s%20Solution%20Explorer%20has%20been%20the%20mental%20model%20for%20.NET%20projects%20since%202002.%20It%20represents%20how%20.NET%20developers%20think%20about%20their%20code%20%E2%80%94%20not%20as%20files%20in%20folders,%20but%20as%20types%20within%20namespaces%20within%20projects%20within%20solutions.%20Senior%20engineers%20who%20move%20between%20Visual%20Studio%20on%20Windows%20and%20any%20other%20tool%20on%20macOS%20or%20Linux%20feel%20the%20loss%20of%20this%20model%20acutely.%20Every%20file-tree-based%20alternative%20forces%20a%20context%20switch.%20SharpLsp%20refuses%20that%20context%20switch.%20The%20solution%20hierarchy%20is%20the%20primary%20navigation%20surface,%20derived%20directly%20from%20MSBuild,%20and%20it%20stays%20in%20sync%20as%20you%20edit.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/solution-explorer.png%22%20alt=%22SharpLsp%20Solution%20Explorer%20showing%20MyApp.sln%20with%20project%20and%20namespace%20tree%20in%20VS%20Code%22%3E%20%20%3Cfigcaption%3ESolution%20Explorer%20rendering%20a%20real%20.sln%20file%20with%20full%20project%20and%20type%20hierarchy.%3C/figcaption%3E%3C/figure%3E%3Cp%3EThe%20tree%20also%20reflects%20type-level%20structure.%20Namespaces%20expand%20to%20show%20types.%20Types%20expand%20to%20show%20members.%20Reference%20counts%20appear%20inline%20on%20each%20node,%20giving%20you%20a%20continuous%20ambient%20signal%20about%20what%20is%20used%20and%20what%20might%20be%20dead%20code%20%E2%80%94%20without%20having%20to%20run%20an%20explicit%20Find%20All%20References%20query%20on%20every%20symbol%20you%20are%20curious%20about.%20When%20the%20solution%20changes%20on%20disk%20%E2%80%94%20a%20new%20file%20added,%20a%20project%20reference%20modified%20%E2%80%94%20the%20tree%20updates%20without%20requiring%20a%20restart.%3C/p%3E%3Ch3%20id=%22code-folding%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#code-folding%22%3ECode%20Folding%3C/a%3E%3C/h3%3E%3Cp%3ECode%20folding%20in%20most%20editors%20is%20line-range-based%20%E2%80%94%20a%20blunt%20instrument%20that%20folds%20from%20open%20brace%20to%20close%20brace%20without%20understanding%20what%20it%20is%20folding.%20SharpLsp&#39;s%20folding%20is%20tree-sitter%20powered,%20which%20means%20it%20understands%20the%20syntactic%20shape%20of%20the%20code.%20Namespaces,%20types,%20methods,%20and%20expression%20blocks%20all%20fold%20independently%20and%20correctly.%3C/p%3E%3Cp%3EThe%20fold%20ranges%20are%20computed%20entirely%20in%20the%20Rust%20host%20without%20any%20round-trip%20to%20the%20compiler%20sidecars.%20This%20means%20they%20resolve%20in%20under%20one%20millisecond%20regardless%20of%20whether%20the%20workspace%20has%20finished%20loading%20or%20whether%20the%20compiler%20is%20in%20the%20middle%20of%20a%20background%20build.%20Folding%20is%20structural%20information,%20not%20semantic%20information%20%E2%80%94%20and%20SharpLsp%20treats%20it%20as%20such,%20routing%20it%20to%20the%20fastest%20possible%20handler.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/code-folding.png%22%20alt=%22Code%20folding%20showing%20collapsed%20namespace%20with%2060%20lines%20of%20code%20visible%20in%20one%20view%22%3E%20%20%3Cfigcaption%3ECode%20folding%20powered%20by%20tree-sitter%20%E2%80%94%20sub-millisecond,%20no%20compiler%20needed.%3C/figcaption%3E%3C/figure%3E%3Cp%3EFor%20engineers%20working%20in%20large%20files%20%E2%80%94%20generated%20code,%20domain%20models,%20protocol%20buffer%20implementations%20%E2%80%94%20the%20ability%20to%20fold%20at%20the%20type%20level%20rather%20than%20the%20line%20level%20is%20the%20difference%20between%20a%20navigable%20file%20and%20one%20that%20requires%20constant%20scrolling.%20SharpLsp&#39;s%20tree-sitter%20grammar%20for%20C#%20handles%20all%20standard%20folding%20patterns,%20including%20regions%20(for%20compatibility%20with%20legacy%20codebases%20that%20use%20them),%20doc%20comment%20blocks,%20and%20multi-line%20LINQ%20expressions.%3C/p%3E%3Ch3%20id=%22completions%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#completions%22%3ECompletions%3C/a%3E%3C/h3%3E%3Cp%3ECompletions%20pull%20from%20the%20full%20Roslyn%20semantic%20model%20%E2%80%94%20the%20same%20%3Ccode%3ECompletionService%3C/code%3E%20that%20powers%20Visual%20Studio.%20That%20means%20import%20completions%20for%20types%20not%20yet%20in%20scope,%20extension%20method%20resolution,%20constructor%20overloads,%20named%20argument%20suggestions,%20and%20filtering%20by%20accessibility%20modifier.%20The%20completion%20list%20is%20not%20a%20token%20frequency%20guess;%20it%20is%20a%20Roslyn%20query%20against%20the%20actual%20compiled%20project%20graph.%3C/p%3E%3Cp%3EWhen%20you%20type%20a%20type%20name%20that%20is%20not%20yet%20imported,%20SharpLsp%20surfaces%20it%20with%20an%20auto-import%20suggestion.%20When%20you%20type%20%3Ccode%3E.%3C/code%3E,%20you%20get%20the%20full%20member%20list%20including%20inherited%20members%20and%20extension%20methods%20from%20all%20imported%20namespaces.%20When%20you%20are%20in%20a%20LINQ%20chain,%20the%20completion%20context%20is%20aware%20of%20the%20element%20type%20and%20filters%20accordingly.%20This%20is%20what%20Roslyn%20knows%20%E2%80%94%20and%20SharpLsp%20exposes%20all%20of%20it%20directly.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-completions-page.png%22%20alt=%22SharpLsp%20completion%20list%20showing%20Add,%20Count,%20and%20other%20members%20with%20full%20semantic%20context%22%3E%20%20%3Cfigcaption%3ESemantic%20completions%20powered%20by%20Roslyn&#39;s%20CompletionService%20%E2%80%94%20the%20same%20engine%20behind%20Visual%20Studio.%3C/figcaption%3E%3C/figure%3E%3Cp%3ECompletion%20latency%20targets%20are%20under%20100ms%20at%20the%2050th%20percentile%20and%20under%20200ms%20at%20the%2095th%20percentile.%20Achieving%20these%20targets%20requires%20careful%20management%20of%20the%20sidecar%20request%20lifecycle:%20coalescing%20in-flight%20requests%20when%20the%20user%20continues%20typing,%20cancelling%20stale%20completions%20that%20are%20no%20longer%20relevant,%20and%20debouncing%20the%20sidecar%20round-trips%20intelligently%20to%20avoid%20thrashing%20the%20compiler%20with%20overlapping%20requests%20for%20the%20same%20document%20position.%20The%20current%20implementation%20hits%20these%20targets%20in%20testing%20against%20a%20fifteen-project%20solution%20on%20an%20M2%20MacBook%20Pro.%3C/p%3E%3Ch3%20id=%22hover-and-xml-doc%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#hover-and-xml-doc%22%3EHover%20and%20XML%20Doc%3C/a%3E%3C/h3%3E%3Cp%3EHover%20shows%20the%20full%20method%20or%20type%20signature%20alongside%20its%20XML%20documentation%20%E2%80%94%20parameters,%20return%20value%20description,%20remarks,%20exceptions,%20and%20examples.%20This%20is%20rendered%20from%20the%20XML%20doc%20comments%20in%20your%20source%20or%20from%20the%20documentation%20embedded%20in%20NuGet%20packages%20when%20hovering%20over%20third-party%20APIs.%20Roslyn&#39;s%20%3Ccode%3EDocumentationCommentCompiler%3C/code%3E%20surfaces%20all%20of%20this,%20including%20inherited%20documentation%20from%20base%20classes%20and%20interface%20implementations.%3C/p%3E%3Cp%3EThe%20Profiler%20panel%20visible%20in%20the%20sidebar%20is%20not%20incidental%20decoration.%20SharpLsp%20surfaces%20all%20running%20.NET%20processes%20on%20the%20machine,%20so%20you%20always%20know%20what%20is%20executing.%20When%20you%20are%20tracking%20down%20a%20performance%20regression%20or%20verifying%20that%20a%20service%20has%20actually%20stopped,%20this%20ambient%20process%20list%20is%20immediately%20useful%20%E2%80%94%20you%20do%20not%20have%20to%20open%20Activity%20Monitor%20or%20run%20%3Ccode%3Eps%20aux%20|%20grep%20dotnet%3C/code%3E.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-hover-page.png%22%20alt=%22Hover%20tooltip%20showing%20Factorial%20method%20signature%20with%20full%20XML%20documentation%20and%20parameter%20descriptions%22%3E%20%20%3Cfigcaption%3EHover%20rendering%20XML%20doc%20comments%20with%20parameter%20and%20return%20value%20documentation.%3C/figcaption%3E%3C/figure%3E%3Cp%3EFor%20F#,%20hover%20is%20structurally%20more%20important%20than%20it%20is%20for%20C#.%20Because%20F#%20code%20relies%20heavily%20on%20type%20inference,%20the%20types%20of%20bindings%20are%20often%20not%20written%20explicitly%20in%20source.%20In%20a%20deeply%20nested%20pipeline%20of%20%3Ccode%3E|&amp;gt;%3C/code%3E%20operators,%20the%20type%20of%20each%20intermediate%20expression%20is%20inferred%20by%20the%20compiler%20%E2%80%94%20and%20it%20is%20the%20only%20authoritative%20source%20of%20that%20information.%20FSharp.Compiler.Service&#39;s%20%3Ccode%3EGetToolTip%3C/code%3E%20API%20surfaces%20these%20inferred%20types,%20and%20SharpLsp%20renders%20them%20with%20the%20same%20priority%20and%20formatting%20as%20C#%20hover%20results.%20Hovering%20over%20an%20F#%20binding%20shows%20you%20its%20full%20inferred%20type,%20which%20is%20often%20the%20only%20documentation%20that%20exists.%3C/p%3E%3Ch3%20id=%22go-to-definition%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#go-to-definition%22%3EGo%20to%20Definition%3C/a%3E%3C/h3%3E%3Cp%3EGo%20to%20Definition%20navigates%20across%20the%20full%20solution%20graph%20%E2%80%94%20through%20project%20references,%20into%20types%20defined%20in%20other%20assemblies,%20and%20into%20NuGet%20packages%20using%20decompiled%20sources%20when%20no%20PDB%20is%20available.%20The%20breadcrumb%20bar%20tracks%20your%20position%20in%20the%20type%20hierarchy%20at%20all%20times,%20so%20you%20always%20know%20where%20you%20landed%20after%20a%20jump%20and%20can%20navigate%20back%20through%20the%20history%20of%20where%20you%20have%20been.%3C/p%3E%3Cp%3EThis%20is%20not%20a%20text%20grep%20or%20an%20index%20lookup.%20It%20is%20a%20Roslyn%20symbol%20resolution%20%E2%80%94%20the%20same%20mechanism%20Visual%20Studio%20uses%20internally.%20It%20handles%20partial%20classes,%20source%20generators,%20and%20nested%20types%20correctly%20because%20Roslyn&#39;s%20workspace%20model%20accounts%20for%20all%20of%20them.%20When%20you%20press%20Go%20to%20Definition%20on%20a%20symbol%20defined%20in%20a%20source%20generator,%20SharpLsp%20navigates%20to%20the%20generated%20source%20%E2%80%94%20not%20the%20generator%20implementation.%20When%20you%20navigate%20into%20a%20BCL%20type,%20the%20C#%20sidecar%20decompiles%20the%20metadata%20using%20ICSharpCode.Decompiler%20and%20returns%20the%20reconstructed%20source%20code.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-go-to-definition-page.png%22%20alt=%22Go%20to%20definition%20navigating%20to%20a%20method%20implementation%20with%20breadcrumb%20showing%20full%20type%20path%22%3E%20%20%3Cfigcaption%3EGo%20to%20Definition%20navigating%20through%20a%20multi-level%20type%20hierarchy.%3C/figcaption%3E%3C/figure%3E%3Cp%3EGo%20to%20Definition%20into%20decompiled%20metadata%20%E2%80%94%20navigating%20into%20%3Ccode%3ESystem.Collections.Generic.List&amp;lt;T&amp;gt;%3C/code%3E%20and%20seeing%20the%20implementation%20%E2%80%94%20has%20historically%20been%20available%20only%20in%20Visual%20Studio%20and%20Rider.%20It%20is%20one%20of%20the%20features%20that%20made%20those%20tools%20worth%20paying%20for,%20because%20it%20eliminates%20the%20need%20to%20keep%20a%20browser%20tab%20open%20to%20%3Ca%20href=%22http://docs.microsoft.com%22%3Edocs.microsoft.com%3C/a%3E%20while%20reading%20unfamiliar%20code.%20SharpLsp%20delivers%20this%20in%20every%20editor%20that%20runs%20the%20binary.%3C/p%3E%3Cp%3EThe%20Solution%20Explorer%20reflects%20the%20same%20structural%20understanding.%20Deeply%20nested%20types%20%E2%80%94%20inner%20classes,%20nested%20enums,%20compiler-generated%20state%20machine%20types%20from%20async%20methods%20%E2%80%94%20all%20appear%20in%20the%20correct%20position%20in%20the%20hierarchy,%20with%20reference%20counts%20shown%20inline.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/nested-classes.png%22%20alt=%22Nested%20classes%20in%20the%20solution%20explorer%20showing%20Outer,%20Inner,%20and%20AnotherInner%20with%20reference%20counts%22%3E%20%20%3Cfigcaption%3EReference%20counts%20and%20nested%20type%20support%20in%20the%20Solution%20Explorer.%3C/figcaption%3E%3C/figure%3E%3Ch3%20id=%22diagnostics%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#diagnostics%22%3EDiagnostics%3C/a%3E%3C/h3%3E%3Cp%3EDiagnostics%20come%20from%20the%20real%20Roslyn%20compiler%20%E2%80%94%20not%20approximations,%20not%20tree-sitter%20heuristics,%20not%20regex%20over%20source%20text.%20Every%20error%20and%20warning%20you%20see%20is%20a%20genuine%20Roslyn%20diagnostic%20from%20a%20fully%20loaded%20%3Ccode%3EMSBuildWorkspace%3C/code%3E.%20The%20same%20analysis%20engine%20that%20determines%20whether%20your%20code%20compiles%20is%20the%20one%20producing%20the%20diagnostics%20panel.%3C/p%3E%3Cp%3ESharpLsp%20uses%20the%20%3Ca%20href=%22https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_diagnostic%22%3ELSP%203.17%20pull-diagnostics%20model%3C/a%3E,%20which%20means%20diagnostics%20are%20only%20computed%20when%20the%20editor%20requests%20them.%20They%20are%20never%20pushed%20speculatively%20during%20workspace%20load%20%E2%80%94%20when%20the%20project%20graph%20is%20incomplete%20and%20packages%20are%20not%20yet%20restored.%20This%20solves%20the%20&amp;quot;phantom%20error&amp;quot;%20problem%20that%20has%20plagued%20C#%20tooling%20in%20VS%20Code%20for%20years.%20Anyone%20who%20has%20opened%20a%20large%20solution%20in%20OmniSharp%20and%20watched%20hundreds%20of%20CS0246%20errors%20appear%20and%20then%20disappear%20as%20packages%20loaded%20knows%20exactly%20why%20this%20matters.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-diagnostics-page.png%22%20alt=%22Diagnostics%20panel%20showing%20real%20Roslyn%20compiler%20errors%20with%20file%20and%20line%20references%22%3E%20%20%3Cfigcaption%3EReal%20Roslyn%20diagnostics,%20pulled%20on%20demand,%20never%20pushed%20prematurely.%3C/figcaption%3E%3C/figure%3E%3Cp%3EThe%20NuGet%20restore%20gate%20runs%20before%20%3Ccode%3EMSBuildWorkspace%3C/code%3E%20opens%20the%20solution.%20SharpLsp%20detects%20missing%20package%20restore%20state,%20runs%20%3Ccode%3Edotnet%20restore%3C/code%3E%20automatically,%20and%20only%20then%20begins%20serving%20semantic%20requests.%20The%20first-open%20experience%20takes%20slightly%20longer%20than%20immediately%20returning%20empty%20state,%20but%20every%20diagnostic%20that%20appears%20is%20real%20%E2%80%94%20there%20are%20no%20red%20squiggles%20that%20exist%20only%20because%20the%20workspace%20has%20not%20finished%20loading.%20This%20is%20the%20behavior%20.NET%20developers%20expect%20and%20have%20historically%20only%20gotten%20in%20Visual%20Studio%20or%20Rider,%20where%20the%20build%20system%20integration%20ensures%20packages%20are%20present%20before%20the%20IDE%20begins%20analysis.%3C/p%3E%3Ch3%20id=%22quick-fixes-and-refactoring%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#quick-fixes-and-refactoring%22%3EQuick%20Fixes%20and%20Refactoring%3C/a%3E%3C/h3%3E%3Cp%3ECode%20actions%20come%20from%20Roslyn&#39;s%20own%20%3Ccode%3ECodeFixProvider%3C/code%3E%20and%20%3Ccode%3ECodeRefactoringProvider%3C/code%3E%20implementations%20%E2%80%94%20the%20same%20providers%20that%20power%20Visual%20Studio&#39;s%20lightbulb%20menu,%20refined%20over%20a%20decade%20of%20production%20use%20against%20billions%20of%20lines%20of%20C#%20code.%20Remove%20unused%20variable,%20add%20missing%20%3Ccode%3Eusing%3C/code%3E,%20implement%20interface,%20rename%20symbol,%20extract%20method%20%E2%80%94%20all%20of%20these%20work%20because%20SharpLsp%20is%20calling%20the%20same%20APIs,%20not%20reimplementing%20them%20from%20scratch.%3C/p%3E%3Cp%3EThis%20also%20means%20third-party%20Roslyn%20analyzers%20work%20automatically.%20If%20your%20project%20references%20a%20Roslyn%20analyzer%20NuGet%20package%20%E2%80%94%20StyleCop,%20Roslynator,%20%3Ca%20href=%22http://ErrorProne.NET%22%3EErrorProne.NET%3C/a%3E%20%E2%80%94%20its%20diagnostic%20rules%20and%20code%20fixes%20appear%20in%20SharpLsp&#39;s%20action%20menu%20without%20any%20additional%20configuration.%20The%20analyzer%20pipeline%20is%20the%20same%20one%20Roslyn%20runs%20during%20compilation.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-refactoring.png%22%20alt=%22Quick%20fix%20lightbulb%20showing%20Remove%20unused%20variable,%20Fix,%20and%20Explain%20options%22%3E%20%20%3Cfigcaption%3ERoslyn-powered%20quick%20fixes%20surfaced%20directly%20in%20the%20editor%20action%20menu.%3C/figcaption%3E%3C/figure%3E%3Cp%3EThe%20list%20of%20available%20code%20actions%20in%20any%20given%20context%20is%20identical%20to%20what%20Visual%20Studio%20would%20offer%20in%20the%20same%20context,%20because%20the%20code%20path%20from%20&amp;quot;cursor%20position%20and%20diagnostic%20span&amp;quot;%20to%20&amp;quot;available%20actions&amp;quot;%20is%20identical.%20We%20pass%20the%20document,%20position,%20and%20diagnostic%20context%20to%20Roslyn&#39;s%20%3Ccode%3ECodeFixContext%3C/code%3E.%20Roslyn%20does%20the%20rest.%20Feature%20parity%20with%20Visual%20Studio&#39;s%20refactoring%20menu%20is%20not%20an%20aspiration%20%E2%80%94%20it%20is%20a%20consequence%20of%20the%20design.%3C/p%3E%3Ch3%20id=%22project-context-menu%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#project-context-menu%22%3EProject%20Context%20Menu%3C/a%3E%3C/h3%3E%3Cp%3ERight-clicking%20a%20project%20in%20the%20Solution%20Explorer%20gives%20you%20build,%20rebuild,%20clean,%20NuGet%20browsing,%20and%20project%20reference%20management%20%E2%80%94%20all%20wired%20up%20and%20working.%20These%20are%20not%20thin%20wrappers%20around%20shell%20commands;%20they%20go%20through%20the%20SharpLsp%20server,%20which%20means%20they%20are%20aware%20of%20solution%20state%20and%20can%20update%20the%20project%20graph%20when%20references%20change.%3C/p%3E%3Cp%3EBuild%20output%20appears%20in%20a%20dedicated%20panel,%20not%20mixed%20with%20LSP%20logs.%20Errors%20from%20the%20build%20link%20back%20to%20the%20source%20location%20in%20the%20editor,%20the%20same%20way%20Visual%20Studio&#39;s%20Error%20List%20does.%20When%20you%20add%20a%20project%20reference%20through%20the%20context%20menu,%20the%20%3Ccode%3EMSBuildWorkspace%3C/code%3E%20is%20updated%20to%20reflect%20the%20new%20dependency,%20and%20the%20Solution%20Explorer%20tree%20updates%20to%20show%20the%20reference%20without%20requiring%20a%20full%20restart.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-context-menu-open-project.png%22%20alt=%22Project%20context%20menu%20showing%20Build,%20Rebuild,%20Clean,%20Browse%20NuGet%20Packages,%20Add%20Project%20Reference%20options%22%3E%20%20%3Cfigcaption%3EProject-level%20actions%20directly%20from%20the%20Solution%20Explorer%20context%20menu.%3C/figcaption%3E%3C/figure%3E%3Cp%3EProject%20file%20mutations%20go%20through%20%3Ccode%3EMicrosoft.Build.Construction%3C/code%3E%20%E2%80%94%20the%20MSBuild%20document%20model%20API.%20This%20is%20not%20string%20manipulation.%20When%20SharpLsp%20adds%20a%20%3Ccode%3E&amp;lt;PackageReference&amp;gt;%3C/code%3E%20element,%20it%20is%20inserted%20into%20the%20project%20file&#39;s%20XML%20DOM%20at%20the%20correct%20position,%20formatted%20consistently%20with%20the%20existing%20file,%20and%20serialized%20back%20without%20disturbing%20whitespace%20or%20comments.%20This%20is%20a%20hard%20rule:%20SharpLsp%20never%20hand-manipulates%20structured%20files.%3C/p%3E%3Ch3%20id=%22nuget-management%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#nuget-management%22%3ENuGet%20Management%3C/a%3E%3C/h3%3E%3Cp%3EThe%20NuGet%20panel%20is%20a%20full%20package%20browser.%20Search%20%3Ca%20href=%22http://nuget.org%22%3Enuget.org%3C/a%3E%20(or%20any%20configured%20package%20source%20via%20%3Ccode%3Enuget.config%3C/code%3E),%20browse%20available%20versions,%20see%20what%20is%20currently%20installed,%20inspect%20package%20metadata%20%E2%80%94%20all%20without%20leaving%20the%20editor%20or%20opening%20a%20terminal.%20The%20search%20results%20pull%20live%20from%20the%20NuGet%20v3%20API,%20returning%20packages%20with%20download%20counts,%20license%20identifiers,%20and%20version%20lists.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-nuget-search.png%22%20alt=%22NuGet%20browser%20showing%20search%20results%20for%20Serilog%20packages%20with%20download%20counts%22%3E%20%20%3Cfigcaption%3ENuGet%20package%20search%20pulling%20live%20results%20from%20nuget.org.%3C/figcaption%3E%3C/figure%3E%3Cp%3EPackage%20management%20has%20always%20been%20a%20friction%20point%20for%20.NET%20developers%20in%20editors%20other%20than%20Visual%20Studio.%20The%20VS%20Code%20workflow%20typically%20involves%20either%20using%20the%20terminal%20(%3Ccode%3Edotnet%20add%20package%20Serilog%3C/code%3E)%20or%20editing%20the%20%3Ccode%3E.csproj%3C/code%3E%20by%20hand%20and%20waiting%20for%20a%20restore.%20Neither%20is%20as%20fast%20as%20a%20search-and-click%20UI%20with%20immediate%20feedback.%20SharpLsp%20brings%20that%20UI%20to%20every%20editor.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-nuget-installed.png%22%20alt=%22NuGet%20installed%20packages%20panel%20showing%20Newtonsoft.Json%20with%20description%20and%20version%22%3E%20%20%3Cfigcaption%3EInstalled%20packages%20tab%20showing%20what%20is%20in%20the%20active%20project.%3C/figcaption%3E%3C/figure%3E%3Cp%3EThe%20installed%20packages%20view%20derives%20its%20data%20from%20the%20MSBuild%20project%20graph%20%E2%80%94%20specifically%20the%20%3Ccode%3EPackageReference%3C/code%3E%20items%20resolved%20through%20the%20NuGet%20restore%20graph.%20This%20means%20it%20reflects%20the%20actual%20state%20of%20the%20project%20file,%20not%20a%20UI-side%20cache.%20If%20you%20add%20a%20package%20through%20the%20terminal%20and%20then%20open%20the%20panel,%20the%20new%20package%20is%20there.%20If%20you%20edit%20the%20%3Ccode%3E.csproj%3C/code%3E%20directly,%20the%20panel%20reflects%20the%20change%20on%20next%20refresh.%3C/p%3E%3Cfigure%20class=%22article-figure%22%3E%20%20%3Cimg%20src=%22/assets/screenshots/vscode-nuget-package-details.png%22%20alt=%22NuGet%20package%20detail%20panel%20for%20Newtonsoft.Json%20showing%20license,%20project%20URL,%20and%20version%22%3E%20%20%3Cfigcaption%3EPackage%20details%20with%20license,%20metadata,%20and%20install/remove%20actions.%3C/figcaption%3E%3C/figure%3E%3Cp%3EPackage%20details%20include%20SPDX%20license%20identifiers,%20project%20URLs,%20author%20information,%20and%20the%20full%20version%20history%20for%20the%20package%20on%20the%20configured%20feed.%20This%20is%20the%20level%20of%20detail%20available%20in%20Visual%20Studio&#39;s%20NuGet%20Package%20Manager,%20now%20available%20in%20every%20LSP-capable%20editor%20through%20a%20single%20shared%20server%20process.%3C/p%3E%3Ch2%20id=%22the-architecture%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-architecture%22%3EThe%20Architecture%3C/a%3E%3C/h2%3E%3Cp%3ESharpLsp%20is%20a%20three-tier%20system.%20The%20Rust%20host%20owns%20the%20LSP%20connection,%20the%20virtual%20file%20system,%20and%20all%20syntax-level%20work%20via%20%3Ca%20href=%22https://tree-sitter.github.io/tree-sitter/%22%3Etree-sitter%3C/a%3E.%20Two%20long-running%20.NET%20sidecar%20processes%20handle%20semantic%20analysis%20%E2%80%94%20one%20for%20C#%20via%20Roslyn,%20one%20for%20F#%20via%20FSharp.Compiler.Service.%3C/p%3E%3Cp%3EThe%20decision%20to%20build%20the%20host%20in%20Rust%20is%20not%20a%20novelty%20choice.%20Rust%20gives%20us%20a%20zero-cost%20async%20runtime%20via%20tokio,%20fearless%20concurrency%20for%20the%20multi-editor%20shared-server%20scenario,%20and%20a%20binary%20that%20starts%20in%20under%2050ms%20and%20consumes%20negligible%20memory%20before%20the%20sidecars%20connect.%20The%20host%20processes%20LSP%20messages,%20manages%20the%20virtual%20file%20system,%20routes%20requests,%20and%20handles%20tree-sitter%20parsing%20%E2%80%94%20all%20without%20touching%20the%20heap%20in%20ways%20that%20would%20interfere%20with%20the%20garbage-collected%20sidecar%20processes.%3C/p%3E%3Cp%3EThe%20decision%20to%20keep%20semantic%20analysis%20in%20.NET%20is%20equally%20deliberate.%20Roslyn%20is%20a%20managed%20runtime%20library.%20FSharp.Compiler.Service%20is%20a%20managed%20runtime%20library.%20Both%20are%20sophisticated,%20well-maintained%20implementations%20of%20their%20languages%20with%20decades%20of%20engineering%20behind%20them,%20and%20reimplementing%20them%20in%20any%20other%20language%20would%20be%20insane.%20We%20call%20them%20instead.%20The%20sidecars%20are%20long-running%20.NET%20processes%20that%20load%20the%20full%20MSBuildWorkspace,%20maintain%20the%20in-memory%20compiler%20state,%20and%20respond%20to%20IPC%20requests%20from%20the%20Rust%20host.%3C/p%3E%3Cp%3EThe%20IPC%20between%20Rust%20and%20the%20sidecars%20uses%20MessagePack%20over%20Unix%20domain%20sockets%20(named%20pipes%20on%20Windows),%20framed%20with%20a%204-byte%20little-endian%20length%20prefix.%20Round-trip%20IPC%20overhead%20runs%20consistently%20under%20200%C2%B5s%20in%20local%20benchmarks,%20meaning%20the%20bottleneck%20is%20always%20the%20compiler%20operation%20%E2%80%94%20not%20the%20transport.%20Total%20round-trip%20overhead%20target,%20including%20IPC:%20under%20500%C2%B5s%20excluding%20compiler%20work.%3C/p%3E%3Cp%3ESyntax-only%20requests%20%E2%80%94%20document%20symbols,%20folding%20ranges,%20selection%20ranges%20%E2%80%94%20are%20handled%20entirely%20in%20the%20Rust%20host%20using%20tree-sitter.%20They%20return%20in%20under%205ms%20regardless%20of%20solution%20size.%20Semantic%20requests%20go%20to%20the%20sidecars%20and%20are%20coalesced%20with%20a%20150ms%20debounce%20window.%20Stale%20in-flight%20requests%20are%20cancelled%20when%20superseded%20by%20newer%20versions%20of%20the%20same%20document.%3C/p%3E%3Ctable%3E%3Cthead%3E%3Ctr%3E%3Cth%3ECategory%3C/th%3E%3Cth%3EHandler%3C/th%3E%3Cth%3ELatency%20Target%3C/th%3E%3Cth%3EExamples%3C/th%3E%3C/tr%3E%3C/thead%3E%3Ctbody%3E%3Ctr%3E%3Ctd%3ESyntax-only%3C/td%3E%3Ctd%3ERust%20(tree-sitter)%3C/td%3E%3Ctd%3E&amp;lt;5ms%3C/td%3E%3Ctd%3EdocumentSymbol,%20foldingRange,%20selectionRange%3C/td%3E%3C/tr%3E%3Ctr%3E%3Ctd%3ESemantic%3C/td%3E%3Ctd%3ESidecar%20(Roslyn/FCS)%3C/td%3E%3Ctd%3E&amp;lt;200ms%3C/td%3E%3Ctd%3Ecompletion,%20hover,%20definition,%20references%3C/td%3E%3C/tr%3E%3Ctr%3E%3Ctd%3EHybrid%3C/td%3E%3Ctd%3ERust%20+%20Sidecar%3C/td%3E%3Ctd%3E&amp;lt;100ms%3C/td%3E%3Ctd%3EsemanticTokens%3C/td%3E%3C/tr%3E%3Ctr%3E%3Ctd%3ECached%3C/td%3E%3Ctd%3ERust%20(salsa)%3C/td%3E%3Ctd%3E&amp;lt;1ms%3C/td%3E%3Ctd%3ERepeat%20requests%20for%20unchanged%20documents%3C/td%3E%3C/tr%3E%3C/tbody%3E%3C/table%3E%3Cp%3E%3Cstrong%3EAll%20SharpLsp%20binaries%20live%20in%20one%20central%20location%20on%20the%20machine.%3C/strong%3E%20%3Ccode%3Esharplsp%3C/code%3E%20on%20%3Ccode%3E$PATH%3C/code%3E%20is%20all%20any%20editor%20needs.%20Editor%20extensions%20are%20thin%20clients%20that%20launch%20the%20system%20binary%20%E2%80%94%20they%20contain%20zero%20bundled%20executables.%20One%20install%20serves%20VS%20Code,%20Neovim,%20Helix,%20Zed,%20and%20every%20other%20LSP-capable%20editor%20simultaneously.%3C/p%3E%3Cp%3EThis%20resolves%20one%20of%20the%20more%20absurd%20aspects%20of%20the%20current%20ecosystem:%20every%20editor%20extension%20bundles%20its%20own%20copy%20of%20the%20language%20server%20binary.%20The%20OmniSharp%20VS%20Code%20extension%20ships%20a%20bundled%20OmniSharp%20binary.%20The%20Ionide%20extension%20ships%20its%20own%20build%20of%20the%20F#%20language%20server.%20These%20binaries%20are%20downloaded%20per-extension,%20per-editor,%20per-machine.%20They%20do%20not%20share%20a%20process.%20They%20do%20not%20share%20a%20cache.%20A%20developer%20using%20VS%20Code%20and%20Neovim%20simultaneously%20against%20the%20same%20solution%20would%20theoretically%20be%20running%20two%20separate%20instances%20of%20OmniSharp%20%E2%80%94%20each%20maintaining%20its%20own%20copy%20of%20the%20Roslyn%20workspace%20in%20memory.%20SharpLsp%20runs%20one%20process%20per%20solution,%20shared%20by%20all%20editors%20on%20the%20machine.%3C/p%3E%3Ch2%20id=%22f-is-not-an-afterthought%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#f-is-not-an-afterthought%22%3EF#%20Is%20Not%20an%20Afterthought%3C/a%3E%3C/h2%3E%3Cp%3EMicrosoft&#39;s%20retirement%20post%20told%20F#%20developers%20on%20Mac%20to%20run%20a%20Windows%20VM.%20C#%20Dev%20Kit%20has%20no%20F#%20support.%20The%20Language%20Server%20Protocol%20announcement%20in%20issue%20#5276%20did%20not%20mention%20F#%20once.%20OmniSharp&#39;s%20F#%20story%20has%20always%20been%20secondary.%20The%20community%20has%20accepted%20this%20for%20years%20because%20there%20was%20no%20alternative.%20SharpLsp%20refuses%20to%20accept%20it.%3C/p%3E%3Cp%3EThe%20state%20of%20F#%20tooling%20outside%20Windows%20and%20Rider%20has%20been%20a%20persistent%20source%20of%20frustration%20that%20has%20measurably%20slowed%20the%20language&#39;s%20adoption.%20A%20Reddit%20thread%20on%20r/fsharp%20%E2%80%94%20titled%20&amp;quot;%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/bngxxz/editing_f_a_big_issue_preventing_adoption_and/%22%3EEditing%20F#:%20A%20big%20issue%20preventing%20adoption%20and%20onboarding%3C/a%3E&amp;quot;%20%E2%80%94%20summarized%20the%20case%20in%202019%20and%20it%20remains%20accurate%20today.%20User%20%3Cstrong%3Eflubahdubah%3C/strong%3E%20wrote:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;I&#39;m%20here%20to%20make%20the%20argument%20that%20fixing%20the%20editor%20tooling%20should%20be%20a%20higher%20priority%20item%20to%20fix%20for%20the%20F#%20team,%20ahead%20of%20some%20of%20the%20current%20release%20items%20that%20(while%20appreciated%20and%20important)%20do%20not%20fix%20as%20large%20of%20an%20issue.%20We%20use%20editor%20tooling%20in%20every%20single%20programming%20task%20%E2%80%94%20versus%20a%20language%20feature%20which%20might%20only%20be%20present%20in%20certain%20programming%20tasks.%20Having%20a%20base%20set%20of%20reliable%20editing%20features%20can%20signal%20the%20maturity%20of%20a%20language&#39;s%20ecosystem.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EAn%20anonymous%20commenter%20in%20the%20same%20thread%20identified%20something%20structurally%20important%20about%20F#%20and%20type%20inference:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Another%20issue%20is%20that%20since%20most%20F#%20code%20uses%20type%20inference%20so%20heavily,%20it&#39;s%20even%20more%20important%20than%20normal%20to%20have%20an%20editor%20with%20IDE%20features,%20so%20you%20can%20tell%20what%20types%20things%20are.%20Code%20you%20wrote%20a%20long%20time%20ago,%20or%20someone%20else&#39;s%20code,%20that%20doesn&#39;t%20have%20type%20annotations%20is%20completely%20impenetrable%20without%20a%20code%20editor%20that%20can%20show%20you%20the%20types%20in%20some%20way,%20and%20let%20you%20hop%20to%20definition.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EThis%20is%20why%20F#%20editor%20quality%20is%20not%20just%20a%20quality-of-life%20issue%20%E2%80%94%20it%20is%20a%20correctness%20issue.%20Without%20accurate%20type%20display%20on%20hover,%20F#%20code%20that%20relies%20heavily%20on%20inference%20is%20genuinely%20hard%20to%20read%20and%20maintain.%20The%20editor%20is%20not%20a%20convenience;%20it%20is%20the%20documentation.%20When%20the%20editor%20is%20slow,%20crashes%20under%20load,%20or%20loses%20track%20of%20types%20after%20a%20file%20change,%20the%20language%20itself%20becomes%20less%20accessible.%3C/p%3E%3Cp%3EUser%20%3Cstrong%3Ebozhidarb%3C/strong%3E%20in%20a%20recent%20r/fsharp%20editor%20thread%20described%20the%20broader%20problem%20clearly:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;I&#39;m%20not%20sure%20the%20support%20for%20F#%20in%20NeoVim%20is%20very%20good%20%E2%80%94%20I%20played%20with%20OCaml%20there%20and%20the%20indentation%20was%20quite%20broken%20when%20using%20TreeSitter.%20I%20checked%20Helix%20briefly%20and%20the%20support%20story%20there%20wasn&#39;t%20very%20good%20either.%20That&#39;s%20a%20big%20problem%20with%20smaller%20communities%20%E2%80%94%20the%20languages%20are%20great,%20but%20the%20support%20for%20them%20in%20editors%20is%20all%20over%20the%20place.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EAnd%20user%20%3Cstrong%3Everdadkc%3C/strong%3E%20in%20the%20F#%20tooling%20state%20thread%20described%20the%20onboarding%20barrier%20that%20the%20current%20situation%20creates:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Learning%20a%20new%20language%20is%20the%20fun%20and%20easy%20part.%20Learning%20a%20new%20tooling%20ecosystem%20is%20daunting%20and%20tedious.%20I%20would%20love%20to%20see%20a%20course%20on%20.NET%20for%20people%20who%20are%20entirely%20new%20to%20.NET%20and%20have%20no%20intention%20of%20ever%20using%20Visual%20Studio.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3ESharpLsp%20addresses%20this%20directly.%20C#%20and%20F#%20share%20the%20same%20infrastructure%20tier.%20They%20hit%20the%20same%20feature%20targets.%20They%20are%20tested%20to%20the%20same%20standard.%20F#%20is%20not%20a%20bolt-on%20%E2%80%94%20it%20is%20a%20first-class%20target%20from%20day%20one.%3C/p%3E%3Cp%3EThe%20F#%20sidecar%20runs%20%3Ca%20href=%22https://www.nuget.org/packages/FSharp.Compiler.Service%22%3EFSharp.Compiler.Service%3C/a%3E%20with%20%3Ca%20href=%22https://github.com/ionide/proj-info%22%3EIonide.ProjInfo%3C/a%3E%20for%20project%20cracking%20and%20%3Ca%20href=%22https://github.com/fsprojects/FSharpLint%22%3EFSharpLint%3C/a%3E%20for%20linting.%20F#-specific%20features%20%E2%80%94%20pipeline%20type%20hints%20(inline%20display%20of%20intermediate%20types%20in%20%3Ccode%3E|&amp;gt;%3C/code%3E%20chains),%20union%20case%20generation,%20record%20stub%20completion,%20computation%20expression%20completions,%20file%20ordering%20awareness%20in%20%3Ccode%3E.fsproj%3C/code%3E,%20and%20%3Ccode%3E.fsx%3C/code%3E%20script%20support%20with%20NuGet%20reference%20completions%20%E2%80%94%20are%20on%20the%20roadmap%20as%20first-priority%20items,%20not%20future%20nice-to-haves.%3C/p%3E%3Cp%3EThe%20bar%20we%20are%20building%20to%20is%20the%20one%20%3Cstrong%3EJwosty%3C/strong%3E%20described%20of%20Rider&#39;s%20F#%20support%20on%20r/fsharp:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;The%20F#%20intellisense%20experience%20in%20Rider%20is%20rock-solid.%20Rivals%20Visual%20Studio.%20F#%20feels%20like%20a%20first-class%20citizen%20in%20Rider.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EWe%20are%20building%20that,%20in%20open%20source,%20for%20every%20editor%20on%20every%20platform.%20When%20we%20add%20a%20new%20feature,%20F#%20gets%20it%20at%20the%20same%20time%20as%20C#.%3C/p%3E%3Ch2%20id=%22why-open-source-ownership-matters%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#why-open-source-ownership-matters%22%3EWhy%20Open%20Source%20Ownership%20Matters%3C/a%3E%3C/h2%3E%3Cp%3EThe%20community&#39;s%20frustration%20with%20the%20#5276%20announcement%20was%20not%20abstract%20ideology%20about%20open%20source.%20It%20was%20about%20control%20%E2%80%94%20specifically,%20the%20loss%20of%20the%20ability%20to%20predict%20what%20your%20tooling%20will%20do%20next,%20fork%20it%20when%20it%20breaks,%20or%20migrate%20away%20when%20the%20vendor%20changes%20direction.%20As%20%3Cstrong%3Ecodymullins%3C/strong%3E%20put%20it%20in%20the%20thread:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Closed%20tools%20all%20get%20sunset%20eventually,%20then%20we&#39;ll%20have%20to%20port%20all%20our%20code.%20I&#39;ve%20worked%20at%20places%20where%20my%20whole%20job%20was%20porting%20from%20some%20closed%20source%20language%20that&#39;s%20no%20longer%20supported.%20Better%20to%20do%20it%20on%20your%20own%20schedule%20than%20be%20forced%20to%20unexpectedly.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EThe%20pattern%20repeats%20across%20the%20industry.%20A%20commercial%20vendor%20offers%20excellent%20tooling.%20The%20community%20grows%20dependent%20on%20it.%20The%20vendor%20changes%20pricing,%20changes%20licensing%20terms,%20sunsettings%20a%20feature,%20or%20pivots%20the%20product%20direction.%20The%20community%20scrambles.%20This%20happened%20with%20Visual%20Studio%20for%20Mac.%20It%20happened%20with%20Xamarin.%20It%20happened%20with%20.NET&#39;s%20cross-platform%20story%20generally%20before%20the%20community%20pressure%20behind%20.NET%20Core%20forced%20Microsoft&#39;s%20hand.%3C/p%3E%3Cp%3EOpen%20source%20is%20not%20a%20guarantee%20of%20quality%20%E2%80%94%20OmniSharp%20had%20bugs%20too.%20But%20it%20is%20a%20guarantee%20of%20continuity%20and%20control.%20When%20the%20source%20code%20exists%20and%20is%20MIT%20licensed,%20the%20community%20can%20fork%20it,%20maintain%20it,%20improve%20it,%20and%20integrate%20it%20into%20other%20tools%20without%20permission.%20No%20single%20company%20can%20deprecate%20it%20overnight.%3C/p%3E%3Cp%3ESharpLsp%20is%20MIT%20licensed.%20The%20full%20source%20is%20on%20%3Ca%20href=%22https://github.com/Nimblesite/SharpLsp%22%3EGitHub%3C/a%3E.%20There%20are%20no%20closed-source%20components,%20no%20enterprise%20license%20restrictions,%20no%20Microsoft%20account%20requirements.%20No%20organization%20of%20any%20size%20is%20excluded%20from%20using%20it%20commercially.%20There%20is%20nothing%20to%20sign.%3C/p%3E%3Ch2%20id=%22what-is-next%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-is-next%22%3EWhat%20Is%20Next%3C/a%3E%3C/h2%3E%3Cp%3EPhase%202%20is%20underway:%20full%20semantic%20analysis%20for%20both%20languages.%20That%20means%20completions,%20hover,%20go-to-definition,%20find-references,%20diagnostics,%20rename,%20and%20semantic%20tokens%20%E2%80%94%20all%20working%20against%20real%20MSBuildWorkspace-loaded%20solutions%20for%20C#%20and%20FCS-loaded%20projects%20for%20F#.%3C/p%3E%3Cp%3EAfter%20that:%20code%20actions%20and%20refactoring%20(Phase%203),%20test%20discovery%20and%20debugging%20(Phase%204),%20and%20eventually%20features%20no%20other%20open-source%20tool%20has%20offered%20%E2%80%94%20cross-language%20navigation%20between%20C#%20and%20F#%20projects%20in%20the%20same%20solution,%20architecture%20analysis,%20AI-assisted%20code%20actions%20via%20MCP%20(Phase%205).%3C/p%3E%3Cp%3EThe%20cross-language%20navigation%20feature%20deserves%20particular%20mention.%20In%20a%20real-world%20.NET%20solution,%20it%20is%20common%20to%20have%20C#%20and%20F#%20projects%20side%20by%20side%20%E2%80%94%20an%20F#%20domain%20model%20library%20consumed%20by%20a%20C#%20%3Ca%20href=%22http://ASP.NET%22%3EASP.NET%3C/a%3E%20Core%20API,%20for%20example.%20Go%20to%20Definition%20on%20a%20C#%20call%20into%20an%20F#%20type%20currently%20drops%20you%20at%20a%20metadata%20stub%20in%20every%20open-source%20tool.%20SharpLsp%20will%20resolve%20the%20definition%20across%20the%20language%20boundary,%20routing%20the%20request%20to%20whichever%20sidecar%20owns%20the%20target%20file,%20and%20returning%20the%20actual%20F#%20source%20location.%20This%20has%20never%20been%20done%20in%20an%20open-source%20LSP%20implementation.%3C/p%3E%3Cp%3EThe%20full%20roadmap%20is%20in%20the%20%3Ca%20href=%22/docs/specs/sharplsp-spec.md%22%3Etechnical%20specification%3C/a%3E.%20The%20code%20is%20on%20%3Ca%20href=%22https://github.com/Nimblesite/SharpLsp%22%3EGitHub%3C/a%3E.%3C/p%3E%3Cp%3ESharpLsp%20exists%20because%20.NET%20developers%20deserve%20world-class%20tooling%20that%20is%20not%20gated%20behind%20proprietary%20licenses,%20vendor%20lock-in,%20or%20single-editor%20coupling.%20The%20community%20has%20been%20building%20workarounds%20for%20over%20a%20decade.%20We%20are%20done%20building%20workarounds.%20Come%20help%20build%20the%20real%20thing.%3C/p%3E</content>
    <summary>SharpLsp is an open-source, editor-agnostic Language Server for C# and F# — built in Rust, powered by Roslyn and FSharp.Compiler.Service. No licenses. No lock-in. Every editor.</summary>
  </entry>
  <entry>
    <title>Why F# Is First-Class in SharpLsp</title>
    <link href="https://sharplsp.dev/blog/why-fsharp-is-first-class-in-sharplsp/"/>
    <id>https://sharplsp.dev/blog/why-fsharp-is-first-class-in-sharplsp/</id>
    <updated>2026-04-26T00:00:00Z</updated>
    <content type="html">https://sharplsp.dev/%3Cp%3ESharpLsp%20is%20a%20.NET%20language%20server%20for%20C#%20and%20F#.%20That%20wording%20is%20deliberate.%20F#%20is%20not%20a%20future%20compatibility%20note,%20a%20later%20integration,%20or%20a%20checkbox%20beside%20C#.%3C/p%3E%3Cp%3EF#%20deserves%20first-class%20treatment%20because%20it%20is%20a%20serious%20production%20language%20with%20a%20serious%20community%20behind%20it.%20Microsoft%20describes%20F#%20as%20a%20language%20for%20%3Ca%20href=%22https://learn.microsoft.com/en-us/dotnet/fsharp/what-is-fsharp%22%3E&amp;quot;succinct,%20robust%20and%20performant%20code&amp;quot;%3C/a%3E.%20The%20official%20.NET%20language%20strategy%20says%20F#%20developers%20%3Ca%20href=%22https://devblogs.microsoft.com/dotnet/the-net-language-strategy/%22%3E&amp;quot;simply%20love%20working%20in%20it&amp;quot;%3C/a%3E%20and%20states%20the%20ambition%20to%20make%20F#%20the%20%3Ca%20href=%22https://devblogs.microsoft.com/dotnet/the-net-language-strategy/%22%3E&amp;quot;best-tooled%20functional%20language%20on%20the%20market&amp;quot;%3C/a%3E.%3C/p%3E%3Cp%3EThat%20is%20the%20right%20ambition.%20The%20current%20editor%20reality%20still%20has%20a%20gap.%3C/p%3E%3Cp%3EThe%20same%20language%20strategy%20also%20said%20F#%20tooling%20%3Ca%20href=%22https://devblogs.microsoft.com/dotnet/the-net-language-strategy/%22%3E&amp;quot;doesn&#39;t%20quite%20measure%20up&amp;quot;%3C/a%3E%20to%20the%20richer%20C#%20and%20Visual%20Basic%20experience.%20That%20was%20written%20in%202017,%20and%20public%20community%20threads%20since%20then%20show%20a%20familiar%20pattern:%20the%20language%20is%20excellent,%20the%20community%20is%20excellent,%20and%20the%20day-to-day%20tooling%20experience%20still%20needs%20more%20investment.%3C/p%3E%3Cp%3ESharpLsp%20exists%20to%20make%20that%20investment%20architectural.%3C/p%3E%3Ch2%20id=%22the-community-is-already-doing-heroic-work%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-community-is-already-doing-heroic-work%22%3EThe%20Community%20Is%20Already%20Doing%20Heroic%20Work%3C/a%3E%3C/h2%3E%3Cp%3EAny%20honest%20article%20about%20F#%20tooling%20has%20to%20start%20with%20respect%20for%20the%20people%20who%20built%20the%20existing%20ecosystem.%20The%20F#%20community%20did%20not%20wait%20around%20for%20perfect%20vendor%20support.%20It%20built%20tools.%3C/p%3E%3Cp%3E%3Ca%20href=%22https://ionide.io/index.html%22%3EIonide%3C/a%3E%20describes%20itself%20directly:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;We%20build%20cross%20platform,%20F#%20developer%20tooling&amp;quot;%20-%20%3Ca%20href=%22https://ionide.io/index.html%22%3EIonide%3C/a%3E%3C/p%3E%3C/blockquote%3E%3Cp%3EIonide&#39;s%20flagship%20VS%20Code%20extension%20has%20%3Ca%20href=%22https://ionide.io/index.html%22%3Emore%20than%201%20million%20downloads%3C/a%3E,%20and%20the%20project%20documents%20a%20real%20toolchain:%20%3Ca%20href=%22https://ionide.io/Tools/fsac.html%22%3EFSAutoComplete%3C/a%3E,%20%3Ca%20href=%22https://fsharp.github.io/fsharp-compiler-docs/fcs/%22%3EFSharp.Compiler.Service%3C/a%3E,%20Fantomas,%20FSharpLint,%20analyzers,%20project%20info,%20and%20LSP%20communication.%20The%20%3Ca%20href=%22https://ionide.io/Editors/Code/overview.html%22%3EIonide%20VS%20Code%20overview%3C/a%3E%20lists%20the%20features%20F#%20developers%20expect%20from%20a%20productive%20editor:%20autocomplete,%20go-to-definition,%20tooltips,%20rename,%20refactorings,%20quick%20fixes,%20F#%20Interactive,%20workspace%20errors,%20project%20explorer,%20debugger%20integration,%20and%20more.%3C/p%3E%3Cp%3EThat%20work%20is%20not%20a%20footnote.%20It%20is%20the%20reason%20cross-platform%20F#%20development%20has%20been%20viable%20for%20years.%3C/p%3E%3Cp%3EThe%20community%20sees%20that%20too:%3C/p%3E%3Cblockquote%3E%3Cp%3EIonide%20is%20an%20absolute%20treasure.Pioneered%20so%20many%20tooling%20features%20that%20VS%20and%20Rider%20now%20have%20too.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/jy9dgq%22%3Er/fsharp,%20&amp;quot;F#%20Weekly%20#47,%205%20years%20of%20Ionide&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cp%3EThat%20quote%20matters%20because%20it%20captures%20the%20correct%20posture:%20gratitude%20first.%20Ionide%20and%20FSAutoComplete%20carried%20an%20enormous%20load.%20SharpLsp%20is%20not%20a%20criticism%20of%20that%20work.%20It%20is%20a%20bet%20that%20the%20next%20layer%20of%20open%20.NET%20tooling%20should%20learn%20from%20it,%20reuse%20the%20right%20compiler%20primitives,%20and%20give%20F#%20a%20bigger%20seat%20in%20the%20architecture.%3C/p%3E%3Ch2%20id=%22the-pain-is-also-real%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-pain-is-also-real%22%3EThe%20Pain%20Is%20Also%20Real%3C/a%3E%3C/h2%3E%3Cp%3ERespect%20does%20not%20require%20denial.%20F#%20developers%20have%20been%20frank%20about%20where%20the%20experience%20breaks%20down.%3C/p%3E%3Cp%3EOne%20r/fsharp%20user%20described%20the%20VS%20Code%20experience%20this%20way:%3C/p%3E%3Cblockquote%3E%3Cp%3Ethis%20does%20feel%20very%20shaky%20compared%20to%20every%20other%20language%20I&#39;ve%20worked%20with.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/t6uyrh%22%3Er/fsharp,%20&amp;quot;Ionide%20in%20VS%20Code%20(and%20tooling%20in%20general)%20is%20pushing%20me%20away%20from%20F#&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cp%3EIn%20the%20same%20discussion,%20the%20specific%20failure%20mode%20was%20not%20abstract:%3C/p%3E%3Cblockquote%3E%3Cp%3EIonide%20wouldn&#39;t%20stop%20flagging%20this%20code%20as%20erroneous%20until%20I%20restarted%20VSCode%20altogether.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/t6uyrh%22%3Er/fsharp,%20same%20thread%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cp%3EAnother%20user%20gave%20a%20more%20sympathetic%20but%20still%20conditional%20assessment:%3C/p%3E%3Cblockquote%3E%3Cp%3Eionide%20f#%20isnt%20that%20bad%20by%20comparison%20if%20you%20keep%20project%20scaffolding%20&amp;quot;vanilla&amp;quot;.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/t6uyrh%22%3Er/fsharp,%20same%20thread%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cp%3EThat%20&amp;quot;if&amp;quot;%20is%20the%20problem.%20Serious%20F#%20users%20work%20in%20real%20solutions%20with%20mixed%20projects,%20generated%20assets,%20package%20restore,%20analyzers,%20scripts,%20multiple%20target%20frameworks,%20and%20build%20logic.%20Tooling%20that%20works%20only%20when%20the%20project%20shape%20stays%20simple%20does%20not%20meet%20the%20bar%20for%20a%20first-class%20language.%3C/p%3E%3Cp%3EThe%20theme%20keeps%20recurring:%3C/p%3E%3Cblockquote%3E%3Cp%3EI%20love%20the%20language%20and%20all%20the%20rest%20of%20the%20tooling%20is%20fantastic%20at%20this%20point,%20but%20every%20time%20ionide%20fails%20to%20load...%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/13wm3gm%22%3Er/fsharp,%20&amp;quot;Ionide%20doesn&#39;t%20load%20projects&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cblockquote%3E%3Cp%3EYeah%20the%20tooling%20in%20general%20feels%20slower,%20less%20reliable%20than%20that%20of%20more%20mainstream%20langs%20-%20likely%20cause%20less%20devs,%20cos,%20and%20funding%20supporting%20it.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/16u52m4%22%3Er/fsharp,%20&amp;quot;Why%20is%20F#%20not%20loved%20as%20much%20as%20comparable%20FP-hybrids?&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cblockquote%3E%3Cp%3EThe%20tooling%20for%20F#%20pales%20in%20comparison%20with%20the%20tooling%20for%20C#%20though.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/1bvsyyu%22%3Er/fsharp,%20&amp;quot;FSharp%20in%20VS%20Code&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cblockquote%3E%3Cp%3ETBH%20I&#39;m%20finding%20Visual%20Studio%202019%20a%20more%20reliable%20environment%20for%20F#%20coding,%20I%20would%20prefer%20to%20use%20VS%20Code...%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/p0bh3z%22%3Er/fsharp,%20&amp;quot;No%20red%20squiggly%20lines%20in%20VS%20Code%20/%20Ionide&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cp%3EThose%20are%20anecdotes,%20not%20benchmark%20data.%20But%20public%20anecdotes%20still%20matter%20because%20they%20describe%20the%20exact%20user%20experience%20SharpLsp%20has%20to%20improve:%20project%20loading,%20stale%20diagnostics,%20semantic%20latency,%20memory%20pressure,%20editor%20restarts,%20and%20confidence%20that%20a%20squiggle%20means%20the%20compiler%20agrees.%3C/p%3E%3Ch2%20id=%22the-numbers-say-niche-not-weak%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-numbers-say-niche-not-weak%22%3EThe%20Numbers%20Say%20Niche,%20Not%20Weak%3C/a%3E%3C/h2%3E%3Cp%3EStack%20Overflow&#39;s%202025%20Developer%20Survey%20reports%20F#%20at%20%3Ca%20href=%22https://survey.stackoverflow.co/2025/technology%22%3E1.3%%20usage%20across%20all%20respondents%20and%201.2%%20among%20professional%20developers%3C/a%3E.%20That%20is%20niche.%20It%20is%20not%20failure.%3C/p%3E%3Cp%3EThe%20same%202025%20survey%20reports%20F#%20at%20%3Ca%20href=%22https://survey.stackoverflow.co/2025/technology%22%3E2.9%%20desired%20and%2049.1%%20admired%3C/a%3E%20in%20the%20programming%20language%20&amp;quot;Admired%20and%20Desired&amp;quot;%20section.%20Survey%20data%20has%20limitations,%20and%20Stack%20Overflow&#39;s%20respondent%20pool%20is%20not%20a%20census.%20Still,%20the%20signal%20is%20consistent%20with%20what%20F#%20users%20say%20in%20public:%20F#%20is%20a%20smaller%20language%20with%20a%20committed%20user%20base,%20not%20a%20dead%20end.%3C/p%3E%3Cp%3EThe%202023%20analysis%20%3Ca%20href=%22https://hamy.xyz/labs/2023-06-state-of-fsharp%22%3E&amp;quot;The%20State%20of%20F#&amp;quot;%3C/a%3E%20made%20the%20same%20basic%20point%20from%20that%20year&#39;s%20survey%20data:%20low%20usage,%20high%20affection,%20and%20high%20salary%20ranking%20among%20respondents.%20Its%20conclusion%20was%20not%20that%20F#%20is%20mainstream.%20It%20was%20that%20F#%20is%20a%20known%20niche%20language%20with%20users%20who%20often%20want%20to%20keep%20using%20it.%3C/p%3E%3Cp%3EThat%20is%20exactly%20the%20kind%20of%20language%20where%20tooling%20matters%20most.%20A%20large%20language%20can%20survive%20mediocre%20editor%20support%20through%20sheer%20ecosystem%20gravity.%20A%20small%20language%20cannot.%20For%20F#,%20great%20tooling%20is%20not%20polish.%20It%20is%20adoption%20infrastructure.%3C/p%3E%3Ch2%20id=%22f-is-semantically-different%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#f-is-semantically-different%22%3EF#%20Is%20Semantically%20Different%3C/a%3E%3C/h2%3E%3Cp%3EF#%20is%20not%20C#%20with%20different%20punctuation.%20The%20language%20has%20different%20editing%20requirements,%20and%20those%20requirements%20come%20from%20real%20semantics.%3C/p%3E%3Cp%3EMicrosoft&#39;s%20F#%20tooling%20update%20for%20Visual%20Studio%2016.9%20explains%20why%20semantic%20editor%20features%20are%20harder%20in%20F#:%20because%20F#%20uses%20type%20inference,%20a%20change%20in%20one%20source%20file%20can%20affect%20types%20later%20in%20the%20project%20or%20solution.%20The%20post%20is%20explicit%20that%20typechecked-data%20features%20are%20affected%20by%20compiler%20typechecking%20work,%20and%20it%20calls%20out%20downstream%20effects%20from%20changing%20a%20union%20case%20or%20a%20widely%20used%20function&#39;s%20output%20type%20in%20a%20large%20codebase.%20It%20also%20explains%20why%20signature%20files%20can%20improve%20IDE%20performance%20by%20limiting%20how%20much%20downstream%20typechecking%20work%20is%20required.%20Source:%20%3Ca%20href=%22https://devblogs.microsoft.com/dotnet/f-and-f-tools-update-for-visual-studio-16-9/%22%3EF#%20and%20F#%20tools%20update%20for%20Visual%20Studio%2016.9%3C/a%3E.%3C/p%3E%3Cp%3EThat%20single%20fact%20has%20huge%20consequences%20for%20an%20LSP:%3C/p%3E%3Cul%3E%3Cli%3EProject%20file%20order%20is%20not%20cosmetic.%20F#%20compilation%20order%20changes%20meaning.%3C/li%3E%3Cli%3EHover%20is%20central%20because%20inferred%20types%20are%20often%20not%20written%20in%20source.%3C/li%3E%3Cli%3ECompletion%20must%20understand%20the%20typechecker%20state,%20not%20just%20syntax.%3C/li%3E%3Cli%3E%3Ccode%3E.fs%3C/code%3E,%20%3Ccode%3E.fsi%3C/code%3E,%20and%20%3Ccode%3E.fsx%3C/code%3E%20files%20have%20different%20workflows.%3C/li%3E%3Cli%3EF#%20Interactive%20is%20part%20of%20the%20development%20loop.%3C/li%3E%3Cli%3ESignature%20files%20are%20both%20API%20design%20tools%20and%20performance%20tools.%3C/li%3E%3Cli%3EType%20providers%20and%20analyzers%20create%20language-service%20pressure%20that%20generic%20C#%20assumptions%20do%20not%20cover.%3C/li%3E%3C/ul%3E%3Cp%3EThe%20official%20%3Ca%20href=%22https://fsharp.github.io/fsharp-compiler-docs/fcs/%22%3EFSharp.Compiler.Service%20documentation%3C/a%3E%20backs%20the%20architectural%20point.%20FCS%20exposes%20editor%20services%20for%20%3Ca%20href=%22https://fsharp.github.io/fsharp-compiler-docs/fcs/%22%3E&amp;quot;auto-completion,%20tool-tips,%20parameter%20information&amp;quot;%3C/a%3E,%20whole-project%20analysis,%20hosting%20F#%20Interactive,%20and%20embedding%20the%20compiler.%20It%20is%20also%20the%20compiler-backed%20foundation%20used%20by%20projects%20such%20as%20F#%20in%20Visual%20Studio,%20FsAutoComplete,%20Rider&#39;s%20F#%20support,%20.NET%20Interactive,%20Fantomas,%20FSharpLint,%20Fable,%20and%20WebSharper.%3C/p%3E%3Cp%3EIn%20other%20words:%20real%20F#%20tooling%20starts%20at%20FCS.%20It%20does%20not%20start%20with%20pretending%20F#%20can%20be%20routed%20through%20a%20C#%20semantic%20model.%3C/p%3E%3Ch2%20id=%22good-news-is-happening%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#good-news-is-happening%22%3EGood%20News%20Is%20Happening%3C/a%3E%3C/h2%3E%3Cp%3EF#%20tooling%20is%20not%20standing%20still.%20The%20F#%2010%20release,%20published%20with%20.NET%2010%20in%20November%202025,%20includes%20explicit%20performance%20and%20tooling%20work.%3C/p%3E%3Cp%3E%3Ca%20href=%22https://devblogs.microsoft.com/dotnet/introducing-fsharp-10/%22%3EIntroducing%20F#%2010%3C/a%3E%20says%20the%20release%20includes%20a%20type%20subsumption%20cache%20to%20accelerate%20type%20checking%20and%20improve%20IDE%20responsiveness,%20especially%20in%20projects%20with%20complex%20type%20hierarchies.%20It%20also%20describes%20parallel%20compilation%20work%20grouped%20under%20the%20%3Ccode%3EParallelCompilation%3C/code%3E%20project%20property,%20%3Ccode%3E--typecheck-only%3C/code%3E%20support%20for%20scripts,%20and%20ongoing%20F#%2011%20work%20on%20performance%20wins%20and%20tooling%20upgrades.%3C/p%3E%3Cp%3EThe%20F#%2010%20post%20also%20matters%20because%20it%20credits%20the%20people%20doing%20the%20work.%20It%20says%20F#%20is%20developed%20through%20collaboration%20between%20the%20.NET%20Foundation,%20F#%20Software%20Foundation,%20members,%20contributors,%20and%20Microsoft,%20then%20calls%20out%20community%20contributors%20for%20tooling,%20diagnostics,%20parser%20recovery,%20testing%20infrastructure,%20and%20performance%20improvements.%20It%20also%20recognizes%20%3Ca%20href=%22https://amplifyingfsharp.io/%22%3EAmplifying%20F#%3C/a%3E%20for%20supporting%20contributors.%3C/p%3E%3Cp%3EThat%20is%20the%20F#%20story%20in%20one%20paragraph:%20a%20serious%20compiler,%20a%20serious%20open%20process,%20and%20a%20community%20that%20keeps%20showing%20up.%3C/p%3E%3Ch2%20id=%22production-f-is-not-hypothetical%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#production-f-is-not-hypothetical%22%3EProduction%20F#%20Is%20Not%20Hypothetical%3C/a%3E%3C/h2%3E%3Cp%3EThe%20case%20for%20F#%20is%20not%20just%20taste.%20There%20are%20real%20production%20stories.%3C/p%3E%3Cp%3EThe%20official%20%3Ca%20href=%22https://fsharp.org/testimonials/%22%3EF#%20testimonials%3C/a%3E%20page%20includes%20companies%20and%20teams%20using%20F#%20in%20messaging%20infrastructure,%20public-records%20analysis,%20Microsoft%20Bing%20Ads%20ranking%20allocation%20and%20pricing,%20Microsoft%20Research%20biological%20computation,%20insurance%20calculation,%20anti-money-laundering,%20banking,%20health%20diagnostics,%20tax%20software,%20rules%20engines,%20genomics,%20satellite%20systems,%20and%20more.%3C/p%3E%3Cp%3EA%20few%20examples:%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://fsharp.org/testimonials/%22%3EMicrosoft%20Bing%20Ads%20Ranking%20Allocation%20and%20Pricing%3C/a%3E%20reported%20that%20around%2095%%20of%20the%20relevant%20project%20code%20was%20developed%20in%20F#.%3C/li%3E%3Cli%3E%3Ca%20href=%22https://fsharp.org/testimonials/%22%3EMicrosoft%20Research&#39;s%20Biological%20Computation%20group%3C/a%3E%20described%20F#%20as%20its%20&amp;quot;language%20of%20choice%20for%20scientific%20computing&amp;quot;.%3C/li%3E%3Cli%3E%3Ca%20href=%22https://fsharp.org/testimonials/%22%3EClearTax%3C/a%3E%20said%20it%20built%20a%20&amp;quot;whole%20product%20from%20the%20ground-up%20in%20F#&amp;quot;.%3C/li%3E%3Cli%3E%3Ca%20href=%22https://fsharp.org/testimonials/%22%3ECompositional%20IT%3C/a%3E%20reported%20a%20complex%20rules%20and%20data-transformation%20release%20across%2090+%20markets%20where%20&amp;quot;F#%20just%20works&amp;quot;.%3C/li%3E%3Cli%3E%3Ca%20href=%22https://www.codemag.com/Article/1611071/F-Microservices-A-Case-Study%22%3ECODE%20Magazine&#39;s%20Jet.com%20case%20study%3C/a%3E%20presented%20F#%20microservices%20as%20a%20&amp;quot;successful,%20real-world%20case&amp;quot;%20of%20functional%20programming%20in%20production.%3C/li%3E%3Cli%3EMicrosoft&#39;s%20own%20%3Ca%20href=%22https://devblogs.microsoft.com/dotnet/why-you-should-use-f/%22%3E&amp;quot;Why%20you%20should%20use%20F#&amp;quot;%3C/a%3E%20post%20called%20out%20that%20F#%20is%20used%20for%20&amp;quot;big%20things&amp;quot;,%20including%20%3Ca%20href=%22http://Jet.com%22%3EJet.com%3C/a%3E.%3C/li%3E%3Cli%3E%3Ca%20href=%22https://www.gresearch.com/news/going-15-percent-faster-with-graph-based-type-checking-part-two/%22%3EG-Research%3C/a%3E%20has%20publicly%20written%20about%20validating%20graph-based%20type-checking%20work%20against%20all%20F#%20projects%20in%20a%20large%20solution,%20then%20proving%20the%20same%20binary%20output%20with%20and%20without%20the%20feature%20flag.%3C/li%3E%3C/ul%3E%3Cp%3EThe%20wider%20community%20has%20the%20same%20lived%20experience:%3C/p%3E%3Cblockquote%3E%3Cp%3EI%20have%20a%20job%20writing%20F#%20(had%20no%20knowledge%20before%20I%20got%20it)%20in%20the%20UK.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/1ec75rn%22%3Er/fsharp,%20&amp;quot;FP%20languages%20amongst%20the%20highest%20paying%20ones%20according%20to%20the%20StackOverflow%20Survey%202024&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cblockquote%3E%3Cp%3EF#%20has%20been%20our%20primary%20language%20for%20around%206%20years%20now,%20at%20least%20for%20anything%20new.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/fsharp/comments/13m4n7f%22%3Er/fsharp,%20&amp;quot;Who&#39;s%20using%20F#?%20What%20are%20you%20using%20it%20for?&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cblockquote%3E%3Cp%3EMe,%20we,%20our%20company,%20in%20production.%3C/p%3E%3Cul%3E%3Cli%3E%3Ca%20href=%22https://www.reddit.com/r/dotnet/comments/13l6coy/question_whos_using_f_what_are_you_using_it_for/%22%3Er/dotnet,%20&amp;quot;Who&#39;s%20using%20F#?%20What%20are%20you%20using%20it%20for?&amp;quot;%3C/a%3E%3C/li%3E%3C/ul%3E%3C/blockquote%3E%3Cp%3EThose%20stories%20are%20not%20marketing%20theater.%20They%20are%20proof%20that%20F#%20is%20already%20carrying%20important%20work.%20Tooling%20should%20meet%20the%20language%20where%20it%20is%20actually%20used.%3C/p%3E%3Ch2%20id=%22what-first-class-means-in-sharplsp%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-first-class-means-in-sharplsp%22%3EWhat%20First-Class%20Means%20in%20SharpLsp%3C/a%3E%3C/h2%3E%3Cp%3ESharpLsp%20uses%20a%20Rust%20host%20process%20for%20shared%20LSP%20behavior%20and%20delegates%20semantic%20language%20work%20to%20compiler-backed%20sidecars:%3C/p%3E%3Cul%3E%3Cli%3EC#%20semantic%20requests%20go%20to%20a%20Roslyn%20sidecar.%3C/li%3E%3Cli%3EF#%20semantic%20requests%20go%20to%20an%20%3Ca%20href=%22https://fsharp.github.io/fsharp-compiler-docs/fcs/%22%3EFSharp.Compiler.Service%3C/a%3E%20sidecar.%3C/li%3E%3Cli%3EThe%20host%20owns%20routing,%20cancellation,%20workspace%20notifications,%20sidecar%20lifecycle,%20and%20editor%20protocol%20behavior.%3C/li%3E%3C/ul%3E%3Cp%3EThat%20structure%20is%20the%20point.%20F#%20gets%20the%20compiler%20service%20F#%20needs.%20C#%20gets%20Roslyn.%20The%20shared%20host%20handles%20the%20protocol,%20filesystem,%20editor,%20caching,%20cancellation,%20and%20lifecycle%20mechanics%20that%20should%20not%20be%20duplicated.%3C/p%3E%3Cp%3EFor%20SharpLsp,%20first-class%20F#%20means%20concrete%20product%20requirements:%3C/p%3E%3Cul%3E%3Cli%3EF#%20projects%20load%20through%20F#-aware%20project%20evaluation.%3C/li%3E%3Cli%3EF#%20diagnostics%20come%20from%20FSharp.Compiler.Service%20and%20F#%20analyzers.%3C/li%3E%3Cli%3EF#%20hover,%20completion,%20definition,%20references,%20rename,%20and%20code%20actions%20are%20tracked%20as%20real%20language%20features.%3C/li%3E%3Cli%3EF#%20Interactive%20workflows%20are%20exposed%20deliberately,%20not%20treated%20as%20optional%20extras.%3C/li%3E%3Cli%3E%3Ccode%3E.fs%3C/code%3E,%20%3Ccode%3E.fsi%3C/code%3E,%20and%20%3Ccode%3E.fsx%3C/code%3E%20behavior%20is%20tested%20separately.%3C/li%3E%3Cli%3EF#%20formatter%20integration%20respects%20Fantomas%20rather%20than%20copying%20C#%20formatting%20assumptions.%3C/li%3E%3Cli%3EF#%20lint%20and%20analyzer%20work%20has%20a%20first-class%20path%20through%20the%20server.%3C/li%3E%3Cli%3EMixed%20C#%20and%20F#%20solutions%20work%20without%20forcing%20F#%20into%20a%20C#%20project%20model.%3C/li%3E%3C/ul%3E%3Cp%3ESome%20of%20that%20is%20done.%20Some%20of%20it%20is%20in%20progress.%20The%20important%20architectural%20choice%20is%20already%20made:%20F#%20is%20not%20a%20side%20quest.%3C/p%3E%3Ch2%20id=%22shared-net-tooling-still-matters%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#shared-net-tooling-still-matters%22%3EShared%20.NET%20Tooling%20Still%20Matters%3C/a%3E%3C/h2%3E%3Cp%3EFirst-class%20does%20not%20mean%20isolated.%20C#%20and%20F#%20projects%20often%20live%20in%20the%20same%20solution.%20Developers%20still%20need%20one%20solution%20view,%20one%20build%20story,%20one%20debugger%20path,%20one%20profiler,%20and%20one%20package%20management%20surface.%3C/p%3E%3Cp%3EThe%20right%20model%20is%20shared%20infrastructure%20where%20the%20ecosystem%20is%20shared,%20and%20dedicated%20language%20services%20where%20correctness%20demands%20it.%3C/p%3E%3Cp%3EThat%20is%20why%20SharpLsp%20has%20one%20installed%20server%20and%20dedicated%20sidecars.%20The%20editor%20should%20not%20make%20developers%20pick%20between%20C#%20and%20F#%20quality.%20A%20.NET%20solution%20should%20feel%20like%20one%20solution,%20with%20each%20language%20getting%20the%20compiler%20intelligence%20it%20deserves.%3C/p%3E%3Ch2%20id=%22the-bar%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-bar%22%3EThe%20Bar%3C/a%3E%3C/h2%3E%3Cp%3EF#%20support%20is%20not%20complete%20until%20F#%20developers%20can%20use%20SharpLsp%20as%20daily%20tooling%20without%20feeling%20like%20guests%20in%20a%20C#%20product.%3C/p%3E%3Cp%3EThe%20F#%20community%20has%20already%20done%20its%20part.%20It%20built%20Ionide,%20FsAutoComplete,%20Fantomas,%20FSharpLint,%20Fable,%20FAKE,%20Paket,%20analyzers,%20documentation,%20talks,%20tutorials,%20and%20production%20systems.%20It%20has%20kept%20the%20language%20moving%20through%20open%20design,%20open%20implementation,%20and%20open%20community%20support.%3C/p%3E%3Cp%3ESharpLsp&#39;s%20job%20is%20to%20honor%20that%20work%20with%20architecture,%20not%20slogans.%3C/p%3E%3Cp%3EF#%20is%20a%20first-class%20.NET%20language.%20SharpLsp%20is%20building%20accordingly.%3C/p%3E</content>
    <summary>SharpLsp treats F# as a first-class .NET language because the F# community, compiler, tooling stack, and production success stories deserve tooling that is designed for F# from day one.</summary>
  </entry>
  <entry>
    <title>Diagnostic Accuracy: Errors You Can Trust</title>
    <link href="https://sharplsp.dev/blog/pull-diagnostics-without-phantom-errors/"/>
    <id>https://sharplsp.dev/blog/pull-diagnostics-without-phantom-errors/</id>
    <updated>2026-04-27T00:00:00Z</updated>
    <content type="html">https://sharplsp.dev/%3Cp%3EDiagnostics%20are%20the%20developer%20feedback%20loop.%20The%20Problems%20panel%20is%20the%20place%20developers%20look%20to%20understand%20whether%20their%20code%20is%20correct.%20If%20it%20shows%20errors%20that%20do%20not%20exist,%20developers%20start%20ignoring%20it.%20If%20it%20misses%20errors%20that%20will%20break%20the%20build,%20developers%20get%20surprised%20in%20CI.%20Both%20failure%20modes%20destroy%20trust%20in%20the%20tooling.%3C/p%3E%3Cp%3ESharpLsp&#39;s%20diagnostic%20architecture%20has%20a%20single%20goal:%20%3Cstrong%3Eaccuracy%3C/strong%3E.%20Every%20error%20the%20compiler%20or%20an%20analyzer%20would%20report%20must%20appear%20in%20the%20editor.%20Every%20error%20that%20would%20not%20appear%20in%20a%20real%20build%20must%20be%20absent.%20The%20Problems%20panel%20should%20reflect%20exactly%20what%20%3Ccode%3Edotnet%20build%3C/code%3E%20would%20tell%20you%20%E2%80%94%20no%20more,%20no%20less.%3C/p%3E%3Cp%3EThat%20sounds%20simple.%20In%20practice%20it%20requires%20careful%20engineering%20around%20workspace%20lifecycle,%20the%20LSP%20protocol,%20and%20how%20Roslyn&#39;s%20analysis%20pipeline%20works.%3C/p%3E%3Ch2%20id=%22what-real-errors-look-like-in-roslyn%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-real-errors-look-like-in-roslyn%22%3EWhat%20&amp;quot;Real&amp;quot;%20Errors%20Look%20Like%20in%20Roslyn%3C/a%3E%3C/h2%3E%3Cp%3EThe%20%3Ca%20href=%22https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/%22%3E.NET%20Compiler%20Platform%20(Roslyn)%3C/a%3E%20produces%20two%20broad%20categories%20of%20diagnostics,%20each%20with%20distinct%20prefixes%20and%20severity%20behaviors.%3C/p%3E%3Cp%3E%3Cstrong%3ECompiler%20diagnostics%3C/strong%3E%20carry%20a%20%3Ccode%3ECS%3C/code%3E%20prefix%20for%20C#%20and%20an%20%3Ccode%3EFS%3C/code%3E%20prefix%20for%20F#.%20These%20are%20the%20errors%20and%20warnings%20produced%20by%20the%20language%20compiler%20itself%20%E2%80%94%20type%20errors,%20missing%20members,%20syntax%20violations,%20unreachable%20code.%20A%20%3Ccode%3ECS0246%3C/code%3E%20means%20a%20type%20name%20could%20not%20be%20resolved.%20A%20%3Ccode%3ECS0019%3C/code%3E%20means%20an%20operator%20cannot%20be%20applied%20to%20the%20operand%20types.%20These%20diagnostics%20are%20authoritative:%20they%20reflect%20what%20the%20compiler%20knows%20about%20your%20code%20after%20full%20semantic%20analysis.%3C/p%3E%3Cp%3E%3Cstrong%3ERoslyn%20analyzer%20diagnostics%3C/strong%3E%20carry%20%3Ccode%3ECA%3C/code%3E%20(code%20quality)%20or%20%3Ccode%3EIDE%3C/code%3E%20(code%20style)%20prefixes%20and%20are%20documented%20in%20the%20%3Ca%20href=%22https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview%22%3E.NET%20code%20analysis%20overview%3C/a%3E.%20As%20Microsoft&#39;s%20documentation%20states:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Code%20analysis%20violations%20appear%20with%20the%20prefix%20&#39;CA&#39;%20or%20&#39;IDE&#39;%20to%20differentiate%20them%20from%20compiler%20errors.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3EAnalyzer%20diagnostics%20are%20%3Ca%20href=%22https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview#enable-additional-rules%22%3Econfigurable%20in%20severity%3C/a%3E%20%E2%80%94%20they%20can%20be%20suggestions,%20warnings,%20or%20errors.%20When%20a%20team%20sets%20an%20analyzer%20rule%20to%20%3Ccode%3Eerror%3C/code%3E%20severity%20%E2%80%94%20via%20%3Ccode%3E.editorconfig%3C/code%3E,%20a%20%3Ccode%3E&amp;lt;TreatWarningsAsErrors&amp;gt;%3C/code%3E%20property,%20or%20a%20%3Ccode%3E&amp;lt;AnalysisMode&amp;gt;%3C/code%3E%20configuration%20%E2%80%94%20those%20diagnostics%20will%20fail%20the%20build.%20They%20are%20not%20optional%20noise.%20They%20are%20build-blocking%20errors.%20SharpLsp%20must%20surface%20them%20with%20the%20same%20prominence%20as%20%3Ccode%3ECS%3C/code%3E%20errors,%20because%20from%20the%20project&#39;s%20perspective%20they%20are%20equivalent.%3C/p%3E%3Cp%3EThird-party%20analyzer%20packages%20%E2%80%94%20%3Ca%20href=%22https://www.nuget.org/packages/StyleCop.Analyzers/%22%3EStyleCop%3C/a%3E,%20%3Ca%20href=%22https://www.nuget.org/packages/Roslynator.Analyzers/%22%3ERoslynator%3C/a%3E,%20%3Ca%20href=%22https://www.nuget.org/packages/Meziantou.Analyzer/%22%3EMeziantou.Analyzer%3C/a%3E,%20%3Ca%20href=%22https://www.nuget.org/packages/SonarAnalyzer.CSharp/%22%3ESonarAnalyzer%3C/a%3E%20%E2%80%94%20slot%20into%20the%20same%20pipeline.%20Their%20diagnostics%20are%20processed%20by%20Roslyn&#39;s%20%3Ccode%3EDiagnosticAnalyzer%3C/code%3E%20infrastructure%20and%20reported%20with%20the%20same%20severity%20model.%20SharpLsp%20does%20not%20treat%20these%20as%20second-class.%20If%20a%20StyleCop%20rule%20is%20configured%20as%20an%20error%20in%20your%20project,%20it%20appears%20as%20an%20error%20in%20the%20Problems%20panel,%20because%20it%20would%20appear%20as%20an%20error%20in%20your%20build.%3C/p%3E%3Ch2%20id=%22the-source-of-false-errors%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-source-of-false-errors%22%3EThe%20Source%20of%20False%20Errors%3C/a%3E%3C/h2%3E%3Cp%3EThe%20enemy%20of%20diagnostic%20accuracy%20is%20premature%20assertion%20%E2%80%94%20showing%20a%20diagnostic%20before%20the%20workspace%20has%20the%20information%20needed%20to%20compute%20it%20correctly.%3C/p%3E%3Cp%3ELarge%20.NET%20solutions%20do%20not%20become%20semantically%20complete%20all%20at%20once.%20When%20a%20solution%20opens,%20several%20things%20must%20happen%20before%20Roslyn%20can%20produce%20authoritative%20answers:%3C/p%3E%3Col%3E%3Cli%3E%3Cp%3E%3Cstrong%3ENuGet%20restore%20must%20complete.%3C/strong%3E%20Roslyn&#39;s%20%3Ccode%3EMSBuildWorkspace%3C/code%3E%20relies%20on%20%3Ccode%3Eproject.assets.json%3C/code%3E%20to%20understand%20package%20references%20and%20their%20transitive%20closure.%20Before%20this%20file%20is%20current,%20type%20references%20from%20NuGet%20packages%20cannot%20be%20resolved.%20Any%20diagnostic%20computed%20in%20this%20window%20may%20report%20%3Ccode%3ECS0246%3C/code%3E%20for%20types%20that%20exist%20in%20packages%20%E2%80%94%20errors%20that%20vanish%20the%20moment%20restore%20finishes.%3C/p%3E%3C/li%3E%3Cli%3E%3Cp%3E%3Cstrong%3ESource%20generators%20must%20run.%3C/strong%3E%20%3Ca%20href=%22https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview%22%3ESource%20generators%3C/a%3E%20produce%20C#%20files%20at%20compile%20time.%20If%20the%20workspace%20produces%20diagnostics%20before%20generators%20have%20executed,%20references%20to%20generated%20types%20appear%20as%20undefined%20symbols%20%E2%80%94%20another%20category%20of%20errors%20that%20are%20not%20real.%3C/p%3E%3C/li%3E%3Cli%3E%3Cp%3E%3Cstrong%3EProject%20references%20must%20resolve.%3C/strong%3E%20In%20a%20multi-project%20solution,%20a%20project&#39;s%20type%20graph%20includes%20types%20defined%20in%20referenced%20projects.%20If%20Roslyn%20has%20not%20yet%20loaded%20a%20referenced%20project,%20cross-project%20symbol%20references%20look%20unresolved.%3C/p%3E%3C/li%3E%3C/ol%3E%3Cp%3EThe%20pattern%20is%20always%20the%20same:%20a%20language%20server%20that%20pushes%20diagnostics%20eagerly%20%E2%80%94%20before%20the%20workspace%20is%20ready%20%E2%80%94%20produces%20errors%20that%20are%20technically%20consistent%20with%20the%20incomplete%20state%20the%20workspace%20is%20in,%20but%20wrong%20relative%20to%20what%20the%20compiler%20would%20actually%20report.%20These%20are%20not%20bugs%20in%20the%20compiler.%20They%20are%20a%20timing%20problem:%20the%20server%20asserted%20too%20soon.%3C/p%3E%3Ch2%20id=%22the-lsp-317-pull-diagnostic-model%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-lsp-317-pull-diagnostic-model%22%3EThe%20LSP%203.17%20Pull%20Diagnostic%20Model%3C/a%3E%3C/h2%3E%3Cp%3ESharpLsp&#39;s%20solution%20to%20this%20timing%20problem%20is%20the%20%3Ca%20href=%22https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_diagnostic%22%3ELSP%203.17%20pull%20diagnostic%20model%3C/a%3E.%3C/p%3E%3Cp%3EIn%20the%20traditional%20push%20model,%20a%20language%20server%20sends%20%3Ccode%3EtextDocument/publishDiagnostics%3C/code%3E%20notifications%20whenever%20it%20decides%20diagnostics%20have%20changed.%20The%20server%20controls%20the%20timing.%20The%20editor%20receives%20whatever%20the%20server%20sends,%20whether%20or%20not%20the%20workspace%20is%20in%20a%20state%20to%20produce%20accurate%20results.%3C/p%3E%3Cp%3EThe%20pull%20model%20inverts%20this.%20The%20editor%20asks%20for%20diagnostics%20when%20it%20wants%20them,%20using%20two%20LSP%20endpoints:%3C/p%3E%3Cul%3E%3Cli%3E%3Cstrong%3E%3Ccode%3EtextDocument/diagnostic%3C/code%3E%3C/strong%3E%20%E2%80%94%20pulls%20diagnostics%20for%20a%20specific%20document%3C/li%3E%3Cli%3E%3Cstrong%3E%3Ccode%3Eworkspace/diagnostic%3C/code%3E%3C/strong%3E%20%E2%80%94%20pulls%20diagnostics%20for%20the%20entire%20workspace,%20allowing%20the%20editor%20to%20surface%20errors%20in%20files%20that%20are%20not%20currently%20open%3C/li%3E%3C/ul%3E%3Cp%3EThe%20server%20responds%20to%20each%20pull%20with%20a%20result%20that%20carries%20a%20%3Cstrong%3Eresult%20identifier%3C/strong%3E%20%E2%80%94%20a%20token%20representing%20the%20current%20state%20of%20the%20diagnostic%20set.%20If%20the%20editor%20pulls%20again%20and%20the%20workspace%20state%20has%20not%20changed,%20the%20server%20can%20respond%20with%20%3Ccode%3EDocumentDiagnosticReportKind.Unchanged%3C/code%3E,%20skipping%20redundant%20computation.%20This%20makes%20repeated%20pulls%20cheap%20for%20unchanged%20files%20in%20large%20solutions.%3C/p%3E%3Cp%3EWhen%20workspace%20state%20does%20change%20%E2%80%94%20a%20file%20is%20saved,%20a%20package%20is%20restored,%20a%20project%20reference%20is%20added%20%E2%80%94%20the%20server%20sends%20a%20%3Ccode%3Eworkspace/diagnostic/refresh%3C/code%3E%20notification.%20This%20is%20not%20a%20diagnostic%20payload.%20It%20is%20a%20signal%20to%20the%20editor%20that%20its%20cached%20results%20should%20be%20discarded%20and%20it%20should%20pull%20again.%20The%20editor%20controls%20the%20re-pull%20timing.%20The%20server%20cannot%20push%20stale%20results.%3C/p%3E%3Cp%3EThis%20design%20means%20SharpLsp%20never%20has%20to%20decide%20unilaterally%20&amp;quot;now%20is%20a%20good%20time%20to%20assert%20diagnostics.&amp;quot;%20It%20waits%20for%20the%20editor%20to%20ask.%20When%20asked,%20it%20either%20has%20a%20trustworthy%20answer%20(workspace%20is%20ready)%20or%20it%20says%20so%20honestly%20(workspace%20is%20still%20loading).%20It%20never%20invents%20errors%20to%20fill%20the%20gap.%3C/p%3E%3Ch2%20id=%22the-nuget-restore-gate%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-nuget-restore-gate%22%3EThe%20NuGet%20Restore%20Gate%3C/a%3E%3C/h2%3E%3Cp%3EThe%20most%20significant%20source%20of%20spurious%20CS0246%20errors%20in%20.NET%20tooling%20is%20a%20stale%20or%20missing%20%3Ccode%3Eproject.assets.json%3C/code%3E%20%E2%80%94%20the%20restore%20graph%20that%20tells%20the%20compiler%20where%20to%20find%20package%20assemblies.%3C/p%3E%3Cp%3EBefore%20SharpLsp%20opens%20a%20solution%20in%20%3Ccode%3EMSBuildWorkspace%3C/code%3E,%20it%20checks%20restore%20state.%20If%20packages%20are%20not%20restored,%20it%20runs%20%3Ccode%3Edotnet%20restore%3C/code%3E%20and%20waits%20for%20completion%20before%20beginning%20workspace%20load.%20The%20diagnostic%20pipeline%20does%20not%20open%20until%20the%20workspace%20is%20in%20a%20state%20where%20package%20references%20can%20resolve.%3C/p%3E%3Cp%3EThis%20adds%20latency%20to%20the%20first-open%20experience%20%E2%80%94%20typically%20a%20few%20seconds%20for%20a%20solution%20that%20has%20never%20been%20restored%20in%20this%20environment.%20The%20tradeoff%20is%20that%20every%20diagnostic%20the%20editor%20receives%20after%20that%20gate%20has%20passed%20is%20computed%20against%20a%20workspace%20that%20knows%20its%20full%20package%20graph.%20There%20are%20no%20CS0246%20errors%20for%20types%20that%20exist%20in%20packages.%20There%20are%20no%20red%20squiggles%20that%20disappear%20thirty%20seconds%20later.%3C/p%3E%3Ch2%20id=%22solution-wide-diagnostics%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#solution-wide-diagnostics%22%3ESolution-Wide%20Diagnostics%3C/a%3E%3C/h2%3E%3Cp%3EAccurate%20diagnostics%20for%20open%20files%20alone%20is%20not%20sufficient.%20Real%20build%20failures%20often%20originate%20in%20files%20that%20are%20not%20open%20in%20the%20editor.%20A%20breaking%20change%20to%20a%20shared%20type%20causes%20errors%20across%20every%20file%20that%20uses%20it%20%E2%80%94%20most%20of%20which%20may%20be%20closed.%3C/p%3E%3Cp%3ESharpLsp%20uses%20%3Ccode%3Eworkspace/diagnostic%3C/code%3E%20to%20provide%20solution-wide%20error%20coverage.%20When%20the%20editor%20requests%20a%20workspace%20diagnostic%20report,%20SharpLsp%20queries%20Roslyn%20for%20diagnostics%20across%20all%20documents%20in%20all%20loaded%20projects.%20The%20result%20covers:%3C/p%3E%3Cul%3E%3Cli%3EAll%20%3Ccode%3ECS%3C/code%3E/%3Ccode%3EFS%3C/code%3E%20compiler%20errors%20in%20any%20source%20file%3C/li%3E%3Cli%3EAll%20%3Ccode%3ECA%3C/code%3E%20and%20%3Ccode%3EIDE%3C/code%3E%20analyzer%20diagnostics%20at%20%3Ccode%3Eerror%3C/code%3E%20or%20%3Ccode%3Ewarning%3C/code%3E%20severity,%20from%20both%20the%20built-in%20SDK%20analyzers%20and%20any%20third-party%20analyzer%20packages%20referenced%20by%20the%20project%3C/li%3E%3Cli%3EAny%20diagnostics%20produced%20by%20source%20generators%20whose%20output%20fails%20to%20compile%3C/li%3E%3C/ul%3E%3Cp%3EThe%20result%20does%20%3Cstrong%3Enot%3C/strong%3E%20include:%3C/p%3E%3Cul%3E%3Cli%3EDiagnostics%20computed%20against%20an%20incomplete%20workspace%20state%3C/li%3E%3Cli%3EAnalyzer%20suggestions%20that%20are%20configured%20below%20%3Ccode%3Ewarning%3C/code%3E%20severity%20and%20would%20not%20appear%20in%20a%20build%3C/li%3E%3Cli%3EErrors%20in%20files%20excluded%20from%20the%20project%20graph%3C/li%3E%3C/ul%3E%3Cp%3EThis%20mirrors%20what%20%3Ccode%3Edotnet%20build%3C/code%3E%20reports.%20The%20Problems%20panel%20shows%20what%20matters.%20It%20does%20not%20show%20noise.%3C/p%3E%3Cp%3EWhen%20a%20file%20changes,%20the%20sidecar%20computes%20updated%20diagnostics%20for%20that%20document%20and%20sends%20a%20%3Ccode%3Eworkspace/diagnostic/refresh%3C/code%3E.%20The%20editor%20pulls%20the%20updated%20workspace%20report.%20Files%20whose%20result%20identifiers%20have%20not%20changed%20are%20skipped%20by%20the%20server%20%E2%80%94%20the%20round-trip%20cost%20is%20proportional%20to%20what%20actually%20changed.%3C/p%3E%3Ch2%20id=%22f-diagnostics%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#f-diagnostics%22%3EF#%20Diagnostics%3C/a%3E%3C/h2%3E%3Cp%3EThe%20F#%20sidecar%20uses%20%3Ca%20href=%22https://fsharp.github.io/fsharp-compiler-docs/%22%3EFSharp.Compiler.Service%3C/a%3E%20to%20produce%20diagnostics%20via%20%3Ccode%3EFSharpChecker%3C/code%3E.%20FCS%20diagnostics%20carry%20%3Ccode%3EFS%3C/code%3E%20prefixes%20and%20reflect%20the%20full%20F#%20type%20checker&#39;s%20view%20of%20the%20project%20%E2%80%94%20including%20discriminated%20union%20exhaustiveness,%20missing%20interface%20implementations,%20unused%20bindings%20(%3Ccode%3EFS0026%3C/code%3E),%20and%20partial%20active%20patterns.%3C/p%3E%3Cp%3E%3Ca%20href=%22https://github.com/fsprojects/FSharpLint%22%3EFSharpLint%3C/a%3E%20provides%20the%20analyzer%20layer%20for%20F#,%20with%20configurable%20rule%20severity.%20Lint%20errors%20configured%20as%20build-blocking%20are%20surfaced%20with%20the%20same%20treatment%20as%20Roslyn%20%3Ccode%3ECA%3C/code%3E%20errors%20%E2%80%94%20they%20appear%20in%20the%20Problems%20panel%20and%20are%20not%20filtered.%3C/p%3E%3Cp%3EF#%20file%20ordering%20in%20%3Ccode%3E.fsproj%3C/code%3E%20matters%20for%20compilation.%20FCS%20will%20report%20errors%20for%20forward%20references%20that%20occur%20because%20files%20are%20in%20the%20wrong%20order.%20SharpLsp%20surfaces%20these%20as%20real%20diagnostics%20%E2%80%94%20they%20are%20real%20build%20errors%20%E2%80%94%20while%20flagging%20the%20ordering%20source%20so%20developers%20understand%20the%20fix.%3C/p%3E%3Ch2%20id=%22what-the-problems-panel-should-tell-you%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-the-problems-panel-should-tell-you%22%3EWhat%20the%20Problems%20Panel%20Should%20Tell%20You%3C/a%3E%3C/h2%3E%3Cp%3EThe%20goal%20SharpLsp%20is%20building%20toward%20is%20a%20Problems%20panel%20you%20can%20treat%20as%20a%20build%20oracle.%20Before%20you%20commit.%20Before%20you%20push.%20Before%20CI%20runs.%20If%20the%20Problems%20panel%20is%20empty,%20the%20build%20passes.%20If%20it%20has%20errors,%20the%20build%20fails%20for%20exactly%20those%20reasons.%3C/p%3E%3Cp%3EThis%20requires%20three%20things%20working%20together:%3C/p%3E%3Col%3E%3Cli%3E%3Cstrong%3EAccuracy%20on%20first%20display%3C/strong%3E%20%E2%80%94%20the%20NuGet%20restore%20gate%20ensures%20the%20workspace%20is%20ready%20before%20diagnostics%20flow%3C/li%3E%3Cli%3E%3Cstrong%3EComplete%20coverage%3C/strong%3E%20%E2%80%94%20workspace%20diagnostics%20cover%20every%20file,%20not%20just%20open%20ones,%20and%20include%20all%20analyzer%20severities%20that%20would%20fail%20a%20build%3C/li%3E%3Cli%3E%3Cstrong%3EAccurate%20invalidation%3C/strong%3E%20%E2%80%94%20%3Ccode%3Eworkspace/diagnostic/refresh%3C/code%3E%20keeps%20the%20editor%20in%20sync%20with%20reality%20as%20files%20change,%20without%20asserting%20prematurely%3C/li%3E%3C/ol%3E%3Cp%3EA%20diagnostics%20panel%20that%20earns%20trust%20is%20one%20that%20developers%20stop%20second-guessing.%20That%20is%20the%20target.%3C/p%3E</content>
    <summary>SharpLsp uses LSP 3.17 pull diagnostics to deliver solution-wide error accuracy — showing every real Roslyn and analyzer error, and nothing that isn&#39;t real.</summary>
  </entry>
  <entry>
    <title>Why .NET Needs an Editor-Agnostic LSP</title>
    <link href="https://sharplsp.dev/blog/editor-agnostic-dotnet-lsp/"/>
    <id>https://sharplsp.dev/blog/editor-agnostic-dotnet-lsp/</id>
    <updated>2026-04-28T00:00:00Z</updated>
    <content type="html">https://sharplsp.dev/%3Cp%3ESharpLsp%20is%20an%20open-source%20.NET%20language%20server%20for%20C#%20and%20F#.%20The%20point%20is%20not%20to%20make%20one%20more%20VS%20Code%20extension.%20The%20point%20is%20to%20make%20the%20.NET%20development%20experience%20portable%20across%20every%20editor%20that%20can%20speak%20the%20%3Ca%20href=%22https://microsoft.github.io/language-server-protocol/%22%3ELanguage%20Server%20Protocol%3C/a%3E%20%E2%80%94%20and%20to%20make%20it%20genuinely%20competitive%20with%20the%20best%20tooling%20on%20any%20platform.%3C/p%3E%3Cp%3EThat%20goal%20matters%20more%20than%20ever,%20because%20right%20now%20every%20option%20.NET%20developers%20have%20comes%20with%20a%20serious%20catch.%3C/p%3E%3Ch2%20id=%22visual-studio-is-windows-only-full-stop%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#visual-studio-is-windows-only-full-stop%22%3EVisual%20Studio%20Is%20Windows-Only.%20Full%20Stop.%3C/a%3E%3C/h2%3E%3Cp%3EVisual%20Studio%20is%20the%20gold%20standard%20for%20C#%20tooling.%20Roslyn%20integration,%20a%20world-class%20profiler,%20XAML%20designer,%20Test%20Explorer,%20Edit%20and%20Continue%20%E2%80%94%20it%20is%20the%20benchmark%20everything%20else%20is%20measured%20against.%20And%20it%20runs%20exclusively%20on%20Windows.%3C/p%3E%3Cp%3EMicrosoft%20confirmed%20this%20definitively%20in%20August%202024%20when%20they%20%3Ca%20href=%22https://devblogs.microsoft.com/visualstudio/visual-studio-for-mac-retirement-announcement/%22%3Eretired%20Visual%20Studio%20for%20Mac%3C/a%3E.%20Their%20recommended%20path%20for%20Mac%20developers%20was%20either%20C#%20Dev%20Kit%20for%20VS%20Code,%20or%20%E2%80%94%20and%20this%20is%20the%20telling%20part%20%E2%80%94%20%3Cstrong%3Erunning%20full%20Windows%20Visual%20Studio%20inside%20a%20virtual%20machine%3C/strong%3E:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Visual%20Studio%20IDE%20running%20on%20Windows%20in%20a%20VM%20on%20Mac:%20This%20option%20will%20cover%20the%20broadest%20IDE%20needs%20such%20as%20legacy%20project%20support%20for%20Xamarin,%20F#,%20and%20remote%20development%20experiences.&amp;quot;%3C/p%3E%3C/blockquote%3E%3Cp%3ERead%20that%20again.%20The%20official%20Microsoft%20recommendation%20for%20F#%20developers%20on%20Mac%20is%20to%20run%20a%20Windows%20VM.%20That%20is%20not%20a%20cross-platform%20story.%20That%20is%20a%20concession%20that%20Windows%20is%20the%20platform%20and%20everything%20else%20is%20a%20workaround.%3C/p%3E%3Ch2%20id=%22c-dev-kit-is-not-a-replacement%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#c-dev-kit-is-not-a-replacement%22%3EC#%20Dev%20Kit%20Is%20Not%20a%20Replacement%3C/a%3E%3C/h2%3E%3Cp%3EWhen%20Microsoft%20retired%20Visual%20Studio%20for%20Mac,%20they%20pointed%20developers%20at%20%3Ca%20href=%22https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit%22%3EC#%20Dev%20Kit%3C/a%3E%20as%20the%20alternative.%20But%20the%20community%20verdict%20has%20not%20been%20kind.%3C/p%3E%3Cp%3EC#%20Dev%20Kit%20currently%20has%20a%20%3Cstrong%3E%3Ca%20href=%22https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit%22%3Elow%20user%20rating%3C/a%3E%20on%20the%20VS%20Marketplace%3C/strong%3E%20%E2%80%94%20from%20Microsoft&#39;s%20own%20first-party%20extension.%20Recent%20reviews%20tell%20the%20story:%3C/p%3E%3Cblockquote%3E%3Cp%3E&amp;quot;That%20just%20not%20works%20out%20of%20the%20box%20or%20after%20basic%20tinkering.%20Especially%20on%20macOS%20or%20Linux...%20Connection%20to%20LSP%20server%20just%20crashes%20and%20throws%20errors.&amp;quot;%20%E2%80%94%20DKchshv,%20March%202026%3C/p%3E%3C/blockquote%3E%3Cblockquote%3E%3Cp%3E&amp;quot;It%20can&#39;t%20find%20installed%20.Net%20runtimes.%20Isn&#39;t%20this%20the%20very%20first%20thing%20it%20was%20supposed%20to%20do?&amp;quot;%20%E2%80%94%20Emre%20G%C3%B6n%C3%BClta%C5%9F,%20February%202026%3C/p%3E%3C/blockquote%3E%3Cblockquote%3E%3Cp%3E&amp;quot;Installing%20package%20&#39;Language%20server%20for%20Roslyn%20Copilot%20integration&#39;.%20I%20did%20not%20ask%20for%20Copilot%20Integration.%20I%20do%20not%20want%20Copilot%20Integration.%20I%20was%20not%20asked%20if%20I%20wanted%20to%20opt-in.%20I%20am%20not%20presented%20with%20any%20option%20to%20disable%20it.%20Disgusting%20business%20practice.&amp;quot;%20%E2%80%94%20Matt%20Kaczmarek,%20April%202026%3C/p%3E%3C/blockquote%3E%3Cp%3EAnd%20then%20there%20is%20the%20licensing.%20C#%20Dev%20Kit%20is%20%3Ca%20href=%22https://marketplace.visualstudio.com/items/ms-dotnettools.csdevkit/license%22%3Enot%20free%20for%20enterprise%20teams%3C/a%3E.%20Any%20organisation%20with%20more%20than%20250%20users%20or%20over%20$1%20million%20in%20annual%20revenue%20is%20classified%20as%20an%20&amp;quot;Enterprise&amp;quot;%20and%20%3Cstrong%3Ecannot%20use%20C#%20Dev%20Kit%20to%20develop%20commercial%20applications%20without%20a%20paid%20Visual%20Studio%20subscription%3C/strong%3E.%20An%20open-source%20developer%20gets%20it%20for%20free.%20A%20commercial%20team%20does%20not.%3C/p%3E%3Cp%3EBeyond%20reliability%20and%20licensing,%20the%20feature%20gap%20is%20real.%20C#%20Dev%20Kit%20has%20no%20CPU%20profiler.%20No%20memory%20profiler.%20No%20performance%20analysis%20tooling%20of%20any%20kind.%20In%20Visual%20Studio%20these%20are%20core%20IDE%20features.%20In%20C#%20Dev%20Kit%20they%20simply%20do%20not%20exist.%3C/p%3E%3Cp%3EWhen%20the%20roadmap%20announcement%20for%20the%20new%20LSP-based%20extension%20landed%20on%20GitHub%20in%202022,%20the%20community%20made%20its%20feelings%20known:%20%3Ca%20href=%22https://github.com/dotnet/vscode-csharp/issues/5276%22%3E%3Cstrong%3E1,035%20thumbs-down%20reactions%3C/strong%3E%3C/a%3E%20%E2%80%94%20the%20most%20negative%20reception%20of%20any%20announcement%20in%20the%20repository&#39;s%20history%20%E2%80%94%20after%20Microsoft%20revealed%20the%20new%20host%20component%20would%20include%20closed-source%20pieces.%20The%20anger%20was%20not%20irrational.%20Developers%20who%20had%20built%20their%20workflows%20on%20OmniSharp,%20an%20open-source%20project,%20were%20being%20told%20the%20replacement%20would%20mix%20in%20proprietary%20components%20they%20had%20no%20visibility%20into.%3C/p%3E%3Ch2%20id=%22rider-is-good--but-it-is-a-different-world%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#rider-is-good--but-it-is-a-different-world%22%3ERider%20Is%20Good%20%E2%80%94%20But%20It%20Is%20a%20Different%20World%3C/a%3E%3C/h2%3E%3Cp%3EJetBrains%20Rider%20is%20a%20serious%20IDE.%20Excellent%20F#%20support,%20cross-platform,%20real%20profiler,%20deep%20Roslyn%20integration.%20If%20you%20are%20comfortable%20with%20IntelliJ-style%20IDEs%20and%20willing%20to%20pay%20for%20a%20subscription,%20Rider%20is%20a%20genuine%20option.%3C/p%3E%3Cp%3EBut%20Rider%20is%20a%20completely%20different%20development%20environment%20from%20VS%20Code.%20Teams%20that%20mix%20editors%20%E2%80%94%20some%20members%20on%20VS%20Code,%20some%20on%20Neovim,%20some%20on%20Zed%20%E2%80%94%20cannot%20share%20a%20Rider-based%20workflow.%20Rider&#39;s%20.NET%20intelligence%20lives%20inside%20Rider.%20It%20does%20not%20expose%20a%20standard%20LSP%20server%20that%20other%20editors%20can%20consume.%20If%20you%20leave%20Rider,%20you%20leave%20its%20tooling%20behind%20entirely.%3C/p%3E%3Ch2%20id=%22f-is-treated-as-a-second-class-citizen%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#f-is-treated-as-a-second-class-citizen%22%3EF#%20Is%20Treated%20as%20a%20Second-Class%20Citizen%3C/a%3E%3C/h2%3E%3Cp%3EF#%20is%20a%20world-class%20language%20for%20line-of-business%20applications.%20Strong%20typing,%20algebraic%20data%20types,%20computation%20expressions,%20and%20a%20compiler%20that%20catches%20an%20enormous%20class%20of%20bugs%20before%20they%20reach%20production.%20Enterprises%20building%20financial%20systems,%20data%20pipelines,%20and%20domain-heavy%20applications%20have%20excellent%20reasons%20to%20reach%20for%20F#.%3C/p%3E%3Cp%3EThe%20tooling%20support%20tells%20a%20different%20story.%3C/p%3E%3Cp%3EVisual%20Studio&#39;s%20F#%20support%20trails%20C#%20by%20years.%20Rider%20does%20better.%20Ionide%20for%20VS%20Code%20is%20a%20community-maintained%20extension%20doing%20serious%20work%20with%20real%20constraints.%20But%20there%20is%20no%20story%20%E2%80%94%20from%20Microsoft%20or%20anyone%20else%20%E2%80%94%20that%20puts%20F#%20tooling%20on%20equal%20footing%20with%20C#%20across%20all%20editors.%20F#%20is%20always%20the%20afterthought,%20the%20bolt-on,%20the%20feature%20that%20gets%20deferred%20when%20the%20C#%20roadmap%20fills%20up.%3C/p%3E%3Cp%3EMicrosoft&#39;s%20own%20retirement%20announcement%20acknowledged%20this%20plainly.%20When%20they%20listed%20what%20Visual%20Studio%20for%20Mac%20would%20lose,%20F#%20was%20called%20out%20specifically%20as%20a%20reason%20to%20run%20a%20Windows%20VM%20instead.%3C/p%3E%3Ch2%20id=%22the-platform-problem%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-platform-problem%22%3EThe%20Platform%20Problem%3C/a%3E%3C/h2%3E%3Cp%3EWhat%20all%20of%20this%20adds%20up%20to%20is%20a%20fractured%20.NET%20developer%20experience:%3C/p%3E%3Cul%3E%3Cli%3E%3Cstrong%3EWindows%3C/strong%3E:%20Use%20Visual%20Studio.%20Best-in-class%20tooling,%20but%20platform-locked.%3C/li%3E%3Cli%3E%3Cstrong%3EmacOS/Linux%20with%20VS%20Code%3C/strong%3E:%20Use%20C#%20Dev%20Kit,%20accept%20the%20reliability%20problems,%20accept%20the%20licensing%20constraints,%20accept%20no%20profiler,%20and%20accept%20that%20F#%20is%20secondary.%3C/li%3E%3Cli%3E%3Cstrong%3EmacOS/Linux%20wanting%20full%20tooling%3C/strong%3E:%20Use%20Rider,%20accept%20the%20subscription%20cost%20and%20that%20it&#39;s%20a%20walled%20ecosystem.%3C/li%3E%3Cli%3E%3Cstrong%3ENeovim,%20Helix,%20Zed,%20Emacs%3C/strong%3E:%20Accept%20whatever%20the%20community%20has%20managed%20to%20wire%20together%20from%20OmniSharp%20or%20clangd-inspired%20setups,%20because%20no%20official%20server%20targets%20you.%3C/li%3E%3C/ul%3E%3Cp%3ENo%20single%20open-source,%20cross-platform,%20editor-agnostic%20.NET%20language%20server%20exists%20that%20delivers%20the%20full%20picture.%3C/p%3E%3Ch2%20id=%22what-sharplsp-is-building%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-sharplsp-is-building%22%3EWhat%20SharpLsp%20Is%20Building%3C/a%3E%3C/h2%3E%3Cp%3ESharpLsp%20is%20built%20around%20one%20installed%20%3Ccode%3Esharplsp%3C/code%3E%20binary.%20Editor%20clients%20find%20it%20on%20%3Ccode%3EPATH%3C/code%3E%20and%20launch%20it%20over%20standard%20input/output.%20The%20same%20server%20handles%20C#,%20F#,%20solution%20discovery,%20semantic%20requests,%20diagnostics,%20and%20custom%20SharpLsp%20requests.%3C/p%3E%3Cp%3EThe%20architecture%20is%20deliberately%20split:%3C/p%3E%3Cul%3E%3Cli%3EThe%20%3Cstrong%3ERust%20host%3C/strong%3E%20owns%20the%20LSP%20connection,%20virtual%20file%20system,%20request%20routing,%20tree-sitter%20syntax%20work,%20and%20sidecar%20lifecycle.%3C/li%3E%3Cli%3EThe%20%3Cstrong%3EC#%20sidecar%3C/strong%3E%20hosts%20%3Ca%20href=%22https://github.com/dotnet/roslyn%22%3ERoslyn%3C/a%3E%20for%20semantic%20C#%20features.%3C/li%3E%3Cli%3EThe%20%3Cstrong%3EF#%20sidecar%3C/strong%3E%20hosts%20%3Ca%20href=%22https://fsharp.github.io/fsharp-compiler-docs/%22%3EFSharp.Compiler.Service%3C/a%3E%20for%20semantic%20F#%20features.%3C/li%3E%3Cli%3E%3Cstrong%3EF#%20is%20not%20a%20bolt-on.%3C/strong%3E%20F#%20features%20are%20built%20ahead%20of%20C#%20features%20where%20we%20can,%20and%20F#%20is%20a%20first-class%20target%20from%20day%20one.%3C/li%3E%3C/ul%3E%3Cp%3EThis%20is%20why%20the%20VS%20Code%20extension%20can%20provide%20a%20Solution%20Explorer%20and%20profiler%20view%20while%20the%20same%20%3Ccode%3Esharplsp%3C/code%3E%20can%20still%20serve%20editors%20that%20only%20support%20standard%20LSP%20capabilities.%3C/p%3E%3Cp%3EThe%20alpha%20is%20focused%20on%20making%20the%20VS%20Code%20path%20solid%20first%20%E2%80%94%20that%20is%20the%20right%20proving%20ground.%20The%20long-term%20target%20is%20one%20open-source%20.NET%20tooling%20stack,%20one%20server,%20every%20editor,%20with%20a%20profiler.%3C/p%3E%3Ch2%20id=%22what-this-looks-like-in-practice%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#what-this-looks-like-in-practice%22%3EWhat%20This%20Looks%20Like%20in%20Practice%3C/a%3E%3C/h2%3E%3Cp%3EAn%20editor-agnostic%20.NET%20LSP%20means:%3C/p%3E%3Cul%3E%3Cli%3E%3Cstrong%3EC#%20and%20F#%20language%20intelligence%3C/strong%3E%20from%20the%20same%20installed%20server,%20on%20macOS,%20Linux,%20and%20Windows,%20with%20no%20VM%20required%3C/li%3E%3Cli%3E%3Cstrong%3ENo%20per-seat%20licensing.%3C/strong%3E%20Open%20source.%20No%20Enterprise%20carve-outs.%3C/li%3E%3Cli%3E%3Cstrong%3EA%20profiler%20that%20works%3C/strong%3E%20%E2%80%94%20not%20locked%20inside%20Visual%20Studio%20or%20behind%20a%20Rider%20subscription%3C/li%3E%3Cli%3E%3Cstrong%3EConsistent%20diagnostics%20and%20navigation%20semantics%3C/strong%3E%20whether%20you%20are%20in%20VS%20Code,%20Zed,%20Neovim,%20or%20Helix%3C/li%3E%3Cli%3E%3Cstrong%3EF#%20treated%20as%20the%20language%20it%20is%3C/strong%3E%20%E2%80%94%20not%20deferred%20until%20after%20C#%20is%20&amp;quot;done&amp;quot;%3C/li%3E%3C/ul%3E%3Cp%3EThe%20.NET%20ecosystem%20is%20too%20good%20to%20be%20held%20hostage%20to%20Windows,%20or%20to%20a%20low-rated%20first-party%20extension,%20or%20to%20a%20single%20commercial%20IDE%20vendor.%3C/p%3E%3Ch2%20id=%22the-standard-is-simple%22%20tabindex=%22-1%22%3E%3Ca%20class=%22header-anchor%22%20href=%22#the-standard-is-simple%22%3EThe%20Standard%20Is%20Simple%3C/a%3E%3C/h2%3E%3Cp%3ESharpLsp%20should%20be%20judged%20by%20whether%20it%20makes%20real%20.NET%20work%20better:%20opening%20a%20solution,%20navigating%20code,%20fixing%20errors,%20managing%20packages,%20profiling%20a%20running%20process,%20and%20debugging%20%E2%80%94%20without%20being%20forced%20into%20a%20proprietary%20toolchain%20or%20a%20Windows%20VM.%3C/p%3E%3Cp%3EThe%20editor%20should%20be%20a%20preference.%20The%20language%20tooling%20should%20be%20infrastructure.%3C/p%3E</content>
    <summary>SharpLsp is building an open-source .NET LSP for C# and F# so language tooling can work across VS Code, Zed, Neovim, Helix, Emacs, Rider, and more.</summary>
  </entry>
</feed>
