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{} //@quickfix("&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{} //@quickfix("&", 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{} //@quickfix("&", 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{}) //@quickfix("&", 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) //@quickfix("(", 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{} //@quickfix("&", 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{} //@quickfix("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]{} //@quickfix("&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) //@quickfix("(", 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) //@quickfix("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 //@quickfix("&", 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{} //@quickfix("&", 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{} //@quickfix("&", 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{} //@quickfix("&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{} //@quickfix("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") +}