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
}
