github.com/april1989/origin-go-tools@v0.0.32/internal/lsp/folding_range.go (about)

     1  package lsp
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/april1989/origin-go-tools/internal/lsp/protocol"
     7  	"github.com/april1989/origin-go-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  }