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