xerrors: redirect Is, As, Unwrap to errors package They're available in the standard library as of Go 1.13. Change-Id: I8ff4f011a0904ce444e0e8c9b0ce9488668ba851 Reviewed-on: https://go-review.googlesource.com/c/xerrors/+/610077 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com>
diff --git a/doc.go b/doc.go index 2ef99f5..c255c43 100644 --- a/doc.go +++ b/doc.go
@@ -6,7 +6,7 @@ // // This package is based on the Go 2 proposal for error values: // -// https://golang.org/design/29934-error-values +// https://go.dev/design/29934-error-values // // These functions were incorporated into the standard library's errors package // in Go 1.13: @@ -16,8 +16,6 @@ // // Also, Errorf's %w verb was incorporated into fmt.Errorf. // -// Use this package to get equivalent behavior in all supported Go versions. -// // No other features of this package were included in Go 1.13, and at present // there are no plans to include any of them. -package xerrors // import "golang.org/x/xerrors" +package xerrors
diff --git a/wrap.go b/wrap.go index 3cc27dc..b54e138 100644 --- a/wrap.go +++ b/wrap.go
@@ -4,9 +4,7 @@ package xerrors -import ( - "reflect" -) +import "errors" // A Wrapper provides context around another error. type Wrapper interface { @@ -36,77 +34,50 @@ // Unwrap returns the result of calling the Unwrap method on err, if err implements // Unwrap. Otherwise, Unwrap returns nil. // -// Deprecated: As of Go 1.13, use errors.Unwrap instead. -func Unwrap(err error) error { - u, ok := err.(Wrapper) - if !ok { - return nil - } - return u.Unwrap() -} +// Unwrap only calls a method of the form "Unwrap() error". +// In particular Unwrap does not unwrap errors returned by [errors.Join]. +// +// Deprecated: As of Go 1.13, this function simply calls [errors.Unwrap]. +func Unwrap(err error) error { return errors.Unwrap(err) } -// Is reports whether any error in err's chain matches target. +// Is reports whether any error in err's tree matches target. +// +// The tree consists of err itself, followed by the errors obtained by repeatedly +// calling its Unwrap() error or Unwrap() []error method. When err wraps multiple +// errors, Is examines err followed by a depth-first traversal of its children. // // An error is considered to match a target if it is equal to that target or if // it implements a method Is(error) bool such that Is(target) returns true. // -// Deprecated: As of Go 1.13, use errors.Is instead. -func Is(err, target error) bool { - if target == nil { - return err == target - } - - isComparable := reflect.TypeOf(target).Comparable() - for { - if isComparable && err == target { - return true - } - if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { - return true - } - // TODO: consider supporing target.Is(err). This would allow - // user-definable predicates, but also may allow for coping with sloppy - // APIs, thereby making it easier to get away with them. - if err = Unwrap(err); err == nil { - return false - } - } -} - -// As finds the first error in err's chain that matches the type to which target -// points, and if so, sets the target to its value and returns true. An error -// matches a type if it is assignable to the target type, or if it has a method -// As(interface{}) bool such that As(target) returns true. As will panic if target -// is not a non-nil pointer to a type which implements error or is of interface type. +// An error type might provide an Is method so it can be treated as equivalent +// to an existing error. For example, if MyError defines // -// The As method should set the target to its value and return true if err -// matches the type to which target points. +// func (m MyError) Is(target error) bool { return target == fs.ErrExist } // -// Deprecated: As of Go 1.13, use errors.As instead. -func As(err error, target any) bool { - if target == nil { - panic("errors: target cannot be nil") - } - val := reflect.ValueOf(target) - typ := val.Type() - if typ.Kind() != reflect.Ptr || val.IsNil() { - panic("errors: target must be a non-nil pointer") - } - if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) { - panic("errors: *target must be interface or implement error") - } - targetType := typ.Elem() - for err != nil { - if reflect.TypeOf(err).AssignableTo(targetType) { - val.Elem().Set(reflect.ValueOf(err)) - return true - } - if x, ok := err.(interface{ As(any) bool }); ok && x.As(target) { - return true - } - err = Unwrap(err) - } - return false -} +// then Is(MyError{}, fs.ErrExist) returns true. See [syscall.Errno.Is] for +// an example in the standard library. An Is method should only shallowly +// compare err and the target and not call [Unwrap] on either. +// +// Deprecated: As of Go 1.13, this function simply calls [errors.Is]. +func Is(err, target error) bool { return errors.Is(err, target) } -var errorType = reflect.TypeOf((*error)(nil)).Elem() +// As finds the first error in err's tree that matches target, and if one is found, +// sets target to that error value and returns true. Otherwise, it returns false. +// +// The tree consists of err itself, followed by the errors obtained by repeatedly +// calling its Unwrap() error or Unwrap() []error method. When err wraps multiple +// errors, As examines err followed by a depth-first traversal of its children. +// +// An error matches target if the error's concrete value is assignable to the value +// pointed to by target, or if the error has a method As(any) bool such that +// As(target) returns true. In the latter case, the As method is responsible for +// setting target. +// +// An error type might provide an As method so it can be treated as if it were a +// different error type. +// +// As panics if target is not a non-nil pointer to either a type that implements +// error, or to any interface type. +// +// Deprecated: As of Go 1.13, this function simply calls [errors.As]. +func As(err error, target any) bool { return errors.As(err, target) }