package pkg

import "fmt"

func fn1() {
	var x int
	x = gen() // want `this value of x is never used`
	x = gen()
	println(x)

	var y int
	if true {
		y = gen() // want `this value of y is never used`
	}
	y = gen()
	println(y)
}

func gen() int {
	println() // make it unpure
	return 0
}

func fn2() {
	x, y := gen(), gen() // want `this value of x is never used` `this value of y is never used`
	x, y = gen(), gen()
	println(x, y)
}

func fn3() {
	x := uint32(0)
	if true {
		x = 1
	} else {
		x = 2
	}
	println(x)
}

func gen2() (int, int) {
	println()
	return 0, 0
}

func fn4() {
	x, y := gen2() // want `this value of x is never used`
	println(y)
	x, y = gen2() // want `this value of x is never used` `this value of y is never used`
	x, _ = gen2() // want `this value of x is never used`
	x, y = gen2()
	println(x, y)
}

func fn5(m map[string]string) {
	v, ok := m[""] // want `this value of v is never used` `this value of ok is never used`
	v, ok = m[""]
	println(v, ok)
}

func fn6() {
	x := gen()
	// Do not report variables if they've been assigned to the blank identifier
	_ = x
}

func fn7() {
	func() {
		var x int
		x = gen() // want `this value of x is never used`
		x = gen()
		println(x)
	}()
}

func fn() int { println(); return 0 }

var y = func() {
	v := fn() // want `never used`
	v = fn()
	println(v)
}

func fn8() {
	x := gen()
	switch x {
	}

	y := gen() // want `this value of y is never used`
	y = gen()
	switch y {
	}

	z, _ := gen2()
	switch z {
	}

	_, a := gen2()
	switch a {
	}

	b, c := gen2() // want `this value of b is never used`
	println(c)
	b, c = gen2() // want `this value of c is never used`
	switch b {
	}
}

func fn9() {
	xs := []int{}
	for _, x := range xs {
		foo, err := work(x) // want `this value of foo is never used`
		if err != nil {
			return
		}
		if !foo {
			continue
		}
	}
}

func work(int) (bool, error) { return false, nil }

func resolveWeakTypes(types []int) {
	for i := range types {
		runEnd := findRunLimit(i)

		if true {
			_ = runEnd
		}
		i = runEnd // want `this value of i is never used`
	}
}

func findRunLimit(int) int { return 0 }

func fn10() {
	slice := []string(nil)
	if true {
		slice = []string{"1", "2"}
	} else {
		slice = []string{"3", "4"}
	}
	fmt.Println(slice)
}
