This test checks that completion works as expected in the presence of
incomplete statements that may affect parser recovery.

-- flags --
-ignore_extra_diags

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

go 1.18

-- settings.json --
{
	"completeUnimported": false,
	"deepCompletion": false
}

-- dangling_for.go --
package danglingstmt

func _() {
	for bar //@rank(" //", danglingBar)
}

func bar() bool { //@item(danglingBar, "bar", "func() bool", "func")
	return true
}

-- dangling_for_init.go --
package danglingstmt

func _() {
	for i := bar //@rank(" //", danglingBar2)
}

func bar2() int { //@item(danglingBar2, "bar2", "func() int", "func")
	return 0
}

-- dangling_for_init_cond.go --
package danglingstmt

func _() {
	for i := bar3(); i > bar //@rank(" //", danglingBar3)
}

func bar3() int { //@item(danglingBar3, "bar3", "func() int", "func")
	return 0
}

-- dangling_for_init_cond_post.go --
package danglingstmt

func _() {
	for i := bar4(); i > bar4(); i += bar //@rank(" //", danglingBar4)
}

func bar4() int { //@item(danglingBar4, "bar4", "func() int", "func")
	return 0
}

-- dangling_if.go --
package danglingstmt

func _() {
	if foo //@rank(" //", danglingFoo)
}

func foo() bool { //@item(danglingFoo, "foo", "func() bool", "func")
	return true
}

-- dangling_if_eof.go --
package danglingstmt

func bar5() bool { //@item(danglingBar5, "bar5", "func() bool", "func")
	return true
}

func _() {
	if b //@rank(" //", danglingBar5)

-- dangling_if_init.go --
package danglingstmt

func _() {
	if i := foo //@rank(" //", danglingFoo2)
}

func foo2() bool { //@item(danglingFoo2, "foo2", "func() bool", "func")
	return true
}

-- dangling_if_init_cond.go --
package danglingstmt

func _() {
	if i := 123; foo //@rank(" //", danglingFoo3)
}

func foo3() bool { //@item(danglingFoo3, "foo3", "func() bool", "func")
	return true
}

-- dangling_multiline_if.go --
package danglingstmt

func walrus() bool { //@item(danglingWalrus, "walrus", "func() bool", "func")
	return true
}

func _() {
	if true &&
		walrus //@complete(" //", danglingWalrus)
}

-- dangling_selector_1.go --
package danglingstmt

func _() {
	x. //@rank(" //", danglingI)
}

var x struct { i int } //@item(danglingI, "i", "int", "field")

-- dangling_selector_2.go --
package danglingstmt

// TODO: re-enable this test, which was broken when the foo package was removed.
// (we can replicate the relevant definitions in the new marker test)
// import "golang.org/lsptests/foo"

func _() {
	foo. // rank(" //", Foo)
	var _ = []string{foo.} // rank("}", Foo)
}

-- dangling_switch_init.go --
package danglingstmt

func _() {
	switch i := baz //@rank(" //", danglingBaz)
}

func baz() int { //@item(danglingBaz, "baz", "func() int", "func")
	return 0
}

-- dangling_switch_init_tag.go --
package danglingstmt

func _() {
	switch i := 0; baz //@rank(" //", danglingBaz2)
}

func baz2() int { //@item(danglingBaz2, "baz2", "func() int", "func")
	return 0
}
