github.com/jd-ly/tools@v0.5.7/internal/lsp/folding_range.go (about) 1 package lsp 2 3 import ( 4 "context" 5 6 "github.com/jd-ly/tools/internal/lsp/protocol" 7 "github.com/jd-ly/tools/internal/lsp/source" 8 ) 9 10 func (s *Server) foldingRange(ctx context.Context, params *protocol.FoldingRangeParams) ([]protocol.FoldingRange, error) { 11 snapshot, fh, ok, release, err := s.beginFileRequest(ctx, params.TextDocument.URI, source.Go) 12 defer release() 13 if !ok { 14 return nil, err 15 } 16 17 ranges, err := source.FoldingRange(ctx, snapshot, fh, snapshot.View().Options().LineFoldingOnly) 18 if err != nil { 19 return nil, err 20 } 21 return toProtocolFoldingRanges(ranges) 22 } 23 24 func toProtocolFoldingRanges(ranges []*source.FoldingRangeInfo) ([]protocol.FoldingRange, error) { 25 result := make([]protocol.FoldingRange, 0, len(ranges)) 26 for _, info := range ranges { 27 rng, err := info.Range() 28 if err != nil { 29 return nil, err 30 } 31 result = append(result, protocol.FoldingRange{ 32 StartLine: rng.Start.Line, 33 StartCharacter: rng.Start.Character, 34 EndLine: rng.End.Line, 35 EndCharacter: rng.End.Character, 36 Kind: string(info.Kind), 37 }) 38 } 39 return result, nil 40 }