aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/Djarvur
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-07-04 11:12:55 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-07-04 15:05:30 +0200
commitc7d7f10bdff703e4a3c0414e8a33d4e45c91eb35 (patch)
tree0dff0ee1f98dbfa3ad8776112053a450d176592b /vendor/github.com/Djarvur
parent9573094ce235bd9afe88f5da27a47dd6bcc1e13b (diff)
go.mod: vendor golangci-lint
Diffstat (limited to 'vendor/github.com/Djarvur')
-rw-r--r--vendor/github.com/Djarvur/go-err113/.gitignore15
-rw-r--r--vendor/github.com/Djarvur/go-err113/.golangci.yml150
-rw-r--r--vendor/github.com/Djarvur/go-err113/.travis.yml24
-rw-r--r--vendor/github.com/Djarvur/go-err113/LICENSE21
-rw-r--r--vendor/github.com/Djarvur/go-err113/README.adoc73
-rw-r--r--vendor/github.com/Djarvur/go-err113/comparison.go103
-rw-r--r--vendor/github.com/Djarvur/go-err113/definition.go74
-rw-r--r--vendor/github.com/Djarvur/go-err113/err113.go90
-rw-r--r--vendor/github.com/Djarvur/go-err113/go.mod5
-rw-r--r--vendor/github.com/Djarvur/go-err113/go.sum20
10 files changed, 575 insertions, 0 deletions
diff --git a/vendor/github.com/Djarvur/go-err113/.gitignore b/vendor/github.com/Djarvur/go-err113/.gitignore
new file mode 100644
index 000000000..66fd13c90
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/.gitignore
@@ -0,0 +1,15 @@
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Dependency directories (remove the comment below to include it)
+# vendor/
diff --git a/vendor/github.com/Djarvur/go-err113/.golangci.yml b/vendor/github.com/Djarvur/go-err113/.golangci.yml
new file mode 100644
index 000000000..2abdfc639
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/.golangci.yml
@@ -0,0 +1,150 @@
+# This file contains all available configuration options
+# with their default values.
+
+# options for analysis running
+run:
+ # default concurrency is a available CPU number
+ concurrency: 4
+
+ # timeout for analysis, e.g. 30s, 5m, default is 1m
+ deadline: 15m
+
+ # exit code when at least one issue was found, default is 1
+ issues-exit-code: 1
+
+ # include test files or not, default is true
+ tests: false
+
+ # list of build tags, all linters use it. Default is empty list.
+ #build-tags:
+ # - mytag
+
+ # which dirs to skip: they won't be analyzed;
+ # can use regexp here: generated.*, regexp is applied on full path;
+ # default value is empty list, but next dirs are always skipped independently
+ # from this option's value:
+ # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$
+ skip-dirs:
+ - /gen$
+
+ # which files to skip: they will be analyzed, but issues from them
+ # won't be reported. Default value is empty list, but there is
+ # no need to include all autogenerated files, we confidently recognize
+ # autogenerated files. If it's not please let us know.
+ skip-files:
+ - ".*\\.my\\.go$"
+ - lib/bad.go
+ - ".*\\.template\\.go$"
+
+# output configuration options
+output:
+ # colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number"
+ format: colored-line-number
+
+ # print lines of code with issue, default is true
+ print-issued-lines: true
+
+ # print linter name in the end of issue text, default is true
+ print-linter-name: true
+
+# all available settings of specific linters
+linters-settings:
+ errcheck:
+ # report about not checking of errors in type assetions: `a := b.(MyStruct)`;
+ # default is false: such cases aren't reported by default.
+ check-type-assertions: false
+
+ # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
+ # default is false: such cases aren't reported by default.
+ check-blank: false
+ govet:
+ # report about shadowed variables
+ check-shadowing: true
+
+ # Obtain type information from installed (to $GOPATH/pkg) package files:
+ # golangci-lint will execute `go install -i` and `go test -i` for analyzed packages
+ # before analyzing them.
+ # By default this option is disabled and govet gets type information by loader from source code.
+ # Loading from source code is slow, but it's done only once for all linters.
+ # Go-installing of packages first time is much slower than loading them from source code,
+ # therefore this option is disabled by default.
+ # But repeated installation is fast in go >= 1.10 because of build caching.
+ # Enable this option only if all conditions are met:
+ # 1. you use only "fast" linters (--fast e.g.): no program loading occurs
+ # 2. you use go >= 1.10
+ # 3. you do repeated runs (false for CI) or cache $GOPATH/pkg or `go env GOCACHE` dir in CI.
+ use-installed-packages: false
+ golint:
+ # minimal confidence for issues, default is 0.8
+ min-confidence: 0.8
+ gofmt:
+ # simplify code: gofmt with `-s` option, true by default
+ simplify: true
+ gocyclo:
+ # minimal code complexity to report, 30 by default (but we recommend 10-20)
+ min-complexity: 10
+ maligned:
+ # print struct with more effective memory layout or not, false by default
+ suggest-new: true
+ dupl:
+ # tokens count to trigger issue, 150 by default
+ threshold: 100
+ goconst:
+ # minimal length of string constant, 3 by default
+ min-len: 3
+ # minimal occurrences count to trigger, 3 by default
+ min-occurrences: 3
+ depguard:
+ list-type: blacklist
+ include-go-root: false
+ packages:
+ - github.com/davecgh/go-spew/spew
+
+linters:
+ #enable:
+ # - staticcheck
+ # - unused
+ # - gosimple
+ enable-all: true
+ disable:
+ - lll
+ disable-all: false
+ #presets:
+ # - bugs
+ # - unused
+ fast: false
+
+issues:
+ # List of regexps of issue texts to exclude, empty list by default.
+ # But independently from this option we use default exclude patterns,
+ # it can be disabled by `exclude-use-default: false`. To list all
+ # excluded by default patterns execute `golangci-lint run --help`
+ exclude:
+ - "`parseTained` is unused"
+ - "`parseState` is unused"
+
+ # Independently from option `exclude` we use default exclude patterns,
+ # it can be disabled by this option. To list all
+ # excluded by default patterns execute `golangci-lint run --help`.
+ # Default value for this option is false.
+ exclude-use-default: false
+
+ # Maximum issues count per one linter. Set to 0 to disable. Default is 50.
+ max-per-linter: 0
+
+ # Maximum count of issues with the same text. Set to 0 to disable. Default is 3.
+ max-same: 0
+
+ # Show only new issues: if there are unstaged changes or untracked files,
+ # only those changes are analyzed, else only changes in HEAD~ are analyzed.
+ # It's a super-useful option for integration of golangci-lint into existing
+ # large codebase. It's not practical to fix all existing issues at the moment
+ # of integration: much better don't allow issues in new code.
+ # Default is false.
+ new: false
+
+ # Show only new issues created after git revision `REV`
+ #new-from-rev: REV
+
+ # Show only new issues created in git patch with set file path.
+ #new-from-patch: path/to/patch/file \ No newline at end of file
diff --git a/vendor/github.com/Djarvur/go-err113/.travis.yml b/vendor/github.com/Djarvur/go-err113/.travis.yml
new file mode 100644
index 000000000..44fe77d53
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/.travis.yml
@@ -0,0 +1,24 @@
+language: go
+
+go:
+ - "1.13"
+ - "1.14"
+ - tip
+
+env:
+ - GO111MODULE=on
+
+before_install:
+ - go get github.com/axw/gocov/gocov
+ - go get github.com/mattn/goveralls
+ - go get golang.org/x/tools/cmd/cover
+ - go get golang.org/x/tools/cmd/goimports
+ - wget -O - -q https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh
+
+script:
+ - test -z "$(goimports -d ./ 2>&1)"
+ - ./bin/golangci-lint run
+ - go test -v -race ./...
+
+after_success:
+ - test "$TRAVIS_GO_VERSION" = "1.14" && goveralls -service=travis-ci
diff --git a/vendor/github.com/Djarvur/go-err113/LICENSE b/vendor/github.com/Djarvur/go-err113/LICENSE
new file mode 100644
index 000000000..a78ad8c77
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Djarvur
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/Djarvur/go-err113/README.adoc b/vendor/github.com/Djarvur/go-err113/README.adoc
new file mode 100644
index 000000000..b4c1f4375
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/README.adoc
@@ -0,0 +1,73 @@
+= err113 image:https://godoc.org/github.com/Djarvur/go-err113?status.svg["GoDoc",link="http://godoc.org/github.com/Djarvur/go-err113"] image:https://travis-ci.org/Djarvur/go-err113.svg["Build Status",link="https://travis-ci.org/Djarvur/go-err113"] image:https://coveralls.io/repos/Djarvur/go-err113/badge.svg?branch=master&service=github["Coverage Status",link="https://coveralls.io/github/Djarvur/go-err113?branch=master"]
+Daniel Podolsky
+:toc:
+
+Golang linter to check the errors handling expressions
+
+== Details
+
+Starting from Go 1.13 the standard `error` type behaviour was changed: one `error` could be derived from another with `fmt.Errorf()` method using `%w` format specifier.
+
+So the errors hierarchy could be built for flexible and responsible errors processing.
+
+And to make this possible at least two simple rules should be followed:
+
+1. `error` values should not be compared directly but with `errors.Is()` method.
+1. `error` should not be created dynamically from scratch but by the wrapping the static (package-level) error.
+
+This linter is checking the code for these 2 rules compliance.
+
+=== Reports
+
+So, `err113` reports every `==` and `!=` comparison for exact `error` type variables except comparison to `nil` and `io.EOF`.
+
+Also, any call of `errors.New()` and `fmt.Errorf()` methods are reported except the calls used to initialise package-level variables and the `fmt.Errorf()` calls wrapping the other errors.
+
+Note: non-standard packages, like `github.com/pkg/errors` are ignored complitely.
+
+== Install
+
+```
+go get -u github.com/Djarvur/go-err113/cmd/err113
+```
+
+== Usage
+
+Defined by link:https://pkg.go.dev/golang.org/x/tools/go/analysis/singlechecker[singlechecker] package.
+
+```
+err113: checks the error handling rules according to the Go 1.13 new error type
+
+Usage: err113 [-flag] [package]
+
+
+Flags:
+ -V print version and exit
+ -all
+ no effect (deprecated)
+ -c int
+ display offending line with this many lines of context (default -1)
+ -cpuprofile string
+ write CPU profile to this file
+ -debug string
+ debug flags, any subset of "fpstv"
+ -fix
+ apply all suggested fixes
+ -flags
+ print analyzer flags in JSON
+ -json
+ emit JSON output
+ -memprofile string
+ write memory profile to this file
+ -source
+ no effect (deprecated)
+ -tags string
+ no effect (deprecated)
+ -trace string
+ write trace log to this file
+ -v no effect (deprecated)
+```
+
+== Thanks
+
+To link:https://github.com/quasilyte[Iskander (Alex) Sharipov] for the really useful advices.
diff --git a/vendor/github.com/Djarvur/go-err113/comparison.go b/vendor/github.com/Djarvur/go-err113/comparison.go
new file mode 100644
index 000000000..7e7777df6
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/comparison.go
@@ -0,0 +1,103 @@
+package err113
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "golang.org/x/tools/go/analysis"
+)
+
+func inspectComparision(pass *analysis.Pass, n ast.Node) bool { // nolint: unparam
+ // check whether the call expression matches time.Now().Sub()
+ be, ok := n.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+
+ // check if it is a comparison operation
+ if be.Op != token.EQL && be.Op != token.NEQ {
+ return true
+ }
+
+ // check that both left and right hand side are not nil
+ if pass.TypesInfo.Types[be.X].IsNil() || pass.TypesInfo.Types[be.Y].IsNil() {
+ return true
+ }
+
+ // check that both left and right hand side are not io.EOF
+ if isEOF(be.X, pass.TypesInfo) || isEOF(be.Y, pass.TypesInfo) {
+ return true
+ }
+
+ // check that both left and right hand side are errors
+ if !isError(be.X, pass.TypesInfo) && !isError(be.Y, pass.TypesInfo) {
+ return true
+ }
+
+ oldExpr := render(pass.Fset, be)
+
+ negate := ""
+ if be.Op == token.NEQ {
+ negate = "!"
+ }
+
+ newExpr := fmt.Sprintf("%s%s.Is(%s, %s)", negate, "errors", be.X, be.Y)
+
+ pass.Report(
+ analysis.Diagnostic{
+ Pos: be.Pos(),
+ Message: fmt.Sprintf("do not compare errors directly, use errors.Is() instead: %q", oldExpr),
+ SuggestedFixes: []analysis.SuggestedFix{
+ {
+ Message: fmt.Sprintf("should replace %q with %q", oldExpr, newExpr),
+ TextEdits: []analysis.TextEdit{
+ {
+ Pos: be.Pos(),
+ End: be.End(),
+ NewText: []byte(newExpr),
+ },
+ },
+ },
+ },
+ },
+ )
+
+ return true
+}
+
+func isError(v ast.Expr, info *types.Info) bool {
+ if intf, ok := info.TypeOf(v).Underlying().(*types.Interface); ok {
+ return intf.NumMethods() == 1 && intf.Method(0).FullName() == "(error).Error"
+ }
+
+ return false
+}
+
+func isEOF(ex ast.Expr, info *types.Info) bool {
+ se, ok := ex.(*ast.SelectorExpr)
+ if !ok || se.Sel.Name != "EOF" {
+ return false
+ }
+
+ if ep, ok := asImportedName(se.X, info); !ok || ep != "io" {
+ return false
+ }
+
+ return true
+}
+
+func asImportedName(ex ast.Expr, info *types.Info) (string, bool) {
+ ei, ok := ex.(*ast.Ident)
+ if !ok {
+ return "", false
+ }
+
+ ep, ok := info.ObjectOf(ei).(*types.PkgName)
+ if !ok {
+ return "", false
+ }
+
+ return ep.Imported().Name(), true
+}
diff --git a/vendor/github.com/Djarvur/go-err113/definition.go b/vendor/github.com/Djarvur/go-err113/definition.go
new file mode 100644
index 000000000..79201c929
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/definition.go
@@ -0,0 +1,74 @@
+package err113
+
+import (
+ "go/ast"
+ "go/types"
+ "strings"
+
+ "golang.org/x/tools/go/analysis"
+)
+
+var methods2check = map[string]map[string]func(*ast.CallExpr, *types.Info) bool{ // nolint: gochecknoglobals
+ "errors": {"New": justTrue},
+ "fmt": {"Errorf": checkWrap},
+}
+
+func justTrue(*ast.CallExpr, *types.Info) bool {
+ return true
+}
+
+func checkWrap(ce *ast.CallExpr, info *types.Info) bool {
+ return !(len(ce.Args) > 0 && strings.Contains(toString(ce.Args[0], info), `%w`))
+}
+
+func inspectDefinition(pass *analysis.Pass, tlds map[*ast.CallExpr]struct{}, n ast.Node) bool { //nolint: unparam
+ // check whether the call expression matches time.Now().Sub()
+ ce, ok := n.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+
+ if _, ok = tlds[ce]; ok {
+ return true
+ }
+
+ fn, ok := ce.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+
+ fxName, ok := asImportedName(fn.X, pass.TypesInfo)
+ if !ok {
+ return true
+ }
+
+ methods, ok := methods2check[fxName]
+ if !ok {
+ return true
+ }
+
+ checkFunc, ok := methods[fn.Sel.Name]
+ if !ok {
+ return true
+ }
+
+ if !checkFunc(ce, pass.TypesInfo) {
+ return true
+ }
+
+ pass.Reportf(
+ ce.Pos(),
+ "do not define dynamic errors, use wrapped static errors instead: %q",
+ render(pass.Fset, ce),
+ )
+
+ return true
+}
+
+func toString(ex ast.Expr, info *types.Info) string {
+ if tv, ok := info.Types[ex]; ok && tv.Value != nil {
+ return tv.Value.String()
+ }
+
+ return ""
+}
diff --git a/vendor/github.com/Djarvur/go-err113/err113.go b/vendor/github.com/Djarvur/go-err113/err113.go
new file mode 100644
index 000000000..e9d93a7a0
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/err113.go
@@ -0,0 +1,90 @@
+// Package err113 is a Golang linter to check the errors handling expressions
+package err113
+
+import (
+ "bytes"
+ "go/ast"
+ "go/printer"
+ "go/token"
+
+ "golang.org/x/tools/go/analysis"
+)
+
+// NewAnalyzer creates a new analysis.Analyzer instance tuned to run err113 checks
+func NewAnalyzer() *analysis.Analyzer {
+ return &analysis.Analyzer{
+ Name: "err113",
+ Doc: "checks the error handling rules according to the Go 1.13 new error type",
+ Run: run,
+ }
+}
+
+func run(pass *analysis.Pass) (interface{}, error) {
+ for _, file := range pass.Files {
+ tlds := enumerateFileDecls(file)
+
+ ast.Inspect(
+ file,
+ func(n ast.Node) bool {
+ return inspectComparision(pass, n) &&
+ inspectDefinition(pass, tlds, n)
+ },
+ )
+ }
+
+ return nil, nil
+}
+
+// render returns the pretty-print of the given node
+func render(fset *token.FileSet, x interface{}) string {
+ var buf bytes.Buffer
+ if err := printer.Fprint(&buf, fset, x); err != nil {
+ panic(err)
+ }
+
+ return buf.String()
+}
+
+func enumerateFileDecls(f *ast.File) map[*ast.CallExpr]struct{} {
+ res := make(map[*ast.CallExpr]struct{})
+
+ var ces []*ast.CallExpr // nolint: prealloc
+
+ for _, d := range f.Decls {
+ ces = append(ces, enumerateDeclVars(d)...)
+ }
+
+ for _, ce := range ces {
+ res[ce] = struct{}{}
+ }
+
+ return res
+}
+
+func enumerateDeclVars(d ast.Decl) (res []*ast.CallExpr) {
+ td, ok := d.(*ast.GenDecl)
+ if !ok || td.Tok != token.VAR {
+ return nil
+ }
+
+ for _, s := range td.Specs {
+ res = append(res, enumerateSpecValues(s)...)
+ }
+
+ return res
+}
+
+func enumerateSpecValues(s ast.Spec) (res []*ast.CallExpr) {
+ vs, ok := s.(*ast.ValueSpec)
+ if !ok {
+ return nil
+ }
+
+ for _, v := range vs.Values {
+ if ce, ok := v.(*ast.CallExpr); ok {
+ res = append(res, ce)
+ }
+ }
+
+ return res
+}
diff --git a/vendor/github.com/Djarvur/go-err113/go.mod b/vendor/github.com/Djarvur/go-err113/go.mod
new file mode 100644
index 000000000..6e28e9336
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/go.mod
@@ -0,0 +1,5 @@
+module github.com/Djarvur/go-err113
+
+go 1.13
+
+require golang.org/x/tools v0.0.0-20200324003944-a576cf524670
diff --git a/vendor/github.com/Djarvur/go-err113/go.sum b/vendor/github.com/Djarvur/go-err113/go.sum
new file mode 100644
index 000000000..dab64209d
--- /dev/null
+++ b/vendor/github.com/Djarvur/go-err113/go.sum
@@ -0,0 +1,20 @@
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200324003944-a576cf524670 h1:fW7EP/GZqIvbHessHd1PLca+77TBOsRBqtaybMgXJq8=
+golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=