This test checks completion related to variadic functions.

-- flags --
-ignore_extra_diags

-- variadic.go --
package variadic

func foo(i int, strs ...string) {}

func bar() []string { //@item(vFunc, "bar", "func() []string", "func")
	return nil
}

func _() {
	var (
		i  int        //@item(vInt, "i", "int", "var")
		s  string     //@item(vStr, "s", "string", "var")
		ss []string   //@item(vStrSlice, "ss", "[]string", "var")
		v interface{} //@item(vIntf, "v", "interface{}", "var")
	)

	foo()           //@rank(")", vInt, vStr),rank(")", vInt, vStrSlice)
	foo(123, )      //@rank(")", vStr, vInt),rank(")", vStrSlice, vInt)
	foo(123, "", )  //@rank(")", vStr, vInt),rank(")", vStr, vStrSlice)
	foo(123, s, "") //@rank(", \"", vStr, vStrSlice)

  // snippet will add the "..." for you
	foo(123, ) //@snippet(")", vStrSlice, "ss..."),snippet(")", vFunc, "bar()..."),snippet(")", vStr, "s")

	// don't add "..." for interface{}
	foo(123, ) //@snippet(")", vIntf, "v")
}

func qux(...func()) {}
func f()            {} //@item(vVarArg, "f", "func()", "func")

func _() {
	qux(f) //@snippet(")", vVarArg, "f")
}

func _() {
	foo(0, []string{}...) //@complete(")")
}

-- variadic_intf.go --
package variadic

type baz interface {
	baz()
}

func wantsBaz(...baz) {}

type bazImpl int

func (bazImpl) baz() {}

func _() {
	var (
		impls []bazImpl //@item(vImplSlice, "impls", "[]bazImpl", "var")
		impl  bazImpl   //@item(vImpl, "impl", "bazImpl", "var")
		bazes []baz     //@item(vIntfSlice, "bazes", "[]baz", "var")
	)

	wantsBaz() //@rank(")", vImpl, vImplSlice),rank(")", vIntfSlice, vImplSlice)
}
