{"record":{"id":"171be91cfd477073","repo":"neoclide/coc.nvim","slug":"empty-symbols-returned-from-language-server","errorCode":null,"errorMessage":"Empty symbols returned from language server. ","messagePattern":"Empty symbols returned from language server\\. ","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"src/handler/symbols/outline.ts","lineNumber":198,"sourceCode":"    let provider = new BasicDataProvider({\n      expandLevel: this.config.expandLevel,\n      provideData: async () => {\n        let buf = this.buffers.getItem(bufnr)\n        if (!buf) throw new Error('Document not attached')\n        let doc = workspace.getDocument(bufnr)\n        if (!languages.hasProvider(ProviderName.DocumentSymbol, doc.textDocument)) {\n          throw new Error('Document symbol provider not found')\n        }\n        let meta = languages.getDocumentSymbolMetadata(doc.textDocument)\n        if (meta && meta.label) {\n          let views = this.treeViewList.filter(v => v.valid && v.targetBufnr == bufnr)\n          views.forEach(view => view.description = meta.label)\n        }\n        this.setMessage(bufnr, 'Loading document symbols')\n        let arr = await buf.getSymbols()\n        if (!arr || arr.length == 0) {\n          // server may return empty symbols on buffer initialize, throw error to force reload.\n          throw new Error('Empty symbols returned from language server. ')\n        }\n        this.setMessage(bufnr, undefined)\n        return this.convertSymbols(bufnr, arr)\n      },\n      handleClick: async item => {\n        let winnr = await nvim.call('bufwinnr', [bufnr])\n        if (winnr == -1) return\n        nvim.pauseNotification()\n        nvim.command(`${winnr}wincmd w`, true)\n        let pos = item.selectRange.start\n        nvim.call('coc#cursor#move_to', [pos.line, pos.character], true)\n        nvim.command(`normal! zz`, true)\n        let buf = nvim.createBuffer(bufnr)\n        buf.highlightRanges('outline-hover', 'CocHoverRange', [item.selectRange])\n        nvim.command('redraw', true)\n        await nvim.resumeNotification()\n        setTimeout(() => {\n          buf.clearNamespace('outline-hover')","sourceCodeStart":180,"sourceCodeEnd":216,"githubUrl":"https://github.com/neoclide/coc.nvim/blob/50e974d9692461a69147d5cab146a8d3e439abe4/src/handler/symbols/outline.ts#L180-L216","documentation":"Thrown when buf.getSymbols() returns undefined/null or an empty array from the language server's textDocument/documentSymbol request. The comment in the source explains this is deliberate: servers may briefly return empty symbol lists right after buffer initialization, so the error forces the tree view to reload rather than rendering a permanently empty outline.","triggerScenarios":"Opening :CocOutline while the server is still analyzing the file; the document genuinely has no symbols; the server returns an empty result for documentSymbol (unsupported or an indexing race); the file is empty or contains only comments in some servers.","commonSituations":"Outline opened immediately after file open on slow servers (rust-analyzer, clangd cold start); huge files not yet fully indexed; servers that return empty instead of null for symbol-less documents; transient server hiccup mid-request.","solutions":["Simply reload/refresh the outline — the throw exists to trigger a reload once symbols become available.","Wait for the server to finish indexing (check :CocCommand workspace.showOutput or server status).","Verify the server actually returns symbols (query it with :CocCommand documentSymbols in the same buffer).","If it consistently returns empty, the server lacks documentSymbol support — switch servers or accept a non-outline filetype."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"for (let i = 0; i < 3; i++) {\n  try {\n    await outline.show(bufnr)\n    break\n  } catch (e) {\n    if (String(e).includes('Empty symbols')) {\n      await new Promise(r => setTimeout(r, 500)) // server still indexing\n      continue\n    }\n    throw e\n  }\n}","preventionTips":["Delay outline opening until the server reports ready/indexing complete.","Retry on this error — the throw is deliberately used to trigger a reload.","Check the server actually returns symbols via :CocCommand documentSymbols.","Use servers known to implement documentSymbol for your language."],"tags":["outline","document-symbol","empty-response","lsp"],"backgroundTag":"empty-lsp-response","analyzedSha":"50e974d9692461a69147d5cab146a8d3e439abe4","analyzedAt":"2026-08-31T11:17:23.966Z","schemaVersion":2},"datasetVersion":"2026-09-01T08:17:40.651Z"}