This test checks basic functionality of the textDocument/highlight request. -- highlights.go -- package highlights import ( "fmt" //@hiloc(fmtImp, "\"fmt\"", text),highlightall(fmtImp, fmt1, fmt2, fmt3, fmt4) h2 "net/http" //@hiloc(hImp, "h2", text),highlightall(hImp, hUse) "sort" ) type F struct{ bar int } //@hiloc(barDeclaration, "bar", text),highlightall(barDeclaration, bar1, bar2, bar3) func _() F { return F{ bar: 123, //@hiloc(bar1, "bar", write) } } var foo = F{bar: 52} //@hiloc(fooDeclaration, "foo", write),hiloc(bar2, "bar", write),highlightall(fooDeclaration, fooUse) func Print() { //@hiloc(printFunc, "Print", text),highlightall(printFunc, printTest) _ = h2.Client{} //@hiloc(hUse, "h2", text) fmt.Println(foo) //@hiloc(fooUse, "foo", read),hiloc(fmt1, "fmt", text) fmt.Print("yo") //@hiloc(printSep, "Print", text),highlightall(printSep, print1, print2),hiloc(fmt2, "fmt", text) } func (x *F) Inc() { //@hiloc(xRightDecl, "x", text),hiloc(xLeftDecl, " *", text),highlightall(xRightDecl, xUse),highlight(xLeftDecl, xRightDecl, xUse) x.bar++ //@hiloc(xUse, "x", read),hiloc(bar3, "bar", write) } func testFunctions() { fmt.Print("main start") //@hiloc(print1, "Print", text),hiloc(fmt3, "fmt", text) fmt.Print("ok") //@hiloc(print2, "Print", text),hiloc(fmt4, "fmt", text) Print() //@hiloc(printTest, "Print", text) } // DocumentHighlight is undefined, so its uses below are type errors. // Nevertheless, document highlighting should still work. //@diag(locdoc1, re"undefined|undeclared"), diag(locdoc2, re"undefined|undeclared"), diag(locdoc3, re"undefined|undeclared") func toProtocolHighlight(rngs []int) []DocumentHighlight { //@loc(locdoc1, "DocumentHighlight"), hiloc(doc1, "DocumentHighlight", text),hiloc(docRet1, "[]DocumentHighlight", text),highlight(doc1, docRet1, doc1, doc2, doc3, result) result := make([]DocumentHighlight, 0, len(rngs)) //@loc(locdoc2, "DocumentHighlight"), hiloc(doc2, "DocumentHighlight", text),highlight(doc2, doc1, doc2, doc3) for _, rng := range rngs { result = append(result, DocumentHighlight{ //@loc(locdoc3, "DocumentHighlight"), hiloc(doc3, "DocumentHighlight", text),highlight(doc3, doc1, doc2, doc3) Range: rng, }) } return result //@hiloc(result, "result", text) } func testForLoops() { for i := 0; i < 10; i++ { //@hiloc(forDecl1, "for", text),highlightall(forDecl1, brk1, cont1) if i > 8 { break //@hiloc(brk1, "break", text) } if i < 2 { for j := 1; j < 10; j++ { //@hiloc(forDecl2, "for", text),highlightall(forDecl2, cont2) if j < 3 { for k := 1; k < 10; k++ { //@hiloc(forDecl3, "for", text),highlightall(forDecl3, cont3) if k < 3 { continue //@hiloc(cont3, "continue", text) } } continue //@hiloc(cont2, "continue", text) } } continue //@hiloc(cont1, "continue", text) } } arr := []int{} for i := range arr { //@hiloc(forDecl4, "for", text),highlightall(forDecl4, brk4, cont4) if i > 8 { break //@hiloc(brk4, "break", text) } if i < 4 { continue //@hiloc(cont4, "continue", text) } } Outer: for i := 0; i < 10; i++ { //@hiloc(forDecl5, "for", text),highlightall(forDecl5, brk5, brk6, brk8) break //@hiloc(brk5, "break", text) for { //@hiloc(forDecl6, "for", text),highlightall(forDecl6, cont5), diag("for", re"unreachable") if i == 1 { break Outer //@hiloc(brk6, "break Outer", text) } switch i { //@hiloc(switch1, "switch", text),highlightall(switch1, brk7) case 5: break //@hiloc(brk7, "break", text) case 6: continue //@hiloc(cont5, "continue", text) case 7: break Outer //@hiloc(brk8, "break Outer", text) } } } } func testSwitch() { var i, j int L1: for { //@hiloc(forDecl7, "for", text),highlightall(forDecl7, brk10, cont6) L2: switch i { //@hiloc(switch2, "switch", text),highlightall(switch2, brk11, brk12, brk13) case 1: switch j { //@hiloc(switch3, "switch", text),highlightall(switch3, brk9) case 1: break //@hiloc(brk9, "break", text) case 2: break L1 //@hiloc(brk10, "break L1", text) case 3: break L2 //@hiloc(brk11, "break L2", text) default: continue //@hiloc(cont6, "continue", text) } case 2: break //@hiloc(brk12, "break", text) default: break L2 //@hiloc(brk13, "break L2", text) } } } func testReturn() bool { //@hiloc(func1, "func", text),hiloc(bool1, "bool", text),highlight(func1, func1, fullRet11, fullRet12),highlight(bool1, bool1, false1, bool2, true1) if 1 < 2 { return false //@hiloc(ret11, "return", text),hiloc(fullRet11, "return false", text),hiloc(false1, "false", text),highlight(ret11, func1, fullRet11, fullRet12) } candidates := []int{} sort.SliceStable(candidates, func(i, j int) bool { //@hiloc(func2, "func", text),hiloc(bool2, "bool", text),highlight(func2, func2, fullRet2) return candidates[i] > candidates[j] //@hiloc(ret2, "return", text),hiloc(fullRet2, "return candidates[i] > candidates[j]", text),highlight(ret2, func2, fullRet2) }) return true //@hiloc(ret12, "return", text),hiloc(fullRet12, "return true", text),hiloc(true1, "true", text),highlight(ret12, func1, fullRet11, fullRet12) } func testReturnFields() float64 { //@hiloc(retVal1, "float64", text),highlight(retVal1, retVal1, retVal11, retVal21) if 1 < 2 { return 20.1 //@hiloc(retVal11, "20.1", text),highlight(retVal11, retVal1, retVal11, retVal21) } z := 4.3 //@hiloc(zDecl, "z", write) return z //@hiloc(retVal21, "z", text),highlight(retVal21, retVal1, retVal11, zDecl, retVal21) } func testReturnMultipleFields() (float32, string) { //@hiloc(retVal31, "float32", text),hiloc(retVal32, "string", text),highlight(retVal31, retVal31, retVal41, retVal51),highlight(retVal32, retVal32, retVal42, retVal52) y := "im a var" //@hiloc(yDecl, "y", write), if 1 < 2 { return 20.1, y //@hiloc(retVal41, "20.1", text),hiloc(retVal42, "y", text),highlight(retVal41, retVal31, retVal41, retVal51),highlight(retVal42, retVal32, yDecl, retVal42, retVal52) } return 4.9, "test" //@hiloc(retVal51, "4.9", text),hiloc(retVal52, "\"test\"", text),highlight(retVal51, retVal31, retVal41, retVal51),highlight(retVal52, retVal32, retVal42, retVal52) } func testReturnFunc() int32 { //@hiloc(retCall, "int32", text) mulch := 1 //@hiloc(mulchDec, "mulch", write),highlight(mulchDec, mulchDec, mulchRet) return int32(mulch) //@hiloc(mulchRet, "mulch", read),hiloc(retFunc, "int32", text),hiloc(retTotal, "int32(mulch)", text),highlight(mulchRet, mulchDec, mulchRet),highlight(retFunc, retCall, retFunc, retTotal) }