| This test checks the 'implement interface' quick fix. |
| |
| -- go.mod -- |
| module golang.org/lsptests/stub |
| |
| go 1.18 |
| |
| -- other/other.go -- |
| package other |
| |
| import ( |
| "bytes" |
| renamed_context "context" |
| ) |
| |
| type Interface interface { |
| Get(renamed_context.Context) *bytes.Buffer |
| } |
| |
| -- add_selector.go -- |
| 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", re"cannot use", readerFrom) |
| |
| type readerFrom struct{} |
| -- @readerFrom/add_selector.go -- |
| @@ -13 +13,5 @@ |
| + |
| +// ReadFrom implements io.ReaderFrom. |
| +func (*readerFrom) ReadFrom(r io.Reader) (n int64, err error) { |
| + panic("unimplemented") |
| +} |
| -- assign.go -- |
| package stub |
| |
| import "io" |
| |
| func _() { |
| var br io.ByteWriter |
| br = &byteWriter{} //@suggestedfix("&", re"does not implement", assign) |
| _ = br |
| } |
| |
| type byteWriter struct{} |
| -- @assign/assign.go -- |
| @@ -12 +12,5 @@ |
| + |
| +// WriteByte implements io.ByteWriter. |
| +func (b *byteWriter) WriteByte(c byte) error { |
| + panic("unimplemented") |
| +} |
| -- assign_multivars.go -- |
| package stub |
| |
| import "io" |
| |
| func _() { |
| var br io.ByteWriter |
| var i int |
| i, br = 1, &multiByteWriter{} //@suggestedfix("&", re"does not implement", assign_multivars) |
| _, _ = i, br |
| } |
| |
| type multiByteWriter struct{} |
| -- @assign_multivars/assign_multivars.go -- |
| @@ -13 +13,5 @@ |
| + |
| +// WriteByte implements io.ByteWriter. |
| +func (m *multiByteWriter) WriteByte(c byte) error { |
| + panic("unimplemented") |
| +} |
| -- call_expr.go -- |
| package stub |
| |
| func main() { |
| check(&callExpr{}) //@suggestedfix("&", re"does not implement", call_expr) |
| } |
| |
| func check(err error) { |
| if err != nil { |
| panic(err) |
| } |
| } |
| |
| type callExpr struct{} |
| -- @call_expr/call_expr.go -- |
| @@ -14 +14,5 @@ |
| + |
| +// Error implements error. |
| +func (c *callExpr) Error() string { |
| + panic("unimplemented") |
| +} |
| -- embedded.go -- |
| package stub |
| |
| import ( |
| "io" |
| "sort" |
| ) |
| |
| var _ embeddedInterface = (*embeddedConcrete)(nil) //@suggestedfix("(", re"does not implement", embedded) |
| |
| type embeddedConcrete struct{} |
| |
| type embeddedInterface interface { |
| sort.Interface |
| io.Reader |
| } |
| -- @embedded/embedded.go -- |
| @@ -12 +12,20 @@ |
| +// Len implements embeddedInterface. |
| +func (e *embeddedConcrete) Len() int { |
| + panic("unimplemented") |
| +} |
| + |
| +// Less implements embeddedInterface. |
| +func (e *embeddedConcrete) Less(i int, j int) bool { |
| + panic("unimplemented") |
| +} |
| + |
| +// Read implements embeddedInterface. |
| +func (e *embeddedConcrete) Read(p []byte) (n int, err error) { |
| + panic("unimplemented") |
| +} |
| + |
| +// Swap implements embeddedInterface. |
| +func (e *embeddedConcrete) Swap(i int, j int) { |
| + panic("unimplemented") |
| +} |
| + |
| -- err.go -- |
| package stub |
| |
| func _() { |
| var br error = &customErr{} //@suggestedfix("&", re"does not implement", err) |
| _ = br |
| } |
| |
| type customErr struct{} |
| -- @err/err.go -- |
| @@ -9 +9,5 @@ |
| + |
| +// Error implements error. |
| +func (c *customErr) Error() string { |
| + panic("unimplemented") |
| +} |
| -- function_return.go -- |
| package stub |
| |
| import ( |
| "io" |
| ) |
| |
| func newCloser() io.Closer { |
| return closer{} //@suggestedfix("c", re"does not implement", function_return) |
| } |
| |
| type closer struct{} |
| -- @function_return/function_return.go -- |
| @@ -12 +12,5 @@ |
| + |
| +// Close implements io.Closer. |
| +func (c closer) Close() error { |
| + panic("unimplemented") |
| +} |
| -- generic_receiver.go -- |
| 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", re"does not implement", generic_receiver) |
| |
| type genReader[T, Y any] struct { |
| T T |
| Y Y |
| } |
| -- @generic_receiver/generic_receiver.go -- |
| @@ -13 +13,5 @@ |
| + |
| +// ReadFrom implements io.ReaderFrom. |
| +func (g *genReader[T, Y]) ReadFrom(r io.Reader) (n int64, err error) { |
| + panic("unimplemented") |
| +} |
| -- ignored_imports.go -- |
| 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("(", re"does not implement", ignored_imports) |
| ) |
| |
| type ignoredResetter struct{} |
| -- @ignored_imports/ignored_imports.go -- |
| @@ -19 +19,5 @@ |
| + |
| +// Reset implements zlib.Resetter. |
| +func (i *ignoredResetter) Reset(r Reader, dict []byte) error { |
| + panic("unimplemented") |
| +} |
| -- issue2606.go -- |
| package stub |
| |
| type I interface{ error } |
| |
| type C int |
| |
| var _ I = C(0) //@suggestedfix("C", re"does not implement", issue2606) |
| -- @issue2606/issue2606.go -- |
| @@ -7 +7,5 @@ |
| +// Error implements I. |
| +func (c C) Error() string { |
| + panic("unimplemented") |
| +} |
| + |
| -- multi_var.go -- |
| 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("&", re"does not implement", multi_var) |
| |
| type multiVar struct{} |
| -- @multi_var/multi_var.go -- |
| @@ -12 +12,5 @@ |
| + |
| +// Read implements io.Reader. |
| +func (m *multiVar) Read(p []byte) (n int, err error) { |
| + panic("unimplemented") |
| +} |
| -- pointer.go -- |
| package stub |
| |
| import "io" |
| |
| func getReaderFrom() io.ReaderFrom { |
| return &pointerImpl{} //@suggestedfix("&", re"does not implement", pointer) |
| } |
| |
| type pointerImpl struct{} |
| -- @pointer/pointer.go -- |
| @@ -10 +10,5 @@ |
| + |
| +// ReadFrom implements io.ReaderFrom. |
| +func (p *pointerImpl) ReadFrom(r io.Reader) (n int64, err error) { |
| + panic("unimplemented") |
| +} |
| -- renamed_import.go -- |
| package stub |
| |
| import ( |
| "compress/zlib" |
| myio "io" |
| ) |
| |
| var _ zlib.Resetter = &myIO{} //@suggestedfix("&", re"does not implement", renamed_import) |
| var _ myio.Reader |
| |
| type myIO struct{} |
| -- @renamed_import/renamed_import.go -- |
| @@ -12 +12,5 @@ |
| + |
| +// Reset implements zlib.Resetter. |
| +func (m *myIO) Reset(r myio.Reader, dict []byte) error { |
| + panic("unimplemented") |
| +} |
| -- renamed_import_iface.go -- |
| 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", re"does not implement", renamed_import_iface) |
| |
| type otherInterfaceImpl struct{} |
| -- @renamed_import_iface/renamed_import_iface.go -- |
| @@ -4 +4,2 @@ |
| + "bytes" |
| + "context" |
| @@ -14 +16,5 @@ |
| + |
| +// Get implements other.Interface. |
| +func (o *otherInterfaceImpl) Get(context.Context) *bytes.Buffer { |
| + panic("unimplemented") |
| +} |
| -- stdlib.go -- |
| package stub |
| |
| import ( |
| "io" |
| ) |
| |
| var _ io.Writer = writer{} //@suggestedfix("w", re"does not implement", stdlib) |
| |
| type writer struct{} |
| -- @stdlib/stdlib.go -- |
| @@ -10 +10,5 @@ |
| + |
| +// Write implements io.Writer. |
| +func (w writer) Write(p []byte) (n int, err error) { |
| + panic("unimplemented") |
| +} |
| -- typedecl_group.go -- |
| 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", re"does not implement", typedecl_group) |
| } |
| |
| 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{} //@diag("local", re"does not implement") |
| } |
| -- @typedecl_group/typedecl_group.go -- |
| @@ -18 +18,10 @@ |
| +// Close implements io.ReadCloser. |
| +func (r rdcloser) Close() error { |
| + panic("unimplemented") |
| +} |
| + |
| +// Read implements io.ReadCloser. |
| +func (r rdcloser) Read(p []byte) (n int, err error) { |
| + panic("unimplemented") |
| +} |
| + |