This test checks the behavior of the 'extract to a new file' code action.

-- flags --
-ignore_extra_diags
-errors_ok

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

go 1.18

-- a.go --
package main

// docs
func fn() {} //@codeaction("func", "refactor.extract.toNewFile", edit=function_declaration)

func fn2() {} //@codeaction("fn2", "refactor.extract.toNewFile", edit=only_select_func_name)

func fn3() {} //@codeaction(re`()fn3`, "refactor.extract.toNewFile", edit=zero_width_selection_on_func_name)

// docs
type T int //@codeaction("type", "refactor.extract.toNewFile", edit=type_declaration)

// docs
var V int //@codeaction("var", "refactor.extract.toNewFile", edit=var_declaration)

// docs
const K = "" //@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration)

const ( //@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration_multiple_specs)
    P = iota
    Q
    R
)

func fnA () {} //@codeaction("func", "refactor.extract.toNewFile", end=mdEnd, result=multiple_declarations)

// unattached comment

func fnB () {} //@loc(mdEnd, "}")

-- @const_declaration_multiple_specs/p.go --
@@ -0,0 +1,7 @@
+package main
+
+const ( //@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration_multiple_specs)
+	P = iota
+	Q
+	R
+)
-- @multiple_declarations/fna.go --
package main

func fnA() {} //@codeaction("func", "refactor.extract.toNewFile", end=mdEnd, result=multiple_declarations)

// unattached comment

func fnB() {}
-- @multiple_declarations/a.go --
package main

// docs
func fn() {} //@codeaction("func", "refactor.extract.toNewFile", edit=function_declaration)

func fn2() {} //@codeaction("fn2", "refactor.extract.toNewFile", edit=only_select_func_name)

func fn3() {} //@codeaction(re`()fn3`, "refactor.extract.toNewFile", edit=zero_width_selection_on_func_name)

// docs
type T int //@codeaction("type", "refactor.extract.toNewFile", edit=type_declaration)

// docs
var V int //@codeaction("var", "refactor.extract.toNewFile", edit=var_declaration)

// docs
const K = "" //@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration)

const ( //@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration_multiple_specs)
    P = iota
    Q
    R
)

//@loc(mdEnd, "}")

-- @const_declaration_multiple_specs/a.go --
@@ -19,6 +19 @@
-const ( //@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration_multiple_specs)
-    P = iota
-    Q
-    R
-)
-
-- existing.go --
-- existing2.go --
-- existing2.1.go --
-- b.go --
package main
func existing() {} //@codeaction("func", "refactor.extract.toNewFile", edit=file_name_conflict)
func existing2() {} //@codeaction("func", "refactor.extract.toNewFile", edit=file_name_conflict_again)

-- single_import.go --
package main
import "fmt"
func F() { //@codeaction("func", "refactor.extract.toNewFile", edit=single_import)
    fmt.Println()
}

-- multiple_imports.go --
package main
import (
    "fmt"
    "log"
    time1 "time"
)
func init(){
    log.Println()
}
func F() { //@codeaction("func", "refactor.extract.toNewFile", edit=multiple_imports)
    fmt.Println()
}
func g() string{ //@codeaction("func", "refactor.extract.toNewFile", edit=renamed_import)
    return time1.Now().string()
}

-- blank_import.go --
package main
import _ "fmt"
func F() {} //@codeaction("func", "refactor.extract.toNewFile", edit=blank_import)



