| 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) |
| } |