Skip to content

Commit 1f763df

Browse files
committed
internal/lsp: add semantic tokens for arrows in declarations
Fixes: golang.org/#52024 Change-Id: Ib79a839f9bdeaef1250925add69dea3ae32e1cae Reviewed-on: https://go-review.googlesource.com/c/tools/+/397479 Reviewed-by: Hyang-Ah Hana Kim <[email protected]> Trust: Hyang-Ah Hana Kim <[email protected]> Trust: Peter Weinberger <[email protected]>
1 parent b3e0236 commit 1f763df

File tree

5 files changed

+22
-7
lines changed

5 files changed

+22
-7
lines changed

internal/lsp/cmd/test/semanticdriver.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ func (r *runner) SemanticTokens(t *testing.T, spn span.Span) {
2727
t.Errorf("want(%d-%d) != got(%d-%d) for %s", len(want), len(lwant), len(got), len(lgot), r.Normalize(filename))
2828
for i := 0; i < len(lwant) && i < len(lgot); i++ {
2929
if lwant[i] != lgot[i] {
30-
t.Errorf("line %d:\nwant%q\ngot %q\n", i, lwant[i], lgot[i])
30+
// This is the line number in the golden file.
31+
// It is one larger than the line number in the source file.
32+
t.Errorf("line %d:\nwant%q\ngot %q\n", i+2, lwant[i], lgot[i])
3133
}
3234
}
3335
}

internal/lsp/semantic.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,17 @@ func (e *encoded) inspector(n ast.Node) bool {
328328
e.token(x.Case, len(iam), tokKeyword, nil)
329329
case *ast.ChanType:
330330
// chan | chan <- | <- chan
331-
if x.Arrow == token.NoPos || x.Arrow != x.Begin {
331+
switch {
332+
case x.Arrow == token.NoPos:
332333
e.token(x.Begin, len("chan"), tokKeyword, nil)
333-
break
334+
case x.Arrow == x.Begin:
335+
e.token(x.Arrow, 2, tokOperator, nil)
336+
pos := e.findKeyword("chan", x.Begin+2, x.Value.Pos())
337+
e.token(pos, len("chan"), tokKeyword, nil)
338+
case x.Arrow != x.Begin:
339+
e.token(x.Begin, len("chan"), tokKeyword, nil)
340+
e.token(x.Arrow, 2, tokOperator, nil)
334341
}
335-
pos := e.findKeyword("chan", x.Begin+2, x.Value.Pos())
336-
e.token(pos, len("chan"), tokKeyword, nil)
337342
case *ast.CommClause:
338343
iam := len("case")
339344
if x.Comm == nil {

internal/lsp/testdata/semantic/a.go.golden

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
/*⇒1,variable,[definition]*/a = /*⇒3,namespace,[]*/fmt./*⇒5,function,[]*/Print
1414
/*⇒1,variable,[definition]*/b []/*⇒6,type,[defaultLibrary]*/string = []/*⇒6,type,[defaultLibrary]*/string{/*⇒5,string,[]*/"foo"}
1515
/*⇒2,variable,[definition]*/c1 /*⇒4,keyword,[]*/chan /*⇒3,type,[defaultLibrary]*/int
16-
/*⇒2,variable,[definition]*/c2 <-/*⇒4,keyword,[]*/chan /*⇒3,type,[defaultLibrary]*/int
17-
/*⇒2,variable,[definition]*/c3 = /*⇒4,function,[defaultLibrary]*/make([]/*⇒4,keyword,[]*/chan<- /*⇒3,type,[defaultLibrary]*/int)
16+
/*⇒2,variable,[definition]*/c2 /*⇒2,operator,[]*/<-/*⇒4,keyword,[]*/chan /*⇒3,type,[defaultLibrary]*/int
17+
/*⇒2,variable,[definition]*/c3 = /*⇒4,function,[defaultLibrary]*/make([]/*⇒4,keyword,[]*/chan/*⇒2,operator,[]*/<- /*⇒3,type,[defaultLibrary]*/int)
1818
/*⇒1,variable,[definition]*/b = /*⇒1,type,[]*/A{/*⇒1,variable,[]*/X: /*⇒2,number,[]*/23}
1919
/*⇒1,variable,[definition]*/m /*⇒3,keyword,[]*/map[/*⇒4,type,[defaultLibrary]*/bool][/*⇒1,number,[]*/3]/*⇒1,operator,[]*/*/*⇒7,type,[defaultLibrary]*/float64
2020
)

internal/lsp/testdata/semantic/b.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ type CC struct {
3232
}
3333
type D func(aa AA) (BB error)
3434
type E func(AA) BB
35+
36+
var a chan<- chan int
37+
var b chan<- <-chan int
38+
var c <-chan <-chan int

internal/lsp/testdata/semantic/b.go.golden

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,7 @@
3434
/*⇒4,keyword,[]*/type /*⇒1,type,[definition]*/D /*⇒4,keyword,[]*/func(/*⇒2,parameter,[definition]*/aa /*⇒2,type,[]*/AA) (/*⇒2,parameter,[definition]*/BB /*⇒5,type,[]*/error)
3535
/*⇒4,keyword,[]*/type /*⇒1,type,[definition]*/E /*⇒4,keyword,[]*/func(/*⇒2,type,[]*/AA) /*⇒2,type,[]*/BB
3636

37+
/*⇒3,keyword,[]*/var /*⇒1,variable,[definition]*/a /*⇒4,keyword,[]*/chan/*⇒2,operator,[]*/<- /*⇒4,keyword,[]*/chan /*⇒3,type,[defaultLibrary]*/int
38+
/*⇒3,keyword,[]*/var /*⇒1,variable,[definition]*/b /*⇒4,keyword,[]*/chan/*⇒2,operator,[]*/<- /*⇒2,operator,[]*/<-/*⇒4,keyword,[]*/chan /*⇒3,type,[defaultLibrary]*/int
39+
/*⇒3,keyword,[]*/var /*⇒1,variable,[definition]*/c /*⇒2,operator,[]*/<-/*⇒4,keyword,[]*/chan /*⇒2,operator,[]*/<-/*⇒4,keyword,[]*/chan /*⇒3,type,[defaultLibrary]*/int
40+

0 commit comments

Comments
 (0)