{"record":{"id":"ed778bcb87060c11","repo":"microsoft/typescript-go","slug":"failed-to-refresh-code-lens-w","errorCode":null,"errorMessage":"failed to refresh code lens: %w","messagePattern":"failed to refresh code lens: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"info","filePath":"internal/lsp/server.go","lineNumber":363,"sourceCode":"\nfunc (s *Server) RefreshInlayHints(ctx context.Context) error {\n\tif !s.clientCapabilities.Workspace.InlayHint.RefreshSupport {\n\t\treturn nil\n\t}\n\n\tif err := sendClientRequestFireAndForget(s, lsproto.WorkspaceInlayHintRefreshInfo, lsproto.NoParams{}); err != nil {\n\t\treturn fmt.Errorf(\"failed to refresh inlay hints: %w\", err)\n\t}\n\treturn nil\n}\n\nfunc (s *Server) RefreshCodeLens(ctx context.Context) error {\n\tif !s.clientCapabilities.Workspace.CodeLens.RefreshSupport {\n\t\treturn nil\n\t}\n\n\tif err := sendClientRequestFireAndForget(s, lsproto.WorkspaceCodeLensRefreshInfo, lsproto.NoParams{}); err != nil {\n\t\treturn fmt.Errorf(\"failed to refresh code lens: %w\", err)\n\t}\n\treturn nil\n}\n\n// ProgressStart implements project.Client.\nfunc (s *Server) ProgressStart(message *diagnostics.Message, args ...any) {\n\tif s.projectProgress != nil {\n\t\ts.projectProgress.start(message, args...)\n\t}\n}\n\n// ProgressFinish implements project.Client.\nfunc (s *Server) ProgressFinish(message *diagnostics.Message, args ...any) {\n\tif s.projectProgress != nil {\n\t\ts.projectProgress.finish(message, args...)\n\t}\n}\n","sourceCodeStart":345,"sourceCodeEnd":381,"githubUrl":"https://github.com/microsoft/typescript-go/blob/1bcfa18d79a3be41772223d5c05dfe4480e614ff/internal/lsp/server.go#L345-L381","documentation":"RefreshCodeLens (server.go:357-366): the client advertised codeLens refresh support, but the fire-and-forget workspace/codeLens/refresh request could not be queued to the outgoing writer. Identical failure mode to the inlay-hint refresh: local send failure only, never a client response error, because no response is awaited.","triggerScenarios":"Outgoing queue closed, writer failed, or background context canceled while a project reload or config change triggers a code lens refresh; commonly interleaved with session close.","commonSituations":"Shutdown races; broken pipe after an editor crash; tests tearing down in-memory connections with pending refreshes.","solutions":["Treat as advisory: log-and-continue; the client re-requests code lenses on next interaction.","During teardown, filter these out when the server/context is shutting down.","If persistent mid-session, investigate the underlying writer error that appears alongside it."],"exampleFix":"// before\nif err := client.RefreshCodeLens(ctx); err != nil { return fmt.Errorf(\"reload: %w\", err) }\n// after\nif err := client.RefreshCodeLens(ctx); err != nil {\n    log.Printf(\"code lens refresh skipped: %v\", err)\n}","handlingStrategy":"try-catch","validationCode":"if clientCaps.Workspace.CodeLens.RefreshSupport && ctx.Err() == nil {\n    if err := client.RefreshCodeLens(ctx); err != nil {\n        log.Printf(\"code lens refresh skipped: %v\", err)\n    }\n}","typeGuard":"func codeLensRefreshSafe(caps lsproto.ResolvedClientCapabilities, ctx context.Context) bool {\n    return caps.Workspace.CodeLens.RefreshSupport && ctx.Err() == nil\n}","tryCatchPattern":"if err := client.RefreshCodeLens(ctx); err != nil {\n    if ctx.Err() != nil {\n        return nil // teardown; ignore\n    }\n    log.Printf(\"code lens refresh skipped: %v\", err)\n}","preventionTips":["Treat code lens refresh as advisory UX, not a correctness step.","Don't fire refreshes after shutdown starts.","Investigate repeated send failures — they indicate a failed writer, which will break all outgoing traffic."],"tags":["lsp","code-lens","shutdown","fire-and-forget"],"backgroundTag":null,"analyzedSha":"1bcfa18d79a3be41772223d5c05dfe4480e614ff","analyzedAt":"2026-08-16T02:12:00.115Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}