|  | // Copyright 2019 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package lsp | 
|  |  | 
|  | import ( | 
|  | "context" | 
|  |  | 
|  | "golang.org/x/tools/internal/lsp/protocol" | 
|  | "golang.org/x/tools/internal/lsp/source" | 
|  | "golang.org/x/tools/internal/lsp/telemetry" | 
|  | "golang.org/x/tools/internal/span" | 
|  | "golang.org/x/tools/internal/telemetry/log" | 
|  | "golang.org/x/tools/internal/telemetry/trace" | 
|  | ) | 
|  |  | 
|  | func (s *Server) documentSymbol(ctx context.Context, params *protocol.DocumentSymbolParams) ([]protocol.DocumentSymbol, error) { | 
|  | ctx, done := trace.StartSpan(ctx, "lsp.Server.documentSymbol") | 
|  | defer done() | 
|  |  | 
|  | uri := span.NewURI(params.TextDocument.URI) | 
|  | view, err := s.session.ViewOf(uri) | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  | snapshot := view.Snapshot() | 
|  | fh, err := snapshot.GetFile(uri) | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  | var symbols []protocol.DocumentSymbol | 
|  | switch fh.Identity().Kind { | 
|  | case source.Go: | 
|  | symbols, err = source.DocumentSymbols(ctx, snapshot, fh) | 
|  | case source.Mod: | 
|  | return []protocol.DocumentSymbol{}, nil | 
|  | } | 
|  |  | 
|  | if err != nil { | 
|  | log.Error(ctx, "DocumentSymbols failed", err, telemetry.URI.Of(uri)) | 
|  | return []protocol.DocumentSymbol{}, nil | 
|  | } | 
|  | return symbols, nil | 
|  | } |