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) }