This test exercises the refactoring of putting arguments, return values, and composite literal elements
into separate lines.

-- go.mod --
module unused.mod

go 1.18

-- func_arg/func_arg.go --
package func_arg

func A(a string, b, c int64, x int, y int) (r1 string, r2, r3 int64, r4 int, r5 int) { //@codeaction("x", "x", "refactor.rewrite", func_arg)
	return a, b, c, x, y
}

-- @func_arg/func_arg/func_arg.go --
package func_arg

func A(
	a string,
	b, c int64,
	x int,
	y int,
) (r1 string, r2, r3 int64, r4 int, r5 int) { //@codeaction("x", "x", "refactor.rewrite", func_arg)
	return a, b, c, x, y
}

-- func_ret/func_ret.go --
package func_ret

func A(a string, b, c int64, x int, y int) (r1 string, r2, r3 int64, r4 int, r5 int) { //@codeaction("r1", "r1", "refactor.rewrite", func_ret)
	return a, b, c, x, y
}

-- @func_ret/func_ret/func_ret.go --
package func_ret

func A(a string, b, c int64, x int, y int) (
	r1 string,
	r2, r3 int64,
	r4 int,
	r5 int,
) { //@codeaction("r1", "r1", "refactor.rewrite", func_ret)
	return a, b, c, x, y
}

-- functype_arg/functype_arg.go --
package functype_arg

type A func(a string, b, c int64, x int, y int) (r1 string, r2, r3 int64, r4 int, r5 int) //@codeaction("x", "x", "refactor.rewrite", functype_arg)

-- @functype_arg/functype_arg/functype_arg.go --
package functype_arg

type A func(
	a string,
	b, c int64,
	x int,
	y int,
) (r1 string, r2, r3 int64, r4 int, r5 int) //@codeaction("x", "x", "refactor.rewrite", functype_arg)

-- functype_ret/functype_ret.go --
package functype_ret

type A func(a string, b, c int64, x int, y int) (r1 string, r2, r3 int64, r4 int, r5 int) //@codeaction("r1", "r1", "refactor.rewrite", functype_ret)

-- @functype_ret/functype_ret/functype_ret.go --
package functype_ret

type A func(a string, b, c int64, x int, y int) (
	r1 string,
	r2, r3 int64,
	r4 int,
	r5 int,
) //@codeaction("r1", "r1", "refactor.rewrite", functype_ret)

-- func_call/func_call.go --
package func_call

import "fmt"

func a() {
	fmt.Println(1, 2, 3, fmt.Sprintf("hello %d", 4)) //@codeaction("1", "1", "refactor.rewrite", func_call)
}

-- @func_call/func_call/func_call.go --
package func_call

import "fmt"

func a() {
	fmt.Println(
		1,
		2,
		3,
		fmt.Sprintf("hello %d", 4),
	) //@codeaction("1", "1", "refactor.rewrite", func_call)
}

-- indent/indent.go --
package indent

import "fmt"

func a() {
	fmt.Println(1, 2, 3, fmt.Sprintf("hello %d", 4)) //@codeaction("hello", "hello", "refactor.rewrite", indent, "Split parameters into separate lines")
}

-- @indent/indent/indent.go --
package indent

import "fmt"

func a() {
	fmt.Println(1, 2, 3, fmt.Sprintf(
		"hello %d",
		4,
	)) //@codeaction("hello", "hello", "refactor.rewrite", indent, "Split parameters into separate lines")
}

-- indent2/indent2.go --
package indent2

import "fmt"

func a() {
	fmt.
		Println(1, 2, 3, fmt.Sprintf("hello %d", 4)) //@codeaction("1", "1", "refactor.rewrite", indent2, "Split parameters into separate lines")
}

-- @indent2/indent2/indent2.go --
package indent2

import "fmt"

func a() {
	fmt.
		Println(
			1,
			2,
			3,
			fmt.Sprintf("hello %d", 4),
		) //@codeaction("1", "1", "refactor.rewrite", indent2, "Split parameters into separate lines")
}

-- structelts/structelts.go --
package structelts

type A struct{
	a int
	b int
}

func a() {
	_ = A{a: 1, b: 2} //@codeaction("b", "b", "refactor.rewrite", structelts)
}

-- @structelts/structelts/structelts.go --
package structelts

type A struct{
	a int
	b int
}

func a() {
	_ = A{
		a: 1,
		b: 2,
	} //@codeaction("b", "b", "refactor.rewrite", structelts)
}

-- sliceelts/sliceelts.go --
package sliceelts

func a() {
	_ = []int{1, 2} //@codeaction("1", "1", "refactor.rewrite", sliceelts)
}

-- @sliceelts/sliceelts/sliceelts.go --
package sliceelts

func a() {
	_ = []int{
		1,
		2,
	} //@codeaction("1", "1", "refactor.rewrite", sliceelts)
}

-- mapelts/mapelts.go --
package mapelts

func a() {
	_ = map[string]int{"a": 1, "b": 2} //@codeaction("1", "1", "refactor.rewrite", mapelts)
}

-- @mapelts/mapelts/mapelts.go --
package mapelts

func a() {
	_ = map[string]int{
		"a": 1,
		"b": 2,
	} //@codeaction("1", "1", "refactor.rewrite", mapelts)
}

-- starcomment/starcomment.go --
package starcomment

func A(/*1*/ x /*2*/ string /*3*/, /*4*/ y /*5*/ int /*6*/) (string, int) { //@codeaction("x", "x", "refactor.rewrite", starcomment)
	return x, y
}

-- @starcomment/starcomment/starcomment.go --
package starcomment

func A(
	/*1*/ x /*2*/ string /*3*/,
	/*4*/ y /*5*/ int /*6*/,
) (string, int) { //@codeaction("x", "x", "refactor.rewrite", starcomment)
	return x, y
}

