This test exercises completion around various statements.

-- flags --
-ignore_extra_diags

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

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

-- append.go --
package statements

func _() {
	type mySlice []int

	var (
		abc    []int   //@item(stmtABC, "abc", "[]int", "var")
		abcdef mySlice //@item(stmtABCDEF, "abcdef", "mySlice", "var")
	)

	/* abcdef = append(abcdef, ) */ //@item(stmtABCDEFAssignAppend, "abcdef = append(abcdef, )", "", "func")

	// don't offer "abc = append(abc, )" because "abc" isn't necessarily
	// better than "abcdef".
	abc //@complete(" //", stmtABC, stmtABCDEF)

	abcdef //@complete(" //", stmtABCDEF, stmtABCDEFAssignAppend)

	/* append(abc, ) */ //@item(stmtABCAppend, "append(abc, )", "", "func")

	abc = app //@snippet(" //", stmtABCAppend, "append(abc, ${1:})")
}

func _() {
	var s struct{ xyz []int }

	/* xyz = append(s.xyz, ) */ //@item(stmtXYZAppend, "xyz = append(s.xyz, )", "", "func")

	s.x //@snippet(" //", stmtXYZAppend, "xyz = append(s.xyz, ${1:})")

	/* s.xyz = append(s.xyz, ) */ //@item(stmtDeepXYZAppend, "s.xyz = append(s.xyz, )", "", "func")

	sx //@snippet(" //", stmtDeepXYZAppend, "s.xyz = append(s.xyz, ${1:})")
}

func _() {
	var foo [][]int

	/* append(foo[0], ) */ //@item(stmtFooAppend, "append(foo[0], )", "", "func")

	foo[0] = app //@complete(" //", stmtFooAppend),snippet(" //", stmtFooAppend, "append(foo[0], ${1:})")
}

-- if_err_check_return.go --
package statements

import (
	"bytes"
	"io"
	"os"
)

func one() (int, float32, io.Writer, *int, []int, bytes.Buffer, error) {
	/* if err != nil { return err } */ //@item(stmtOneIfErrReturn, "if err != nil { return err }", "", "")
	/* err != nil { return err } */ //@item(stmtOneErrReturn, "err != nil { return err }", "", "")

	_, err := os.Open("foo")
	//@snippet("", stmtOneIfErrReturn, "if err != nil {\n\treturn 0, 0, nil, nil, nil, bytes.Buffer{\\}, ${1:err}\n\\}")

	_, err = os.Open("foo")
	i //@snippet(" //", stmtOneIfErrReturn, "if err != nil {\n\treturn 0, 0, nil, nil, nil, bytes.Buffer{\\}, ${1:err}\n\\}")

	_, err = os.Open("foo")
	if er //@snippet(" //", stmtOneErrReturn, "err != nil {\n\treturn 0, 0, nil, nil, nil, bytes.Buffer{\\}, ${1:err}\n\\}")

	_, err = os.Open("foo")
	if //@snippet(" //", stmtOneIfErrReturn, "if err != nil {\n\treturn 0, 0, nil, nil, nil, bytes.Buffer{\\}, ${1:err}\n\\}")

	_, err = os.Open("foo")
	if //@snippet("//", stmtOneIfErrReturn, "if err != nil {\n\treturn 0, 0, nil, nil, nil, bytes.Buffer{\\}, ${1:err}\n\\}")
}

-- if_err_check_return2.go --
package statements

import "os"

func two() error {
	var s struct{ err error }

	/* if s.err != nil { return s.err } */ //@item(stmtTwoIfErrReturn, "if s.err != nil { return s.err }", "", "")

	_, s.err = os.Open("foo")
	//@snippet("", stmtTwoIfErrReturn, "if s.err != nil {\n\treturn ${1:s.err}\n\\}")
}

-- if_err_check_test.go --
package statements

import (
	"os"
	"testing"
)

func TestErr(t *testing.T) {
	/* if err != nil { t.Fatal(err) } */ //@item(stmtOneIfErrTFatal, "if err != nil { t.Fatal(err) }", "", "")

	_, err := os.Open("foo")
	//@snippet("", stmtOneIfErrTFatal, "if err != nil {\n\tt.Fatal(err)\n\\}")
}

func BenchmarkErr(b *testing.B) {
	/* if err != nil { b.Fatal(err) } */ //@item(stmtOneIfErrBFatal, "if err != nil { b.Fatal(err) }", "", "")

	_, err := os.Open("foo")
	//@snippet("", stmtOneIfErrBFatal, "if err != nil {\n\tb.Fatal(err)\n\\}")
}

-- return.go --
package statements

//@item(stmtReturnZeroValues, `return 0, "", nil`)

func foo() (int, string, error) {
	ret //@snippet(" ", stmtReturnZeroValues, "return ${1:0}, ${2:\"\"}, ${3:nil}")
}

func bar() (int, string, error) {
	return //@snippet(" ", stmtReturnZeroValues, "return ${1:0}, ${2:\"\"}, ${3:nil}")
}
