This test exercises the reference and dereference completion modifiers. TODO: remove the need to set "literalCompletions" here, as this is one of the few places this setting is needed. -- flags -- -ignore_extra_diags -- go.mod -- module golang.org/lsptests go 1.18 -- address/address.go -- package address func wantsPtr(*int) {} func wantsVariadicPtr(...*int) {} func wantsVariadic(...int) {} type foo struct{ c int } //@item(addrFieldC, "c", "int", "field") func _() { var ( a string //@item(addrA, "a", "string", "var") b int //@item(addrB, "b", "int", "var") ) wantsPtr() //@rank(")", addrB, addrA),snippet(")", addrB, "&b") wantsPtr(&b) //@snippet(")", addrB, "b") wantsVariadicPtr() //@rank(")", addrB, addrA),snippet(")", addrB, "&b") var s foo s.c //@item(addrDeepC, "s.c", "int", "field") wantsPtr() //@snippet(")", addrDeepC, "&s.c") wantsPtr(s) //@snippet(")", addrDeepC, "&s.c") wantsPtr(&s) //@snippet(")", addrDeepC, "s.c") // don't add "&" in item (it gets added as an additional edit) wantsPtr(&s.c) //@snippet(")", addrFieldC, "c") // check dereferencing as well var c *int //@item(addrCPtr, "c", "*int", "var") var _ int = _ //@rank("_ //", addrCPtr, addrA),snippet("_ //", addrCPtr, "*c") wantsVariadic() //@rank(")", addrCPtr, addrA),snippet(")", addrCPtr, "*c") var d **int //@item(addrDPtr, "d", "**int", "var") var _ int = _ //@rank("_ //", addrDPtr, addrA),snippet("_ //", addrDPtr, "**d") type namedPtr *int var np namedPtr //@item(addrNamedPtr, "np", "namedPtr", "var") var _ int = _ //@rank("_ //", addrNamedPtr, addrA) // don't get tripped up by recursive pointer type type dontMessUp *dontMessUp //@item(dontMessUp, "dontMessUp", "*dontMessUp", "type") var dmu *dontMessUp //@item(addrDMU, "dmu", "*dontMessUp", "var") var _ int = dmu //@complete(" //", addrDMU, dontMessUp) } func (f foo) ptr() *foo { return &f } func _() { getFoo := func() foo { return foo{} } // not addressable getFoo().c //@item(addrGetFooC, "getFoo().c", "int", "field") // addressable getFoo().ptr().c //@item(addrGetFooPtrC, "getFoo().ptr().c", "int", "field") wantsPtr() //@snippet(")", addrGetFooPtrC, "&getFoo().ptr().c") wantsPtr(&g) //@snippet(")", addrGetFooPtrC, "getFoo().ptr().c") } type nested struct { f foo } func _() { getNested := func() nested { return nested{} } getNested().f.c //@item(addrNestedC, "getNested().f.c", "int", "field") getNested().f.ptr().c //@item(addrNestedPtrC, "getNested().f.ptr().c", "int", "field") // addrNestedC is not addressable, so rank lower wantsPtr(getNestedfc) //@complete(")", addrNestedPtrC, addrNestedC) }