diff options
Diffstat (limited to 'gopls/internal/lsp/testdata/stub')
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 +) + |