--- /dev/null
+package lsp
+
+import (
+ "context"
+
+ "golang.org/x/tools/internal/lsp/protocol"
+ "golang.org/x/tools/internal/lsp/source"
+)
+
+func (s *Server) foldingRange(ctx context.Context, params *protocol.FoldingRangeParams) ([]protocol.FoldingRange, error) {
+ 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, err := info.Range()
+ if err != nil {
+ return nil, err
+ }
+ 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
+}