-- @blank_import/blank_import.go --
@@ -3 +3 @@
-func F() {} //@codeaction("func", "refactor.extract.toNewFile", edit=blank_import)
+//@codeaction("func", "refactor.extract.toNewFile", edit=blank_import)
-- @blank_import/f.go --
@@ -0,0 +1,3 @@
+package main
+
+func F() {}
-- @const_declaration/a.go --
@@ -16,2 +16 @@
-// docs
-const K = "" //@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration)
+//@codeaction("const", "refactor.extract.toNewFile", edit=const_declaration)
-- @const_declaration/k.go --
@@ -0,0 +1,4 @@
+package main
+
+// docs
+const K = ""
-- @file_name_conflict/b.go --
@@ -2 +2 @@
-func existing() {} //@codeaction("func", "refactor.extract.toNewFile", edit=file_name_conflict)
+//@codeaction("func", "refactor.extract.toNewFile", edit=file_name_conflict)
-- @file_name_conflict/existing.1.go --
@@ -0,0 +1,3 @@
+package main
+
+func existing() {}
-- @file_name_conflict_again/b.go --
@@ -3 +3 @@
-func existing2() {} //@codeaction("func", "refactor.extract.toNewFile", edit=file_name_conflict_again)
+//@codeaction("func", "refactor.extract.toNewFile", edit=file_name_conflict_again)
-- @file_name_conflict_again/existing2.2.go --
@@ -0,0 +1,3 @@
+package main
+
+func existing2() {}
-- @function_declaration/a.go --
@@ -3,2 +3 @@
-// docs
-func fn() {} //@codeaction("func", "refactor.extract.toNewFile", edit=function_declaration)
+//@codeaction("func", "refactor.extract.toNewFile", edit=function_declaration)
-- @function_declaration/fn.go --
@@ -0,0 +1,4 @@
+package main
+
+// docs
+func fn() {}
-- @multiple_imports/f.go --
@@ -0,0 +1,9 @@
+package main
+
+import (
+	"fmt"
+)
+
+func F() { //@codeaction("func", "refactor.extract.toNewFile", edit=multiple_imports)
+	fmt.Println()
+}
-- @multiple_imports/multiple_imports.go --
@@ -3 +3 @@
-    "fmt"
+    
@@ -10,3 +10 @@
-func F() { //@codeaction("func", "refactor.extract.toNewFile", edit=multiple_imports)
-    fmt.Println()
-}
-- @only_select_func_name/a.go --
@@ -6 +6 @@
-func fn2() {} //@codeaction("fn2", "refactor.extract.toNewFile", edit=only_select_func_name)
+//@codeaction("fn2", "refactor.extract.toNewFile", edit=only_select_func_name)
-- @only_select_func_name/fn2.go --
@@ -0,0 +1,3 @@
+package main
+
+func fn2() {}
-- @single_import/f.go --
@@ -0,0 +1,9 @@
+package main
+
+import (
+	"fmt"
+)
+
+func F() { //@codeaction("func", "refactor.extract.toNewFile", edit=single_import)
+	fmt.Println()
+}
-- @single_import/single_import.go --
@@ -2,4 +2 @@
-import "fmt"
-func F() { //@codeaction("func", "refactor.extract.toNewFile", edit=single_import)
-    fmt.Println()
-}
-- @type_declaration/a.go --
@@ -10,2 +10 @@
-// docs
-type T int //@codeaction("type", "refactor.extract.toNewFile", edit=type_declaration)
+//@codeaction("type", "refactor.extract.toNewFile", edit=type_declaration)
-- @type_declaration/t.go --
@@ -0,0 +1,4 @@
+package main
+
+// docs
+type T int
-- @var_declaration/a.go --
@@ -13,2 +13 @@
-// docs
-var V int //@codeaction("var", "refactor.extract.toNewFile", edit=var_declaration)
+//@codeaction("var", "refactor.extract.toNewFile", edit=var_declaration)
-- @var_declaration/v.go --
@@ -0,0 +1,4 @@
+package main
+
+// docs
+var V int
-- @zero_width_selection_on_func_name/a.go --
@@ -8 +8 @@
-func fn3() {} //@codeaction(re`()fn3`, "refactor.extract.toNewFile", edit=zero_width_selection_on_func_name)
+//@codeaction(re`()fn3`, "refactor.extract.toNewFile", edit=zero_width_selection_on_func_name)
-- @zero_width_selection_on_func_name/fn3.go --
@@ -0,0 +1,3 @@
+package main
+
+func fn3() {}
-- @renamed_import/g.go --
@@ -0,0 +1,9 @@
+package main
+
+import (
+	time1 "time"
+)
+
+func g() string { //@codeaction("func", "refactor.extract.toNewFile", edit=renamed_import)
+	return time1.Now().string()
+}
-- @renamed_import/multiple_imports.go --
@@ -5 +5 @@
-    time1 "time"
+    
@@ -13,4 +13 @@
-func g() string{ //@codeaction("func", "refactor.extract.toNewFile", edit=renamed_import)
-    return time1.Now().string()
-}
-
-- copyright.go --
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

// docs
const C = "" //@codeaction("const", "refactor.extract.toNewFile", edit=copyright)

-- @copyright/c.go --
@@ -0,0 +1,8 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+// docs
+const C = ""
-- @copyright/copyright.go --
@@ -7,2 +7 @@
-// docs
-const C = "" //@codeaction("const", "refactor.extract.toNewFile", edit=copyright)
+//@codeaction("const", "refactor.extract.toNewFile", edit=copyright)
-- buildconstraint.go --
//go:build go1.18

package main

// docs
const C = "" //@codeaction("const", "refactor.extract.toNewFile", edit=buildconstraint)

-- @buildconstraint/buildconstraint.go --
@@ -5,2 +5 @@
-// docs
-const C = "" //@codeaction("const", "refactor.extract.toNewFile", edit=buildconstraint)
+//@codeaction("const", "refactor.extract.toNewFile", edit=buildconstraint)
-- @buildconstraint/c.go --
@@ -0,0 +1,6 @@
+//go:build go1.18
+
+package main
+
+// docs
+const C = ""
-- copyrightandbuildconstraint.go --
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build go1.18

package main

// docs
const C = "" //@codeaction("const", "refactor.extract.toNewFile", edit=copyrightandbuildconstraint)
-- @copyrightandbuildconstraint/c.go --
@@ -0,0 +1,10 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build go1.18
+
+package main
+
+// docs
+const C = ""
-- @copyrightandbuildconstraint/copyrightandbuildconstraint.go --
@@ -9,2 +9 @@
-// docs
-const C = "" //@codeaction("const", "refactor.extract.toNewFile", edit=copyrightandbuildconstraint)
+//@codeaction("const", "refactor.extract.toNewFile", edit=copyrightandbuildconstraint)

-- parsererror.go --
package main

func foo() { //@codeaction("foo", "refactor.extract.toNewFile", err=re"failed to format extracted source")
	for i := struct

