@@ -17,9 +17,9 @@ type TokenEncoder struct {
1717 Tokens []lang.SemanticToken
1818 ClientCaps lsp.SemanticTokensClientCapabilities
1919
20- // lastEncodedTokenIdx tracks index of the last encoded token
21- // so we can account for any skipped tokens in calculating diff
22- lastEncodedTokenIdx int
20+ lastEncodedLine int
21+ lastEncodedStartChar int
22+ hasEncodedToken bool
2323}
2424
2525func (te * TokenEncoder ) Encode () []uint32 {
@@ -54,17 +54,8 @@ func (te *TokenEncoder) encodeTokenOfIndex(i int) []uint32 {
5454
5555 tokenLineDelta := token .Range .End .Line - token .Range .Start .Line
5656
57- previousLine := 0
58- previousStartChar := 0
59- if i > 0 {
60- previousLine = te .Tokens [te .lastEncodedTokenIdx ].Range .End .Line - 1
61- currentLine := te .Tokens [i ].Range .End .Line - 1
62- if currentLine == previousLine {
63- previousStartChar = te .Tokens [te .lastEncodedTokenIdx ].Range .Start .Column - 1
64- }
65- }
66-
6757 if tokenLineDelta == 0 || false /* te.clientCaps.MultilineTokenSupport */ {
58+ previousLine , previousStartChar := te .lastPosition (token .Range .Start .Line - 1 )
6859 deltaLine := token .Range .Start .Line - 1 - previousLine
6960 tokenLength := token .Range .End .Byte - token .Range .Start .Byte
7061 deltaStartChar := token .Range .Start .Column - 1 - previousStartChar
@@ -76,23 +67,31 @@ func (te *TokenEncoder) encodeTokenOfIndex(i int) []uint32 {
7667 uint32 (tokenTypeIdx ),
7768 uint32 (modifierBitMask ),
7869 }... )
70+
71+ te .recordPosition (token .Range .Start .Line - 1 , token .Range .Start .Column - 1 )
7972 } else {
8073 // Add entry for each line of a multiline token
8174 for tokenLine := token .Range .Start .Line - 1 ; tokenLine <= token .Range .End .Line - 1 ; tokenLine ++ {
82- deltaLine := tokenLine - previousLine
83-
84- deltaStartChar := 0
85- if tokenLine == token .Range .Start .Line - 1 {
86- deltaStartChar = token .Range .Start .Column - 1 - previousStartChar
87- }
88-
75+ startChar := 0
8976 lineBytes := bytes .TrimRight (te .Lines [tokenLine ].Bytes , "\n \r " )
9077 length := len (lineBytes )
78+ if tokenLine == token .Range .Start .Line - 1 {
79+ startChar = token .Range .Start .Column - 1
80+ length -= startChar
81+ }
9182
9283 if tokenLine == token .Range .End .Line - 1 {
93- length = token .Range .End .Column - 1
84+ length = token .Range .End .Column - 1 - startChar
9485 }
9586
87+ if length <= 0 {
88+ continue
89+ }
90+
91+ previousLine , previousStartChar := te .lastPosition (tokenLine )
92+ deltaLine := tokenLine - previousLine
93+ deltaStartChar := startChar - previousStartChar
94+
9695 data = append (data , []uint32 {
9796 uint32 (deltaLine ),
9897 uint32 (deltaStartChar ),
@@ -101,15 +100,31 @@ func (te *TokenEncoder) encodeTokenOfIndex(i int) []uint32 {
101100 uint32 (modifierBitMask ),
102101 }... )
103102
104- previousLine = tokenLine
103+ te . recordPosition ( tokenLine , startChar )
105104 }
106105 }
107106
108- te .lastEncodedTokenIdx = i
109-
110107 return data
111108}
112109
110+ func (te * TokenEncoder ) lastPosition (tokenLine int ) (int , int ) {
111+ if ! te .hasEncodedToken {
112+ return 0 , 0
113+ }
114+
115+ if tokenLine == te .lastEncodedLine {
116+ return te .lastEncodedLine , te .lastEncodedStartChar
117+ }
118+
119+ return te .lastEncodedLine , 0
120+ }
121+
122+ func (te * TokenEncoder ) recordPosition (line , startChar int ) {
123+ te .lastEncodedLine = line
124+ te .lastEncodedStartChar = startChar
125+ te .hasEncodedToken = true
126+ }
127+
113128func (te * TokenEncoder ) resolveTokenType (token lang.SemanticToken ) (semtok.TokenType , bool ) {
114129 switch token .Type {
115130 case lang .TokenBlockType :
0 commit comments