blob: e31494ae4615fa37687f6d21875f77c5365c1a20 [file] [log] [blame]
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")
+}
+