| // 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/gopls/internal/lsp/protocol" |
| "golang.org/x/tools/gopls/internal/lsp/source" |
| "golang.org/x/tools/internal/event" |
| "golang.org/x/tools/internal/event/tag" |
| ) |
| |
| func (s *Server) foldingRange(ctx context.Context, params *protocol.FoldingRangeParams) ([]protocol.FoldingRange, error) { |
| ctx, done := event.Start(ctx, "lsp.Server.foldingRange", tag.URI.Of(params.TextDocument.URI)) |
| defer done() |
| |
| snapshot, fh, ok, release, err := s.beginFileRequest(ctx, params.TextDocument.URI, source.Go) |
| defer release() |
| if !ok { |
| return nil, err |
| } |
| |
| ranges, err := source.FoldingRange(ctx, snapshot, fh, snapshot.View().Options().LineFoldingOnly) |
| if err != nil { |
| return nil, err |
| } |
| return toProtocolFoldingRanges(ranges) |
| } |
| |
| func toProtocolFoldingRanges(ranges []*source.FoldingRangeInfo) ([]protocol.FoldingRange, error) { |
| result := make([]protocol.FoldingRange, 0, len(ranges)) |
| for _, info := range ranges { |
| rng := info.MappedRange.Range() |
| result = append(result, protocol.FoldingRange{ |
| StartLine: rng.Start.Line, |
| StartCharacter: rng.Start.Character, |
| EndLine: rng.End.Line, |
| EndCharacter: rng.End.Character, |
| Kind: string(info.Kind), |
| }) |
| } |
| return result, nil |
| } |