This test exercises the refactoring to remove unused parameters, with resolve support.
See removeparam.txt for same test without resolve support.

-- capabilities.json --
{
	"textDocument": {
		"codeAction": {
			"dataSupport": true,
			"resolveSupport": {
				"properties": ["edit"]
			}
		}
	}
}
-- go.mod --
module unused.mod

go 1.18

-- a/a.go --
package a

func A(x, unused int) int { //@codeaction("unused", "unused", "refactor.rewrite", a)
	return x
}

-- @a/a/a.go --
package a

func A(x int) int { //@codeaction("unused", "unused", "refactor.rewrite", a)
	return x
}

-- a/a2.go --
package a

func _() {
	A(1, 2)
}

-- a/a_test.go --
package a

func _() {
	A(1, 2)
}

-- a/a_x_test.go --
package a_test

import "unused.mod/a"

func _() {
	a.A(1, 2)
}

-- b/b.go --
package b

import "unused.mod/a"

func f() int {
	return 1
}

func g() int {
	return 2
}

func _() {
	a.A(f(), 1)
}

-- @a/a/a2.go --
package a

func _() {
	A(1)
}
-- @a/a/a_test.go --
package a

func _() {
	A(1)
}
-- @a/a/a_x_test.go --
package a_test

import "unused.mod/a"

func _() {
	a.A(1)
}
-- @a/b/b.go --
package b

import "unused.mod/a"

func f() int {
	return 1
}

func g() int {
	return 2
}

func _() {
	a.A(f())
}
-- field/field.go --
package field

func Field(x int, field int) { //@codeaction("int", "int", "refactor.rewrite", field, "Refactor: remove unused parameter")
}

func _() {
	Field(1, 2)
}
-- @field/field/field.go --
package field

func Field(field int) { //@codeaction("int", "int", "refactor.rewrite", field, "Refactor: remove unused parameter")
}

func _() {
	Field(2)
}
-- ellipsis/ellipsis.go --
package ellipsis

func Ellipsis(...any) { //@codeaction("any", "any", "refactor.rewrite", ellipsis)
}

func _() {
	// TODO(rfindley): investigate the broken formatting resulting from these inlinings.
	Ellipsis()
	Ellipsis(1)
	Ellipsis(1, 2)
	Ellipsis(1, f(), g())
	Ellipsis(h())
	Ellipsis(i()...)
}

func f() int
func g() int
func h() (int, int)
func i() []any

-- @ellipsis/ellipsis/ellipsis.go --
package ellipsis

func Ellipsis() { //@codeaction("any", "any", "refactor.rewrite", ellipsis)
}

func _() {
	// TODO(rfindley): investigate the broken formatting resulting from these inlinings.
	Ellipsis()
	Ellipsis()
	Ellipsis()
	var _ []any = []any{1, f(), g()}
	Ellipsis()
	func(_ ...any) {
		Ellipsis()
	}(h())
	var _ []any = i()
	Ellipsis()
}

func f() int
func g() int
func h() (int, int)
func i() []any
-- ellipsis2/ellipsis2.go --
package ellipsis2

func Ellipsis2(_, _ int, rest ...int) { //@codeaction("_", "_", "refactor.rewrite", ellipsis2, "Refactor: remove unused parameter")
}

func _() {
	Ellipsis2(1,2,3)
	Ellipsis2(h())
	Ellipsis2(1,2, []int{3, 4}...)
}

func h() (int, int)

-- @ellipsis2/ellipsis2/ellipsis2.go --
package ellipsis2

func Ellipsis2(_ int, rest ...int) { //@codeaction("_", "_", "refactor.rewrite", ellipsis2, "Refactor: remove unused parameter")
}

func _() {
	Ellipsis2(2, []int{3}...)
	func(_, blank0 int, rest ...int) {
		Ellipsis2(blank0, rest...)
	}(h())
	Ellipsis2(2, []int{3, 4}...)
}

func h() (int, int)
-- overlapping/overlapping.go --
package overlapping

func Overlapping(i int) int { //@codeactionerr(re"(i) int", re"(i) int", "refactor.rewrite", re"overlapping")
	return 0
}

func _() {
	x := Overlapping(Overlapping(0))
	_ = x
}

-- effects/effects.go --
package effects

func effects(x, y int) int { //@codeaction("y", "y", "refactor.rewrite", effects), diag("y", re"unused")
	return x
}

func f() int
func g() int

func _() {
	effects(f(), g())
	effects(f(), g())
}
-- @effects/effects/effects.go --
package effects

func effects(x int) int { //@codeaction("y", "y", "refactor.rewrite", effects), diag("y", re"unused")
	return x
}

func f() int
func g() int

func _() {
	var x, _ int = f(), g()
	effects(x)
	{
		var x, _ int = f(), g()
		effects(x)
	}
}
-- recursive/recursive.go --
package recursive

func Recursive(x int) int { //@codeaction("x", "x", "refactor.rewrite", recursive)
	return Recursive(1)
}

-- @recursive/recursive/recursive.go --
package recursive

func Recursive() int { //@codeaction("x", "x", "refactor.rewrite", recursive)
	return Recursive()
}
