This test checks basic completion snippet support, using placeholders.

Unlike the old marker tests, the new marker tests assume static configuration
(as defined by settings.json), and therefore there is duplication between this
test and snippet.txt. This is a price we pay so that we don't have to mutate
the server during testing.

-- flags --
-ignore_extra_diags

-- settings.json --
{
	"usePlaceholders": true
}

-- go.mod --
module golang.org/lsptests/snippet

-- snippet.go --
package snippets

// Pre-set this marker, as we don't have a "source" for it in this package.
/* Error() */ //@item(Error, "Error", "func() string", "method")

type AliasType = int //@item(sigAliasType, "AliasType", "AliasType", "type")

func foo(i int, b bool) {} //@item(snipFoo, "foo", "func(i int, b bool)", "func")
func bar(fn func()) func()    {} //@item(snipBar, "bar", "func(fn func())", "func")
func baz(at AliasType, b bool) {} //@item(snipBaz, "baz", "func(at AliasType, b bool)", "func")

type Foo struct {
	Bar int //@item(snipFieldBar, "Bar", "int", "field")
	Func func(at AliasType) error //@item(snipFieldFunc, "Func", "func(at AliasType) error", "field")
}

func (Foo) Baz() func() {} //@item(snipMethodBaz, "Baz", "func() func()", "method")
func (Foo) BazBar() func() {} //@item(snipMethodBazBar, "BazBar", "func() func()", "method")
func (Foo) BazBaz(at AliasType) func() {} //@item(snipMethodBazBaz, "BazBaz", "func(at AliasType) func()", "method")

func _() {
	f //@snippet(" //", snipFoo, "foo(${1:i int}, ${2:b bool})")

	bar //@snippet(" //", snipBar, "bar(${1:fn func()})")

	baz //@snippet(" //", snipBaz, "baz(${1:at AliasType}, ${2:b bool})")
	baz() //@signature("(", "baz(at AliasType, b bool)", 0)

	bar(nil) //@snippet("(", snipBar, "bar")
	bar(ba) //@snippet(")", snipBar, "bar(${1:fn func()})")
	var f Foo
	bar(f.Ba) //@snippet(")", snipMethodBaz, "Baz()")
	(bar)(nil) //@snippet(")", snipBar, "bar(${1:fn func()})")
	(f.Ba)() //@snippet(")", snipMethodBaz, "Baz()")

	Foo{
		B //@snippet(" //", snipFieldBar, "Bar: ${1:int},")
	}

	Foo{
		F //@snippet(" //", snipFieldFunc, "Func: ${1:func(at AliasType) error},")
	}

	Foo{B} //@snippet("}", snipFieldBar, "Bar: ${1:int}")
	Foo{} //@snippet("}", snipFieldBar, "Bar: ${1:int}")

	Foo{Foo{}.B} //@snippet("} ", snipFieldBar, "Bar")

	var err error
	err.Error() //@snippet("E", Error, "Error()")
	f.Baz()     //@snippet("B", snipMethodBaz, "Baz()")

	f.Baz()     //@snippet("(", snipMethodBazBar, "BazBar")

	f.Baz()     //@snippet("B", snipMethodBazBaz, "BazBaz(${1:at AliasType})")
}

func _() {
	type bar struct {
		a int
		b float64 //@item(snipBarB, "b", "field")
	}
	bar{b} //@snippet("}", snipBarB, "b: ${1:float64}")
}
