This test checks textDocument/highlight with highlight kinds.
For example, a use of a variable is reported as a "read",
and an assignment to a variable is reported as a "write".
(Note that the details don't align exactly with the Go
type-checker notions of values versus addressable variables).
-- highlight_kind.go --
package a
type Nest struct {
nest *Nest //@hiloc(fNest, "nest", text)
}
type MyMap map[string]string
type NestMap map[Nest]Nest
func highlightTest() {
const constIdent = 1 //@hiloc(constIdent, "constIdent", write)
//@highlightall(constIdent)
var varNoInit int //@hiloc(varNoInit, "varNoInit", write)
(varNoInit) = 1 //@hiloc(varNoInitAssign, "varNoInit", write)
_ = varNoInit //@hiloc(varNoInitRead, "varNoInit", read)
//@highlightall(varNoInit, varNoInitAssign, varNoInitRead)
str, num := "hello", 2 //@hiloc(str, "str", write), hiloc(num, "num", write)
_, _ = str, num //@hiloc(strRead, "str", read), hiloc(numRead, "num", read)
//@highlightall(str, strRead, strMapKey, strMapVal, strMyMapKey, strMyMapVal, strMyMapSliceKey, strMyMapSliceVal, strMyMapPtrSliceKey, strMyMapPtrSliceVal)
//@highlightall(num, numRead, numAddr, numIncr, numMul)
nest := &Nest{nest: nil} //@hiloc(nest, "nest", write),hiloc(fNestComp, re`(nest):`, write)
nest.nest = &Nest{} //@hiloc(nestSelX, "nest", read), hiloc(fNestSel, re`(nest) =`, write)
*nest.nest = Nest{} //@hiloc(nestSelXStar, "nest", read), hiloc(fNestSelStar, re`(nest) =`, write)
//@highlightall(nest, nestSelX, nestSelXStar, nestMapVal)
//@highlightall(fNest, fNestComp, fNestSel, fNestSelStar, fNestSliceComp, fNestPtrSliceComp, fNestMapKey)
pInt := &num //@hiloc(pInt, "pInt", write),hiloc(numAddr, "num", read)
// StarExpr is reported as "write" in GoLand and Rust Analyzer
*pInt = 3 //@hiloc(pIntStar, "pInt", write)
var ppInt **int = &pInt //@hiloc(ppInt, "ppInt", write),hiloc(pIntAddr, re`&(pInt)`, read)
**ppInt = 4 //@hiloc(ppIntStar, "ppInt", write)
*(*ppInt) = 4 //@hiloc(ppIntParen, "ppInt", write)
//@highlightall(pInt, pIntStar, pIntAddr)
//@highlightall(ppInt, ppIntStar, ppIntParen)
num++ //@hiloc(numIncr, "num", write)
num *= 1 //@hiloc(numMul, "num", write)
var ch chan int = make(chan int, 10) //@hiloc(ch, "ch", write)
ch <- 3 //@hiloc(chSend, "ch", write)
<-ch //@hiloc(chRecv, "ch", read)
//@highlightall(ch, chSend, chRecv)
var nums []int = []int{1, 2} //@hiloc(nums, "nums", write)
// IndexExpr is reported as "read" in GoLand, Rust Analyzer and Java JDT
nums[0] = 1 //@hiloc(numsIndex, "nums", read)
//@highlightall(nums, numsIndex)
mapLiteral := map[string]string{ //@hiloc(mapLiteral, "mapLiteral", write)
str: str, //@hiloc(strMapKey, "str", read),hiloc(strMapVal, re`(str),`, read)
}
for key, value := range mapLiteral { //@hiloc(mapKey, "key", write), hiloc(mapVal, "value", write), hiloc(mapLiteralRange, "mapLiteral", read)
_, _ = key, value //@hiloc(mapKeyRead, "key", read), hiloc(mapValRead, "value", read)
}
//@highlightall(mapLiteral, mapLiteralRange)
//@highlightall(mapKey, mapKeyRead)
//@highlightall(mapVal, mapValRead)
nestSlice := []Nest{
{nest: nil}, //@hiloc(fNestSliceComp, "nest", write)
}
nestPtrSlice := []*Nest{
{nest: nil}, //@hiloc(fNestPtrSliceComp, "nest", write)
}
myMap := MyMap{
str: str, //@hiloc(strMyMapKey, "str", read),hiloc(strMyMapVal, re`(str),`, read)
}
myMapSlice := []MyMap{
{str: str}, //@hiloc(strMyMapSliceKey, "str", read),hiloc(strMyMapSliceVal, re`: (str)`, read)
}
myMapPtrSlice := []*MyMap{
{str: str}, //@hiloc(strMyMapPtrSliceKey, "str", read),hiloc(strMyMapPtrSliceVal, re`: (str)`, read)
}
nestMap := NestMap{
Nest{nest: nil}: *nest, //@hiloc(fNestMapKey, "nest", write), hiloc(nestMapVal, re`(nest),`, read)
}
_, _, _, _, _, _ = myMap, nestSlice, nestPtrSlice, myMapSlice, myMapPtrSlice, nestMap
}