aboutsummaryrefslogtreecommitdiff
path: root/gopls/internal/lsp/testdata/stub
diff options
context:
space:
mode:
Diffstat (limited to 'gopls/internal/lsp/testdata/stub')
-rw-r--r--gopls/internal/lsp/testdata/stub/other/other.go10
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_add_selector.go12
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_add_selector.go.golden19
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_assign.go10
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_assign.go.golden17
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_assign_multivars.go11
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_assign_multivars.go.golden18
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_call_expr.go13
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_call_expr.go.golden20
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_embedded.go15
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_embedded.go.golden37
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_err.go7
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_err.go.golden14
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_function_return.go11
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_function_return.go.golden18
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_generic_receiver.go15
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_generic_receiver.go.golden22
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_ignored_imports.go18
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_ignored_imports.go.golden25
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_issue2606.go7
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_issue2606.go.golden14
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_multi_var.go11
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_multi_var.go.golden18
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_pointer.go9
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_pointer.go.golden16
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_renamed_import.go11
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_renamed_import.go.golden18
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go13
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go.golden22
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_stdlib.go9
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_stdlib.go.golden16
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_typedecl_group.go27
-rw-r--r--gopls/internal/lsp/testdata/stub/stub_typedecl_group.go.golden39
33 files changed, 542 insertions, 0 deletions
diff --git a/gopls/internal/lsp/testdata/stub/other/other.go b/gopls/internal/lsp/testdata/stub/other/other.go
new file mode 100644
index 000000000..ba3c1747a
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/other/other.go
@@ -0,0 +1,10 @@
+package other
+
+import (
+ "bytes"
+ renamed_context "context"
+)
+
+type Interface interface {
+ Get(renamed_context.Context) *bytes.Buffer
+}
diff --git a/gopls/internal/lsp/testdata/stub/stub_add_selector.go b/gopls/internal/lsp/testdata/stub/stub_add_selector.go
new file mode 100644
index 000000000..4037b7ad3
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_add_selector.go
@@ -0,0 +1,12 @@
+package stub
+
+import "io"
+
+// This file tests that if an interface
+// method references a type from its own package
+// then our implementation must add the import/package selector
+// in the concrete method if the concrete type is outside of the interface
+// package
+var _ io.ReaderFrom = &readerFrom{} //@suggestedfix("&readerFrom", "refactor.rewrite", "")
+
+type readerFrom struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_add_selector.go.golden b/gopls/internal/lsp/testdata/stub/stub_add_selector.go.golden
new file mode 100644
index 000000000..8f08ca1ef
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_add_selector.go.golden
@@ -0,0 +1,19 @@
+-- suggestedfix_stub_add_selector_10_23 --
+package stub
+
+import "io"
+
+// This file tests that if an interface
+// method references a type from its own package
+// then our implementation must add the import/package selector
+// in the concrete method if the concrete type is outside of the interface
+// package
+var _ io.ReaderFrom = &readerFrom{} //@suggestedfix("&readerFrom", "refactor.rewrite", "")
+
+type readerFrom struct{}
+
+// ReadFrom implements io.ReaderFrom
+func (*readerFrom) ReadFrom(r io.Reader) (n int64, err error) {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_assign.go b/gopls/internal/lsp/testdata/stub/stub_assign.go
new file mode 100644
index 000000000..d3f09313f
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_assign.go
@@ -0,0 +1,10 @@
+package stub
+
+import "io"
+
+func main() {
+ var br io.ByteWriter
+ br = &byteWriter{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type byteWriter struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_assign.go.golden b/gopls/internal/lsp/testdata/stub/stub_assign.go.golden
new file mode 100644
index 000000000..f15354241
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_assign.go.golden
@@ -0,0 +1,17 @@
+-- suggestedfix_stub_assign_7_7 --
+package stub
+
+import "io"
+
+func main() {
+ var br io.ByteWriter
+ br = &byteWriter{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type byteWriter struct{}
+
+// WriteByte implements io.ByteWriter
+func (*byteWriter) WriteByte(c byte) error {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_assign_multivars.go b/gopls/internal/lsp/testdata/stub/stub_assign_multivars.go
new file mode 100644
index 000000000..bd36d6833
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_assign_multivars.go
@@ -0,0 +1,11 @@
+package stub
+
+import "io"
+
+func main() {
+ var br io.ByteWriter
+ var i int
+ i, br = 1, &multiByteWriter{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type multiByteWriter struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_assign_multivars.go.golden b/gopls/internal/lsp/testdata/stub/stub_assign_multivars.go.golden
new file mode 100644
index 000000000..425d11746
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_assign_multivars.go.golden
@@ -0,0 +1,18 @@
+-- suggestedfix_stub_assign_multivars_8_13 --
+package stub
+
+import "io"
+
+func main() {
+ var br io.ByteWriter
+ var i int
+ i, br = 1, &multiByteWriter{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type multiByteWriter struct{}
+
+// WriteByte implements io.ByteWriter
+func (*multiByteWriter) WriteByte(c byte) error {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_call_expr.go b/gopls/internal/lsp/testdata/stub/stub_call_expr.go
new file mode 100644
index 000000000..0c3094665
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_call_expr.go
@@ -0,0 +1,13 @@
+package stub
+
+func main() {
+ check(&callExpr{}) //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+func check(err error) {
+ if err != nil {
+ panic(err)
+ }
+}
+
+type callExpr struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_call_expr.go.golden b/gopls/internal/lsp/testdata/stub/stub_call_expr.go.golden
new file mode 100644
index 000000000..c82d22440
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_call_expr.go.golden
@@ -0,0 +1,20 @@
+-- suggestedfix_stub_call_expr_4_8 --
+package stub
+
+func main() {
+ check(&callExpr{}) //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+func check(err error) {
+ if err != nil {
+ panic(err)
+ }
+}
+
+type callExpr struct{}
+
+// Error implements error
+func (*callExpr) Error() string {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_embedded.go b/gopls/internal/lsp/testdata/stub/stub_embedded.go
new file mode 100644
index 000000000..f66989e9f
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_embedded.go
@@ -0,0 +1,15 @@
+package stub
+
+import (
+ "io"
+ "sort"
+)
+
+var _ embeddedInterface = (*embeddedConcrete)(nil) //@suggestedfix("(", "refactor.rewrite", "")
+
+type embeddedConcrete struct{}
+
+type embeddedInterface interface {
+ sort.Interface
+ io.Reader
+}
diff --git a/gopls/internal/lsp/testdata/stub/stub_embedded.go.golden b/gopls/internal/lsp/testdata/stub/stub_embedded.go.golden
new file mode 100644
index 000000000..c1ec219e9
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_embedded.go.golden
@@ -0,0 +1,37 @@
+-- suggestedfix_stub_embedded_8_27 --
+package stub
+
+import (
+ "io"
+ "sort"
+)
+
+var _ embeddedInterface = (*embeddedConcrete)(nil) //@suggestedfix("(", "refactor.rewrite", "")
+
+type embeddedConcrete struct{}
+
+// Len implements embeddedInterface
+func (*embeddedConcrete) Len() int {
+ panic("unimplemented")
+}
+
+// Less implements embeddedInterface
+func (*embeddedConcrete) Less(i int, j int) bool {
+ panic("unimplemented")
+}
+
+// Read implements embeddedInterface
+func (*embeddedConcrete) Read(p []byte) (n int, err error) {
+ panic("unimplemented")
+}
+
+// Swap implements embeddedInterface
+func (*embeddedConcrete) Swap(i int, j int) {
+ panic("unimplemented")
+}
+
+type embeddedInterface interface {
+ sort.Interface
+ io.Reader
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_err.go b/gopls/internal/lsp/testdata/stub/stub_err.go
new file mode 100644
index 000000000..121f0e794
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_err.go
@@ -0,0 +1,7 @@
+package stub
+
+func main() {
+ var br error = &customErr{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type customErr struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_err.go.golden b/gopls/internal/lsp/testdata/stub/stub_err.go.golden
new file mode 100644
index 000000000..0b441bdaa
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_err.go.golden
@@ -0,0 +1,14 @@
+-- suggestedfix_stub_err_4_17 --
+package stub
+
+func main() {
+ var br error = &customErr{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type customErr struct{}
+
+// Error implements error
+func (*customErr) Error() string {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_function_return.go b/gopls/internal/lsp/testdata/stub/stub_function_return.go
new file mode 100644
index 000000000..41f17645e
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_function_return.go
@@ -0,0 +1,11 @@
+package stub
+
+import (
+ "io"
+)
+
+func newCloser() io.Closer {
+ return closer{} //@suggestedfix("c", "refactor.rewrite", "")
+}
+
+type closer struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_function_return.go.golden b/gopls/internal/lsp/testdata/stub/stub_function_return.go.golden
new file mode 100644
index 000000000..e90712e69
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_function_return.go.golden
@@ -0,0 +1,18 @@
+-- suggestedfix_stub_function_return_8_9 --
+package stub
+
+import (
+ "io"
+)
+
+func newCloser() io.Closer {
+ return closer{} //@suggestedfix("c", "refactor.rewrite", "")
+}
+
+type closer struct{}
+
+// Close implements io.Closer
+func (closer) Close() error {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_generic_receiver.go b/gopls/internal/lsp/testdata/stub/stub_generic_receiver.go
new file mode 100644
index 000000000..1c00569ea
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_generic_receiver.go
@@ -0,0 +1,15 @@
+//go:build go1.18
+// +build go1.18
+
+package stub
+
+import "io"
+
+// This file tests that that the stub method generator accounts for concrete
+// types that have type parameters defined.
+var _ io.ReaderFrom = &genReader[string, int]{} //@suggestedfix("&genReader", "refactor.rewrite", "Implement io.ReaderFrom")
+
+type genReader[T, Y any] struct {
+ T T
+ Y Y
+}
diff --git a/gopls/internal/lsp/testdata/stub/stub_generic_receiver.go.golden b/gopls/internal/lsp/testdata/stub/stub_generic_receiver.go.golden
new file mode 100644
index 000000000..97935d47e
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_generic_receiver.go.golden
@@ -0,0 +1,22 @@
+-- suggestedfix_stub_generic_receiver_10_23 --
+//go:build go1.18
+// +build go1.18
+
+package stub
+
+import "io"
+
+// This file tests that that the stub method generator accounts for concrete
+// types that have type parameters defined.
+var _ io.ReaderFrom = &genReader[string, int]{} //@suggestedfix("&genReader", "refactor.rewrite", "Implement io.ReaderFrom")
+
+type genReader[T, Y any] struct {
+ T T
+ Y Y
+}
+
+// ReadFrom implements io.ReaderFrom
+func (*genReader[T, Y]) ReadFrom(r io.Reader) (n int64, err error) {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_ignored_imports.go b/gopls/internal/lsp/testdata/stub/stub_ignored_imports.go
new file mode 100644
index 000000000..ca95d2a71
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_ignored_imports.go
@@ -0,0 +1,18 @@
+package stub
+
+import (
+ "compress/zlib"
+ . "io"
+ _ "io"
+)
+
+// This file tests that dot-imports and underscore imports
+// are properly ignored and that a new import is added to
+// reference method types
+
+var (
+ _ Reader
+ _ zlib.Resetter = (*ignoredResetter)(nil) //@suggestedfix("(", "refactor.rewrite", "")
+)
+
+type ignoredResetter struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_ignored_imports.go.golden b/gopls/internal/lsp/testdata/stub/stub_ignored_imports.go.golden
new file mode 100644
index 000000000..d4ab9d86a
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_ignored_imports.go.golden
@@ -0,0 +1,25 @@
+-- suggestedfix_stub_ignored_imports_15_20 --
+package stub
+
+import (
+ "compress/zlib"
+ . "io"
+ _ "io"
+)
+
+// This file tests that dot-imports and underscore imports
+// are properly ignored and that a new import is added to
+// reference method types
+
+var (
+ _ Reader
+ _ zlib.Resetter = (*ignoredResetter)(nil) //@suggestedfix("(", "refactor.rewrite", "")
+)
+
+type ignoredResetter struct{}
+
+// Reset implements zlib.Resetter
+func (*ignoredResetter) Reset(r Reader, dict []byte) error {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_issue2606.go b/gopls/internal/lsp/testdata/stub/stub_issue2606.go
new file mode 100644
index 000000000..66ef2b24b
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_issue2606.go
@@ -0,0 +1,7 @@
+package stub
+
+type I interface{ error }
+
+type C int
+
+var _ I = C(0) //@suggestedfix("C", "refactor.rewrite", "")
diff --git a/gopls/internal/lsp/testdata/stub/stub_issue2606.go.golden b/gopls/internal/lsp/testdata/stub/stub_issue2606.go.golden
new file mode 100644
index 000000000..4db266346
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_issue2606.go.golden
@@ -0,0 +1,14 @@
+-- suggestedfix_stub_issue2606_7_11 --
+package stub
+
+type I interface{ error }
+
+type C int
+
+// Error implements I
+func (C) Error() string {
+ panic("unimplemented")
+}
+
+var _ I = C(0) //@suggestedfix("C", "refactor.rewrite", "")
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_multi_var.go b/gopls/internal/lsp/testdata/stub/stub_multi_var.go
new file mode 100644
index 000000000..06702b222
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_multi_var.go
@@ -0,0 +1,11 @@
+package stub
+
+import "io"
+
+// This test ensures that a variable declaration that
+// has multiple values on the same line can still be
+// analyzed correctly to target the interface implementation
+// diagnostic.
+var one, two, three io.Reader = nil, &multiVar{}, nil //@suggestedfix("&", "refactor.rewrite", "")
+
+type multiVar struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_multi_var.go.golden b/gopls/internal/lsp/testdata/stub/stub_multi_var.go.golden
new file mode 100644
index 000000000..804c7eec6
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_multi_var.go.golden
@@ -0,0 +1,18 @@
+-- suggestedfix_stub_multi_var_9_38 --
+package stub
+
+import "io"
+
+// This test ensures that a variable declaration that
+// has multiple values on the same line can still be
+// analyzed correctly to target the interface implementation
+// diagnostic.
+var one, two, three io.Reader = nil, &multiVar{}, nil //@suggestedfix("&", "refactor.rewrite", "")
+
+type multiVar struct{}
+
+// Read implements io.Reader
+func (*multiVar) Read(p []byte) (n int, err error) {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_pointer.go b/gopls/internal/lsp/testdata/stub/stub_pointer.go
new file mode 100644
index 000000000..e9d8bc688
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_pointer.go
@@ -0,0 +1,9 @@
+package stub
+
+import "io"
+
+func getReaderFrom() io.ReaderFrom {
+ return &pointerImpl{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type pointerImpl struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_pointer.go.golden b/gopls/internal/lsp/testdata/stub/stub_pointer.go.golden
new file mode 100644
index 000000000..a4d765dd4
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_pointer.go.golden
@@ -0,0 +1,16 @@
+-- suggestedfix_stub_pointer_6_9 --
+package stub
+
+import "io"
+
+func getReaderFrom() io.ReaderFrom {
+ return &pointerImpl{} //@suggestedfix("&", "refactor.rewrite", "")
+}
+
+type pointerImpl struct{}
+
+// ReadFrom implements io.ReaderFrom
+func (*pointerImpl) ReadFrom(r io.Reader) (n int64, err error) {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_renamed_import.go b/gopls/internal/lsp/testdata/stub/stub_renamed_import.go
new file mode 100644
index 000000000..54dd59801
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_renamed_import.go
@@ -0,0 +1,11 @@
+package stub
+
+import (
+ "compress/zlib"
+ myio "io"
+)
+
+var _ zlib.Resetter = &myIO{} //@suggestedfix("&", "refactor.rewrite", "")
+var _ myio.Reader
+
+type myIO struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_renamed_import.go.golden b/gopls/internal/lsp/testdata/stub/stub_renamed_import.go.golden
new file mode 100644
index 000000000..8182d2b36
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_renamed_import.go.golden
@@ -0,0 +1,18 @@
+-- suggestedfix_stub_renamed_import_8_23 --
+package stub
+
+import (
+ "compress/zlib"
+ myio "io"
+)
+
+var _ zlib.Resetter = &myIO{} //@suggestedfix("&", "refactor.rewrite", "")
+var _ myio.Reader
+
+type myIO struct{}
+
+// Reset implements zlib.Resetter
+func (*myIO) Reset(r myio.Reader, dict []byte) error {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go b/gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go
new file mode 100644
index 000000000..0f1758685
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go
@@ -0,0 +1,13 @@
+package stub
+
+import (
+ "golang.org/lsptests/stub/other"
+)
+
+// This file tests that if an interface
+// method references an import from its own package
+// that the concrete type does not yet import, and that import happens
+// to be renamed, then we prefer the renaming of the interface.
+var _ other.Interface = &otherInterfaceImpl{} //@suggestedfix("&otherInterfaceImpl", "refactor.rewrite", "")
+
+type otherInterfaceImpl struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go.golden b/gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go.golden
new file mode 100644
index 000000000..d9c621584
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_renamed_import_iface.go.golden
@@ -0,0 +1,22 @@
+-- suggestedfix_stub_renamed_import_iface_11_25 --
+package stub
+
+import (
+ "bytes"
+ "context"
+ "golang.org/lsptests/stub/other"
+)
+
+// This file tests that if an interface
+// method references an import from its own package
+// that the concrete type does not yet import, and that import happens
+// to be renamed, then we prefer the renaming of the interface.
+var _ other.Interface = &otherInterfaceImpl{} //@suggestedfix("&otherInterfaceImpl", "refactor.rewrite", "")
+
+type otherInterfaceImpl struct{}
+
+// Get implements other.Interface
+func (*otherInterfaceImpl) Get(context.Context) *bytes.Buffer {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_stdlib.go b/gopls/internal/lsp/testdata/stub/stub_stdlib.go
new file mode 100644
index 000000000..463cf78a3
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_stdlib.go
@@ -0,0 +1,9 @@
+package stub
+
+import (
+ "io"
+)
+
+var _ io.Writer = writer{} //@suggestedfix("w", "refactor.rewrite", "")
+
+type writer struct{}
diff --git a/gopls/internal/lsp/testdata/stub/stub_stdlib.go.golden b/gopls/internal/lsp/testdata/stub/stub_stdlib.go.golden
new file mode 100644
index 000000000..55592501a
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_stdlib.go.golden
@@ -0,0 +1,16 @@
+-- suggestedfix_stub_stdlib_7_19 --
+package stub
+
+import (
+ "io"
+)
+
+var _ io.Writer = writer{} //@suggestedfix("w", "refactor.rewrite", "")
+
+type writer struct{}
+
+// Write implements io.Writer
+func (writer) Write(p []byte) (n int, err error) {
+ panic("unimplemented")
+}
+
diff --git a/gopls/internal/lsp/testdata/stub/stub_typedecl_group.go b/gopls/internal/lsp/testdata/stub/stub_typedecl_group.go
new file mode 100644
index 000000000..f82401faf
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_typedecl_group.go
@@ -0,0 +1,27 @@
+package stub
+
+// Regression test for Issue #56825: file corrupted by insertion of
+// methods after TypeSpec in a parenthesized TypeDecl.
+
+import "io"
+
+func newReadCloser() io.ReadCloser {
+ return rdcloser{} //@suggestedfix("rd", "refactor.rewrite", "")
+}
+
+type (
+ A int
+ rdcloser struct{}
+ B int
+)
+
+func _() {
+ // Local types can't be stubbed as there's nowhere to put the methods.
+ // The suggestedfix assertion can't express this yet. TODO(adonovan): support it.
+ type local struct{}
+ var _ io.ReadCloser = local{} // want error: `local type "local" cannot be stubbed`
+}
+
+type (
+ C int
+)
diff --git a/gopls/internal/lsp/testdata/stub/stub_typedecl_group.go.golden b/gopls/internal/lsp/testdata/stub/stub_typedecl_group.go.golden
new file mode 100644
index 000000000..0848789ea
--- /dev/null
+++ b/gopls/internal/lsp/testdata/stub/stub_typedecl_group.go.golden
@@ -0,0 +1,39 @@
+-- suggestedfix_stub_typedecl_group_9_9 --
+package stub
+
+// Regression test for Issue #56825: file corrupted by insertion of
+// methods after TypeSpec in a parenthesized TypeDecl.
+
+import "io"
+
+func newReadCloser() io.ReadCloser {
+ return rdcloser{} //@suggestedfix("rd", "refactor.rewrite", "")
+}
+
+type (
+ A int
+ rdcloser struct{}
+ B int
+)
+
+// Close implements io.ReadCloser
+func (rdcloser) Close() error {
+ panic("unimplemented")
+}
+
+// Read implements io.ReadCloser
+func (rdcloser) Read(p []byte) (n int, err error) {
+ panic("unimplemented")
+}
+
+func _() {
+ // Local types can't be stubbed as there's nowhere to put the methods.
+ // The suggestedfix assertion can't express this yet. TODO(adonovan): support it.
+ type local struct{}
+ var _ io.ReadCloser = local{} // want error: `local type "local" cannot be stubbed`
+}
+
+type (
+ C int
+)
+