Symptom
F# completion never shows the (open Ns) hint that tells the user a completion will insert an open. C# shows the equivalent (import) ns. The code to render it exists but cannot execute.
Root cause
src/sidecars/SharpLsp.Sidecar.FSharp/FSharpCompletion.fs — getCompletions calls GetDeclarationListInfo with getAllSymbols = fun () -> []. With no symbol source, FCS never populates NamespaceToOpen, so it is always None and detailFor:57 is unreachable.
The same root cause leaves detailFor:51 (_ -> "Keyword") dead: no keyword items are returned either.
Fix direction
Supply a real getAllSymbols so FCS can offer unopened-namespace completions, then verify NamespaceToOpen reaches detailFor. Note this is the expensive path in FCS — it should be measured against the completion budget in CLAUDE.md (<100ms p50, <200ms p95) before landing.
Why this matters
This is a missing feature rather than only missing coverage, and it is exactly the shape CLAUDE.md aim #2 forbids: C# has the affordance, F# does not.
Provenance
Found while raising F# sidecar coverage for PR #218. Two lines that looked like dead code turned out to be a feature that cannot run.
Symptom
F# completion never shows the
(open Ns)hint that tells the user a completion will insert anopen. C# shows the equivalent(import) ns. The code to render it exists but cannot execute.Root cause
src/sidecars/SharpLsp.Sidecar.FSharp/FSharpCompletion.fs—getCompletionscallsGetDeclarationListInfowithgetAllSymbols = fun () -> []. With no symbol source, FCS never populatesNamespaceToOpen, so it is alwaysNoneanddetailFor:57is unreachable.The same root cause leaves
detailFor:51(_ -> "Keyword") dead: no keyword items are returned either.Fix direction
Supply a real
getAllSymbolsso FCS can offer unopened-namespace completions, then verifyNamespaceToOpenreachesdetailFor. Note this is the expensive path in FCS — it should be measured against the completion budget in CLAUDE.md (<100ms p50, <200ms p95) before landing.Why this matters
This is a missing feature rather than only missing coverage, and it is exactly the shape CLAUDE.md aim #2 forbids: C# has the affordance, F# does not.
Provenance
Found while raising F# sidecar coverage for PR #218. Two lines that looked like dead code turned out to be a feature that cannot run.