neoclide/coc.nvim · error · Error

Document symbol provider not found

Error message

Document symbol provider not found

What it means

Thrown when the outline provider finds the buffer attached but no language server currently registered for the DocumentSymbol provider for that document. The LSP server is absent, still initializing, or doesn't support documentSymbol.

Source

Thrown at src/handler/symbols/outline.ts:187

    }
    return symbols.map(s => this.convertSymbolToNode(s, sortFn)).sort(sortFn)
  }

  public onSymbolsUpdate(bufnr: number, symbols: DocumentSymbol[]): void {
    let provider = this.providersMap.get(bufnr)
    if (provider) provider.update(this.convertSymbols(bufnr, symbols))
  }

  private createProvider(bufnr: number): BasicDataProvider<OutlineNode> {
    let { nvim } = this
    let provider = new BasicDataProvider({
      expandLevel: this.config.expandLevel,
      provideData: async () => {
        let buf = this.buffers.getItem(bufnr)
        if (!buf) throw new Error('Document not attached')
        let doc = workspace.getDocument(bufnr)
        if (!languages.hasProvider(ProviderName.DocumentSymbol, doc.textDocument)) {
          throw new Error('Document symbol provider not found')
        }
        let meta = languages.getDocumentSymbolMetadata(doc.textDocument)
        if (meta && meta.label) {
          let views = this.treeViewList.filter(v => v.valid && v.targetBufnr == bufnr)
          views.forEach(view => view.description = meta.label)
        }
        this.setMessage(bufnr, 'Loading document symbols')
        let arr = await buf.getSymbols()
        if (!arr || arr.length == 0) {
          // server may return empty symbols on buffer initialize, throw error to force reload.
          throw new Error('Empty symbols returned from language server. ')
        }
        this.setMessage(bufnr, undefined)
        return this.convertSymbols(bufnr, arr)
      },
      handleClick: async item => {
        let winnr = await nvim.call('bufwinnr', [bufnr])
        if (winnr == -1) return

View on GitHub (pinned to 50e974d969)

Solutions

  1. Wait for the language server to attach, then reopen the outline; check status with :CocCommand workspace.showOutput.
  2. Verify the server supports documentSymbol; install/enable the right coc extension (e.g. coc-tsserver, coc-pyright) for the filetype.
  3. Fix server launch config in coc-settings.json (wrong command/path is the usual cause).
  4. Run :CocRestart and retry; if the server supports it, the provider registers on didOpen.
  5. Refresh the outline again — the provider reload logic intentionally re-fetches after errors.

Example fix

// before (settings missing server)
"coc.sourceConfig": {}

// after (ensure a server for the filetype)
{
  "languageserver.go": {
    "command": "gopls",
    "filetypes": ["go"]
  }
}
Defensive patterns

Strategy: validation

Validate before calling

// check a server with documentSymbol is attached before opening outline
let supported = CocHasProvider('documentSymbol')
if !supported
  echom 'No documentSymbol provider for this filetype'
else
  CocOutline
endif

Try / catch

try {
  await outline.show(bufnr)
} catch (e) {
  if (String(e).includes('provider not found')) {
    // wait for attach or notify user to install a server for this filetype
  }
}

Prevention

When it happens

Trigger: :CocOutline invoked in a buffer whose language server hasn't finished startup (hasProvider returns false during initialization), or in a filetype with no language server configured, or after the server crashed/was stopped so the provider registration was dropped.

Common situations: Opening the outline immediately after opening a large project (server still starting); missing or broken coc extension for the filetype; server failed to launch (bad command in coc-settings.json); server does not implement textDocument/documentSymbol (e.g. some linters-only servers).

Related errors


AI-assisted analysis of neoclide/coc.nvim@50e974d969 (2026-08-31). Data as JSON: /api/errors/dab0da33c778a525. Report an issue: GitHub.