mirror of https://github.com/containers/podman.git
Merge pull request #14562 from containers/dependabot/go_modules/test/tools/golang.org/x/tools-0.1.11
Bump golang.org/x/tools from 0.1.10 to 0.1.11 in /test/tools
This commit is contained in:
commit
c044d455a1
|
@ -5,5 +5,5 @@ go 1.16
|
||||||
require (
|
require (
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2
|
github.com/cpuguy83/go-md2man/v2 v2.0.2
|
||||||
github.com/vbatts/git-validation v1.1.0
|
github.com/vbatts/git-validation v1.1.0
|
||||||
golang.org/x/tools v0.1.10
|
golang.org/x/tools v0.1.11
|
||||||
)
|
)
|
||||||
|
|
|
@ -20,8 +20,8 @@ github.com/vbatts/git-validation v1.1.0/go.mod h1:QyK3uQnRYWGt/5ezd8kcpwPrm6zn9t
|
||||||
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
|
@ -41,9 +41,6 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
|
golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=
|
||||||
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
|
golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
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-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
|
|
|
@ -32,3 +32,4 @@ check-mod: # verifies that module changes for go.mod and go.sum are checked in
|
||||||
.PHONY: vendor
|
.PHONY: vendor
|
||||||
vendor: mod
|
vendor: mod
|
||||||
@go mod vendor -v
|
@go mod vendor -v
|
||||||
|
|
||||||
|
|
|
@ -20,3 +20,4 @@ go-md2man 1 "January 2015" go-md2man "User Manual"
|
||||||
|
|
||||||
# HISTORY
|
# HISTORY
|
||||||
January 2015, Originally compiled by Brian Goff( cpuguy83@gmail.com )
|
January 2015, Originally compiled by Brian Goff( cpuguy83@gmail.com )
|
||||||
|
|
||||||
|
|
|
@ -351,3 +351,4 @@ Exhibit B - “Incompatible With Secondary Licenses” Notice
|
||||||
This Source Code Form is “Incompatible
|
This Source Code Form is “Incompatible
|
||||||
With Secondary Licenses”, as defined by
|
With Secondary Licenses”, as defined by
|
||||||
the Mozilla Public License, v. 2.0.
|
the Mozilla Public License, v. 2.0.
|
||||||
|
|
||||||
|
|
|
@ -10,3 +10,4 @@ func isTerminal(fd int) bool {
|
||||||
_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,3 +10,4 @@ func isTerminal(fd int) bool {
|
||||||
_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
|
||||||
return err == nil
|
return err == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,3 +103,4 @@ See [`./rules/`](./rules/).
|
||||||
Feel free to contribute more.
|
Feel free to contribute more.
|
||||||
|
|
||||||
Otherwise, by using `validate` package API directly, rules can be handed directly to the `validate.Runner`.
|
Otherwise, by using `validate` package API directly, rules can be handed directly to the `validate.Runner`.
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
// but additional checking functions, most notably Check, verify that
|
// but additional checking functions, most notably Check, verify that
|
||||||
// a particular path, version pair is valid.
|
// a particular path, version pair is valid.
|
||||||
//
|
//
|
||||||
// Escaped Paths
|
// # Escaped Paths
|
||||||
//
|
//
|
||||||
// Module paths appear as substrings of file system paths
|
// Module paths appear as substrings of file system paths
|
||||||
// (in the download cache) and of web server URLs in the proxy protocol.
|
// (in the download cache) and of web server URLs in the proxy protocol.
|
||||||
|
@ -55,7 +55,7 @@
|
||||||
// Import paths have never allowed exclamation marks, so there is no
|
// Import paths have never allowed exclamation marks, so there is no
|
||||||
// need to define how to escape a literal !.
|
// need to define how to escape a literal !.
|
||||||
//
|
//
|
||||||
// Unicode Restrictions
|
// # Unicode Restrictions
|
||||||
//
|
//
|
||||||
// Today, paths are disallowed from using Unicode.
|
// Today, paths are disallowed from using Unicode.
|
||||||
//
|
//
|
||||||
|
@ -102,9 +102,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
"errors"
|
||||||
|
|
||||||
"golang.org/x/mod/semver"
|
"golang.org/x/mod/semver"
|
||||||
errors "golang.org/x/xerrors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Version (for clients, a module.Version) is defined by a module path and version pair.
|
// A Version (for clients, a module.Version) is defined by a module path and version pair.
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
Command goimports updates your Go import lines,
|
Command goimports updates your Go import lines,
|
||||||
adding missing ones and removing unreferenced ones.
|
adding missing ones and removing unreferenced ones.
|
||||||
|
|
||||||
|
@ -14,17 +13,22 @@ your code in the same style as gofmt so it can be used
|
||||||
as a replacement for your editor's gofmt-on-save hook.
|
as a replacement for your editor's gofmt-on-save hook.
|
||||||
|
|
||||||
For emacs, make sure you have the latest go-mode.el:
|
For emacs, make sure you have the latest go-mode.el:
|
||||||
|
|
||||||
https://github.com/dominikh/go-mode.el
|
https://github.com/dominikh/go-mode.el
|
||||||
|
|
||||||
Then in your .emacs file:
|
Then in your .emacs file:
|
||||||
|
|
||||||
(setq gofmt-command "goimports")
|
(setq gofmt-command "goimports")
|
||||||
(add-hook 'before-save-hook 'gofmt-before-save)
|
(add-hook 'before-save-hook 'gofmt-before-save)
|
||||||
|
|
||||||
For vim, set "gofmt_command" to "goimports":
|
For vim, set "gofmt_command" to "goimports":
|
||||||
|
|
||||||
https://golang.org/change/39c724dd7f252
|
https://golang.org/change/39c724dd7f252
|
||||||
https://golang.org/wiki/IDEsAndTextEditorPlugins
|
https://golang.org/wiki/IDEsAndTextEditorPlugins
|
||||||
etc
|
etc
|
||||||
|
|
||||||
For GoSublime, follow the steps described here:
|
For GoSublime, follow the steps described here:
|
||||||
|
|
||||||
http://michaelwhatcott.com/gosublime-goimports/
|
http://michaelwhatcott.com/gosublime-goimports/
|
||||||
|
|
||||||
For other editors, you probably know what to do.
|
For other editors, you probably know what to do.
|
||||||
|
@ -42,6 +46,5 @@ File bugs or feature requests at:
|
||||||
https://golang.org/issues/new?title=x/tools/cmd/goimports:+
|
https://golang.org/issues/new?title=x/tools/cmd/goimports:+
|
||||||
|
|
||||||
Happy hacking!
|
Happy hacking!
|
||||||
|
|
||||||
*/
|
*/
|
||||||
package main // import "golang.org/x/tools/cmd/goimports"
|
package main // import "golang.org/x/tools/cmd/goimports"
|
||||||
|
|
|
@ -54,12 +54,11 @@ import (
|
||||||
// interior whitespace of the assignment. E is considered interior
|
// interior whitespace of the assignment. E is considered interior
|
||||||
// whitespace of the BlockStmt containing the assignment.
|
// whitespace of the BlockStmt containing the assignment.
|
||||||
//
|
//
|
||||||
// Precondition: [start, end) both lie within the same file as root.
|
// The resulting path is never empty; it always contains at least the
|
||||||
// TODO(adonovan): return (nil, false) in this case and remove precond.
|
// 'root' *ast.File. Ideally PathEnclosingInterval would reject
|
||||||
// Requires FileSet; see loader.tokenFileContainsPos.
|
// intervals that lie wholly or partially outside the range of the
|
||||||
//
|
// file, but unfortunately ast.File records only the token.Pos of
|
||||||
// Postcondition: path is never nil; it always contains at least 'root'.
|
// the 'package' keyword, but not of the start of the file itself.
|
||||||
//
|
|
||||||
func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) {
|
func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) {
|
||||||
// fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging
|
// fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging
|
||||||
|
|
||||||
|
@ -135,6 +134,7 @@ func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Nod
|
||||||
return false // inexact: overlaps multiple children
|
return false // inexact: overlaps multiple children
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure [start,end) is nondecreasing.
|
||||||
if start > end {
|
if start > end {
|
||||||
start, end = end, start
|
start, end = end, start
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,6 @@ func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Nod
|
||||||
// tokenNode is a dummy implementation of ast.Node for a single token.
|
// tokenNode is a dummy implementation of ast.Node for a single token.
|
||||||
// They are used transiently by PathEnclosingInterval but never escape
|
// They are used transiently by PathEnclosingInterval but never escape
|
||||||
// this package.
|
// this package.
|
||||||
//
|
|
||||||
type tokenNode struct {
|
type tokenNode struct {
|
||||||
pos token.Pos
|
pos token.Pos
|
||||||
end token.Pos
|
end token.Pos
|
||||||
|
@ -183,7 +182,6 @@ func tok(pos token.Pos, len int) ast.Node {
|
||||||
// childrenOf returns the direct non-nil children of ast.Node n.
|
// childrenOf returns the direct non-nil children of ast.Node n.
|
||||||
// It may include fake ast.Node implementations for bare tokens.
|
// It may include fake ast.Node implementations for bare tokens.
|
||||||
// it is not safe to call (e.g.) ast.Walk on such nodes.
|
// it is not safe to call (e.g.) ast.Walk on such nodes.
|
||||||
//
|
|
||||||
func childrenOf(n ast.Node) []ast.Node {
|
func childrenOf(n ast.Node) []ast.Node {
|
||||||
var children []ast.Node
|
var children []ast.Node
|
||||||
|
|
||||||
|
@ -488,7 +486,6 @@ func (sl byPos) Swap(i, j int) {
|
||||||
// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident,
|
// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident,
|
||||||
// StarExpr) we could be much more specific given the path to the AST
|
// StarExpr) we could be much more specific given the path to the AST
|
||||||
// root. Perhaps we should do that.
|
// root. Perhaps we should do that.
|
||||||
//
|
|
||||||
func NodeDescription(n ast.Node) string {
|
func NodeDescription(n ast.Node) string {
|
||||||
switch n := n.(type) {
|
switch n := n.(type) {
|
||||||
case *ast.ArrayType:
|
case *ast.ArrayType:
|
||||||
|
|
|
@ -22,8 +22,11 @@ func AddImport(fset *token.FileSet, f *ast.File, path string) (added bool) {
|
||||||
// If name is not empty, it is used to rename the import.
|
// If name is not empty, it is used to rename the import.
|
||||||
//
|
//
|
||||||
// For example, calling
|
// For example, calling
|
||||||
|
//
|
||||||
// AddNamedImport(fset, f, "pathpkg", "path")
|
// AddNamedImport(fset, f, "pathpkg", "path")
|
||||||
|
//
|
||||||
// adds
|
// adds
|
||||||
|
//
|
||||||
// import pathpkg "path"
|
// import pathpkg "path"
|
||||||
func AddNamedImport(fset *token.FileSet, f *ast.File, name, path string) (added bool) {
|
func AddNamedImport(fset *token.FileSet, f *ast.File, name, path string) (added bool) {
|
||||||
if imports(f, name, path) {
|
if imports(f, name, path) {
|
||||||
|
@ -270,8 +273,8 @@ func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (del
|
||||||
}
|
}
|
||||||
if j > 0 {
|
if j > 0 {
|
||||||
lastImpspec := gen.Specs[j-1].(*ast.ImportSpec)
|
lastImpspec := gen.Specs[j-1].(*ast.ImportSpec)
|
||||||
lastLine := fset.Position(lastImpspec.Path.ValuePos).Line
|
lastLine := fset.PositionFor(lastImpspec.Path.ValuePos, false).Line
|
||||||
line := fset.Position(impspec.Path.ValuePos).Line
|
line := fset.PositionFor(impspec.Path.ValuePos, false).Line
|
||||||
|
|
||||||
// We deleted an entry but now there may be
|
// We deleted an entry but now there may be
|
||||||
// a blank line-sized hole where the import was.
|
// a blank line-sized hole where the import was.
|
||||||
|
|
|
@ -41,7 +41,6 @@ type ApplyFunc func(*Cursor) bool
|
||||||
// Children are traversed in the order in which they appear in the
|
// Children are traversed in the order in which they appear in the
|
||||||
// respective node's struct definition. A package's files are
|
// respective node's struct definition. A package's files are
|
||||||
// traversed in the filenames' alphabetical order.
|
// traversed in the filenames' alphabetical order.
|
||||||
//
|
|
||||||
func Apply(root ast.Node, pre, post ApplyFunc) (result ast.Node) {
|
func Apply(root ast.Node, pre, post ApplyFunc) (result ast.Node) {
|
||||||
parent := &struct{ ast.Node }{root}
|
parent := &struct{ ast.Node }{root}
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -294,6 +293,9 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.
|
||||||
a.apply(n, "Fields", nil, n.Fields)
|
a.apply(n, "Fields", nil, n.Fields)
|
||||||
|
|
||||||
case *ast.FuncType:
|
case *ast.FuncType:
|
||||||
|
if tparams := typeparams.ForFuncType(n); tparams != nil {
|
||||||
|
a.apply(n, "TypeParams", nil, tparams)
|
||||||
|
}
|
||||||
a.apply(n, "Params", nil, n.Params)
|
a.apply(n, "Params", nil, n.Params)
|
||||||
a.apply(n, "Results", nil, n.Results)
|
a.apply(n, "Results", nil, n.Results)
|
||||||
|
|
||||||
|
@ -406,6 +408,9 @@ func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.
|
||||||
case *ast.TypeSpec:
|
case *ast.TypeSpec:
|
||||||
a.apply(n, "Doc", nil, n.Doc)
|
a.apply(n, "Doc", nil, n.Doc)
|
||||||
a.apply(n, "Name", nil, n.Name)
|
a.apply(n, "Name", nil, n.Name)
|
||||||
|
if tparams := typeparams.ForTypeSpec(n); tparams != nil {
|
||||||
|
a.apply(n, "TypeParams", nil, tparams)
|
||||||
|
}
|
||||||
a.apply(n, "Type", nil, n.Type)
|
a.apply(n, "Type", nil, n.Type)
|
||||||
a.apply(n, "Comment", nil, n.Comment)
|
a.apply(n, "Comment", nil, n.Comment)
|
||||||
|
|
||||||
|
|
|
@ -40,12 +40,12 @@ var ErrSkipFiles = errors.New("fastwalk: skip remaining files in directory")
|
||||||
// If fastWalk returns filepath.SkipDir, the directory is skipped.
|
// If fastWalk returns filepath.SkipDir, the directory is skipped.
|
||||||
//
|
//
|
||||||
// Unlike filepath.Walk:
|
// Unlike filepath.Walk:
|
||||||
// * file stat calls must be done by the user.
|
// - file stat calls must be done by the user.
|
||||||
// The only provided metadata is the file type, which does not include
|
// The only provided metadata is the file type, which does not include
|
||||||
// any permission bits.
|
// any permission bits.
|
||||||
// * multiple goroutines stat the filesystem concurrently. The provided
|
// - multiple goroutines stat the filesystem concurrently. The provided
|
||||||
// walkFn must be safe for concurrent use.
|
// walkFn must be safe for concurrent use.
|
||||||
// * fastWalk can follow symlinks if walkFn returns the TraverseLink
|
// - fastWalk can follow symlinks if walkFn returns the TraverseLink
|
||||||
// sentinel error. It is the walkFn's responsibility to prevent
|
// sentinel error. It is the walkFn's responsibility to prevent
|
||||||
// fastWalk from going into symlink cycles.
|
// fastWalk from going into symlink cycles.
|
||||||
func Walk(root string, walkFn func(path string, typ os.FileMode) error) error {
|
func Walk(root string, walkFn func(path string, typ os.FileMode) error) error {
|
||||||
|
|
|
@ -264,9 +264,11 @@ func cmdDebugStr(cmd *exec.Cmd) string {
|
||||||
env := make(map[string]string)
|
env := make(map[string]string)
|
||||||
for _, kv := range cmd.Env {
|
for _, kv := range cmd.Env {
|
||||||
split := strings.SplitN(kv, "=", 2)
|
split := strings.SplitN(kv, "=", 2)
|
||||||
|
if len(split) == 2 {
|
||||||
k, v := split[0], split[1]
|
k, v := split[0], split[1]
|
||||||
env[k] = v
|
env[k] = v
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var args []string
|
var args []string
|
||||||
for _, arg := range cmd.Args {
|
for _, arg := range cmd.Args {
|
||||||
|
|
|
@ -175,8 +175,8 @@ func (w *walker) shouldSkipDir(fi os.FileInfo, dir string) bool {
|
||||||
|
|
||||||
// walk walks through the given path.
|
// walk walks through the given path.
|
||||||
func (w *walker) walk(path string, typ os.FileMode) error {
|
func (w *walker) walk(path string, typ os.FileMode) error {
|
||||||
dir := filepath.Dir(path)
|
|
||||||
if typ.IsRegular() {
|
if typ.IsRegular() {
|
||||||
|
dir := filepath.Dir(path)
|
||||||
if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) {
|
if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) {
|
||||||
// Doesn't make sense to have regular files
|
// Doesn't make sense to have regular files
|
||||||
// directly in your $GOPATH/src or $GOROOT/src.
|
// directly in your $GOPATH/src or $GOROOT/src.
|
||||||
|
@ -209,12 +209,7 @@ func (w *walker) walk(path string, typ os.FileMode) error {
|
||||||
// Emacs noise.
|
// Emacs noise.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fi, err := os.Lstat(path)
|
if w.shouldTraverse(path) {
|
||||||
if err != nil {
|
|
||||||
// Just ignore it.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if w.shouldTraverse(dir, fi) {
|
|
||||||
return fastwalk.ErrTraverseLink
|
return fastwalk.ErrTraverseLink
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,13 +219,8 @@ func (w *walker) walk(path string, typ os.FileMode) error {
|
||||||
// shouldTraverse reports whether the symlink fi, found in dir,
|
// shouldTraverse reports whether the symlink fi, found in dir,
|
||||||
// should be followed. It makes sure symlinks were never visited
|
// should be followed. It makes sure symlinks were never visited
|
||||||
// before to avoid symlink loops.
|
// before to avoid symlink loops.
|
||||||
func (w *walker) shouldTraverse(dir string, fi os.FileInfo) bool {
|
func (w *walker) shouldTraverse(path string) bool {
|
||||||
path := filepath.Join(dir, fi.Name())
|
ts, err := os.Stat(path)
|
||||||
target, err := filepath.EvalSymlinks(path)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
ts, err := os.Stat(target)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err)
|
fmt.Fprintln(os.Stderr, err)
|
||||||
return false
|
return false
|
||||||
|
@ -238,7 +228,7 @@ func (w *walker) shouldTraverse(dir string, fi os.FileInfo) bool {
|
||||||
if !ts.IsDir() {
|
if !ts.IsDir() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if w.shouldSkipDir(ts, dir) {
|
if w.shouldSkipDir(ts, filepath.Dir(path)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// Check for symlink loops by statting each directory component
|
// Check for symlink loops by statting each directory component
|
||||||
|
|
|
@ -103,12 +103,17 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e
|
||||||
return formatFile(fileSet, file, src, nil, opt)
|
return formatFile(fileSet, file, src, nil, opt)
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatFile(fileSet *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) {
|
// formatFile formats the file syntax tree.
|
||||||
mergeImports(fileSet, file)
|
// It may mutate the token.FileSet.
|
||||||
sortImports(opt.LocalPrefix, fileSet, file)
|
//
|
||||||
imps := astutil.Imports(fileSet, file)
|
// If an adjust function is provided, it is called after formatting
|
||||||
|
// with the original source (formatFile's src parameter) and the
|
||||||
|
// formatted file, and returns the postpocessed result.
|
||||||
|
func formatFile(fset *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) {
|
||||||
|
mergeImports(file)
|
||||||
|
sortImports(opt.LocalPrefix, fset.File(file.Pos()), file)
|
||||||
var spacesBefore []string // import paths we need spaces before
|
var spacesBefore []string // import paths we need spaces before
|
||||||
for _, impSection := range imps {
|
for _, impSection := range astutil.Imports(fset, file) {
|
||||||
// Within each block of contiguous imports, see if any
|
// Within each block of contiguous imports, see if any
|
||||||
// import lines are in different group numbers. If so,
|
// import lines are in different group numbers. If so,
|
||||||
// we'll need to put a space between them so it's
|
// we'll need to put a space between them so it's
|
||||||
|
@ -132,7 +137,7 @@ func formatFile(fileSet *token.FileSet, file *ast.File, src []byte, adjust func(
|
||||||
printConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth}
|
printConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth}
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
err := printConfig.Fprint(&buf, fileSet, file)
|
err := printConfig.Fprint(&buf, fset, file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -276,10 +281,10 @@ func cutSpace(b []byte) (before, middle, after []byte) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// matchSpace reformats src to use the same space context as orig.
|
// matchSpace reformats src to use the same space context as orig.
|
||||||
// 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src.
|
// 1. If orig begins with blank lines, matchSpace inserts them at the beginning of src.
|
||||||
// 2) matchSpace copies the indentation of the first non-blank line in orig
|
// 2. matchSpace copies the indentation of the first non-blank line in orig
|
||||||
// to every non-blank line in src.
|
// to every non-blank line in src.
|
||||||
// 3) matchSpace copies the trailing space from orig and uses it in place
|
// 3. matchSpace copies the trailing space from orig and uses it in place
|
||||||
// of src's trailing space.
|
// of src's trailing space.
|
||||||
func matchSpace(orig []byte, src []byte) []byte {
|
func matchSpace(orig []byte, src []byte) []byte {
|
||||||
before, _, after := cutSpace(orig)
|
before, _, after := cutSpace(orig)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Hacked up copy of go/ast/import.go
|
// Hacked up copy of go/ast/import.go
|
||||||
|
// Modified to use a single token.File in preference to a FileSet.
|
||||||
|
|
||||||
package imports
|
package imports
|
||||||
|
|
||||||
|
@ -16,7 +17,9 @@ import (
|
||||||
|
|
||||||
// sortImports sorts runs of consecutive import lines in import blocks in f.
|
// sortImports sorts runs of consecutive import lines in import blocks in f.
|
||||||
// It also removes duplicate imports when it is possible to do so without data loss.
|
// It also removes duplicate imports when it is possible to do so without data loss.
|
||||||
func sortImports(localPrefix string, fset *token.FileSet, f *ast.File) {
|
//
|
||||||
|
// It may mutate the token.File.
|
||||||
|
func sortImports(localPrefix string, tokFile *token.File, f *ast.File) {
|
||||||
for i, d := range f.Decls {
|
for i, d := range f.Decls {
|
||||||
d, ok := d.(*ast.GenDecl)
|
d, ok := d.(*ast.GenDecl)
|
||||||
if !ok || d.Tok != token.IMPORT {
|
if !ok || d.Tok != token.IMPORT {
|
||||||
|
@ -39,21 +42,21 @@ func sortImports(localPrefix string, fset *token.FileSet, f *ast.File) {
|
||||||
i := 0
|
i := 0
|
||||||
specs := d.Specs[:0]
|
specs := d.Specs[:0]
|
||||||
for j, s := range d.Specs {
|
for j, s := range d.Specs {
|
||||||
if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line {
|
if j > i && tokFile.Line(s.Pos()) > 1+tokFile.Line(d.Specs[j-1].End()) {
|
||||||
// j begins a new run. End this one.
|
// j begins a new run. End this one.
|
||||||
specs = append(specs, sortSpecs(localPrefix, fset, f, d.Specs[i:j])...)
|
specs = append(specs, sortSpecs(localPrefix, tokFile, f, d.Specs[i:j])...)
|
||||||
i = j
|
i = j
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
specs = append(specs, sortSpecs(localPrefix, fset, f, d.Specs[i:])...)
|
specs = append(specs, sortSpecs(localPrefix, tokFile, f, d.Specs[i:])...)
|
||||||
d.Specs = specs
|
d.Specs = specs
|
||||||
|
|
||||||
// Deduping can leave a blank line before the rparen; clean that up.
|
// Deduping can leave a blank line before the rparen; clean that up.
|
||||||
if len(d.Specs) > 0 {
|
if len(d.Specs) > 0 {
|
||||||
lastSpec := d.Specs[len(d.Specs)-1]
|
lastSpec := d.Specs[len(d.Specs)-1]
|
||||||
lastLine := fset.Position(lastSpec.Pos()).Line
|
lastLine := tokFile.PositionFor(lastSpec.Pos(), false).Line
|
||||||
if rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 {
|
if rParenLine := tokFile.PositionFor(d.Rparen, false).Line; rParenLine > lastLine+1 {
|
||||||
fset.File(d.Rparen).MergeLine(rParenLine - 1)
|
tokFile.MergeLine(rParenLine - 1) // has side effects!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,7 +65,7 @@ func sortImports(localPrefix string, fset *token.FileSet, f *ast.File) {
|
||||||
// mergeImports merges all the import declarations into the first one.
|
// mergeImports merges all the import declarations into the first one.
|
||||||
// Taken from golang.org/x/tools/ast/astutil.
|
// Taken from golang.org/x/tools/ast/astutil.
|
||||||
// This does not adjust line numbers properly
|
// This does not adjust line numbers properly
|
||||||
func mergeImports(fset *token.FileSet, f *ast.File) {
|
func mergeImports(f *ast.File) {
|
||||||
if len(f.Decls) <= 1 {
|
if len(f.Decls) <= 1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -144,7 +147,9 @@ type posSpan struct {
|
||||||
End token.Pos
|
End token.Pos
|
||||||
}
|
}
|
||||||
|
|
||||||
func sortSpecs(localPrefix string, fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec {
|
// sortSpecs sorts the import specs within each import decl.
|
||||||
|
// It may mutate the token.File.
|
||||||
|
func sortSpecs(localPrefix string, tokFile *token.File, f *ast.File, specs []ast.Spec) []ast.Spec {
|
||||||
// Can't short-circuit here even if specs are already sorted,
|
// Can't short-circuit here even if specs are already sorted,
|
||||||
// since they might yet need deduplication.
|
// since they might yet need deduplication.
|
||||||
// A lone import, however, may be safely ignored.
|
// A lone import, however, may be safely ignored.
|
||||||
|
@ -160,7 +165,7 @@ func sortSpecs(localPrefix string, fset *token.FileSet, f *ast.File, specs []ast
|
||||||
|
|
||||||
// Identify comments in this range.
|
// Identify comments in this range.
|
||||||
// Any comment from pos[0].Start to the final line counts.
|
// Any comment from pos[0].Start to the final line counts.
|
||||||
lastLine := fset.Position(pos[len(pos)-1].End).Line
|
lastLine := tokFile.Line(pos[len(pos)-1].End)
|
||||||
cstart := len(f.Comments)
|
cstart := len(f.Comments)
|
||||||
cend := len(f.Comments)
|
cend := len(f.Comments)
|
||||||
for i, g := range f.Comments {
|
for i, g := range f.Comments {
|
||||||
|
@ -170,7 +175,7 @@ func sortSpecs(localPrefix string, fset *token.FileSet, f *ast.File, specs []ast
|
||||||
if i < cstart {
|
if i < cstart {
|
||||||
cstart = i
|
cstart = i
|
||||||
}
|
}
|
||||||
if fset.Position(g.End()).Line > lastLine {
|
if tokFile.Line(g.End()) > lastLine {
|
||||||
cend = i
|
cend = i
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -203,7 +208,7 @@ func sortSpecs(localPrefix string, fset *token.FileSet, f *ast.File, specs []ast
|
||||||
deduped = append(deduped, s)
|
deduped = append(deduped, s)
|
||||||
} else {
|
} else {
|
||||||
p := s.Pos()
|
p := s.Pos()
|
||||||
fset.File(p).MergeLine(fset.Position(p).Line)
|
tokFile.MergeLine(tokFile.Line(p)) // has side effects!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
specs = deduped
|
specs = deduped
|
||||||
|
@ -234,21 +239,21 @@ func sortSpecs(localPrefix string, fset *token.FileSet, f *ast.File, specs []ast
|
||||||
|
|
||||||
// Fixup comments can insert blank lines, because import specs are on different lines.
|
// Fixup comments can insert blank lines, because import specs are on different lines.
|
||||||
// We remove those blank lines here by merging import spec to the first import spec line.
|
// We remove those blank lines here by merging import spec to the first import spec line.
|
||||||
firstSpecLine := fset.Position(specs[0].Pos()).Line
|
firstSpecLine := tokFile.Line(specs[0].Pos())
|
||||||
for _, s := range specs[1:] {
|
for _, s := range specs[1:] {
|
||||||
p := s.Pos()
|
p := s.Pos()
|
||||||
line := fset.File(p).Line(p)
|
line := tokFile.Line(p)
|
||||||
for previousLine := line - 1; previousLine >= firstSpecLine; {
|
for previousLine := line - 1; previousLine >= firstSpecLine; {
|
||||||
// MergeLine can panic. Avoid the panic at the cost of not removing the blank line
|
// MergeLine can panic. Avoid the panic at the cost of not removing the blank line
|
||||||
// golang/go#50329
|
// golang/go#50329
|
||||||
if previousLine > 0 && previousLine < fset.File(p).LineCount() {
|
if previousLine > 0 && previousLine < tokFile.LineCount() {
|
||||||
fset.File(p).MergeLine(previousLine)
|
tokFile.MergeLine(previousLine) // has side effects!
|
||||||
previousLine--
|
previousLine--
|
||||||
} else {
|
} else {
|
||||||
// try to gather some data to diagnose how this could happen
|
// try to gather some data to diagnose how this could happen
|
||||||
req := "Please report what the imports section of your go file looked like."
|
req := "Please report what the imports section of your go file looked like."
|
||||||
log.Printf("panic avoided: first:%d line:%d previous:%d max:%d. %s",
|
log.Printf("panic avoided: first:%d line:%d previous:%d max:%d. %s",
|
||||||
firstSpecLine, line, previousLine, fset.File(p).LineCount(), req)
|
firstSpecLine, line, previousLine, tokFile.LineCount(), req)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,6 +88,7 @@ var stdlib = map[string][]string{
|
||||||
"ContainsAny",
|
"ContainsAny",
|
||||||
"ContainsRune",
|
"ContainsRune",
|
||||||
"Count",
|
"Count",
|
||||||
|
"Cut",
|
||||||
"Equal",
|
"Equal",
|
||||||
"EqualFold",
|
"EqualFold",
|
||||||
"ErrTooLarge",
|
"ErrTooLarge",
|
||||||
|
@ -711,6 +712,11 @@ var stdlib = map[string][]string{
|
||||||
"ValueConverter",
|
"ValueConverter",
|
||||||
"Valuer",
|
"Valuer",
|
||||||
},
|
},
|
||||||
|
"debug/buildinfo": []string{
|
||||||
|
"BuildInfo",
|
||||||
|
"Read",
|
||||||
|
"ReadFile",
|
||||||
|
},
|
||||||
"debug/dwarf": []string{
|
"debug/dwarf": []string{
|
||||||
"AddrType",
|
"AddrType",
|
||||||
"ArrayType",
|
"ArrayType",
|
||||||
|
@ -1944,6 +1950,7 @@ var stdlib = map[string][]string{
|
||||||
"R_PPC64_REL24_NOTOC",
|
"R_PPC64_REL24_NOTOC",
|
||||||
"R_PPC64_REL32",
|
"R_PPC64_REL32",
|
||||||
"R_PPC64_REL64",
|
"R_PPC64_REL64",
|
||||||
|
"R_PPC64_RELATIVE",
|
||||||
"R_PPC64_SECTOFF_DS",
|
"R_PPC64_SECTOFF_DS",
|
||||||
"R_PPC64_SECTOFF_LO_DS",
|
"R_PPC64_SECTOFF_LO_DS",
|
||||||
"R_PPC64_TLS",
|
"R_PPC64_TLS",
|
||||||
|
@ -2547,6 +2554,7 @@ var stdlib = map[string][]string{
|
||||||
"Symbol",
|
"Symbol",
|
||||||
},
|
},
|
||||||
"debug/plan9obj": []string{
|
"debug/plan9obj": []string{
|
||||||
|
"ErrNoSymbols",
|
||||||
"File",
|
"File",
|
||||||
"FileHeader",
|
"FileHeader",
|
||||||
"Magic386",
|
"Magic386",
|
||||||
|
@ -2906,6 +2914,7 @@ var stdlib = map[string][]string{
|
||||||
"Importer",
|
"Importer",
|
||||||
"IncDecStmt",
|
"IncDecStmt",
|
||||||
"IndexExpr",
|
"IndexExpr",
|
||||||
|
"IndexListExpr",
|
||||||
"Inspect",
|
"Inspect",
|
||||||
"InterfaceType",
|
"InterfaceType",
|
||||||
"IsExported",
|
"IsExported",
|
||||||
|
@ -3179,6 +3188,7 @@ var stdlib = map[string][]string{
|
||||||
"SUB",
|
"SUB",
|
||||||
"SUB_ASSIGN",
|
"SUB_ASSIGN",
|
||||||
"SWITCH",
|
"SWITCH",
|
||||||
|
"TILDE",
|
||||||
"TYPE",
|
"TYPE",
|
||||||
"Token",
|
"Token",
|
||||||
"UnaryPrec",
|
"UnaryPrec",
|
||||||
|
@ -3187,6 +3197,7 @@ var stdlib = map[string][]string{
|
||||||
"XOR_ASSIGN",
|
"XOR_ASSIGN",
|
||||||
},
|
},
|
||||||
"go/types": []string{
|
"go/types": []string{
|
||||||
|
"ArgumentError",
|
||||||
"Array",
|
"Array",
|
||||||
"AssertableTo",
|
"AssertableTo",
|
||||||
"AssignableTo",
|
"AssignableTo",
|
||||||
|
@ -3205,6 +3216,7 @@ var stdlib = map[string][]string{
|
||||||
"Complex64",
|
"Complex64",
|
||||||
"Config",
|
"Config",
|
||||||
"Const",
|
"Const",
|
||||||
|
"Context",
|
||||||
"ConvertibleTo",
|
"ConvertibleTo",
|
||||||
"DefPredeclaredTestFuncs",
|
"DefPredeclaredTestFuncs",
|
||||||
"Default",
|
"Default",
|
||||||
|
@ -3224,6 +3236,8 @@ var stdlib = map[string][]string{
|
||||||
"ImporterFrom",
|
"ImporterFrom",
|
||||||
"Info",
|
"Info",
|
||||||
"Initializer",
|
"Initializer",
|
||||||
|
"Instance",
|
||||||
|
"Instantiate",
|
||||||
"Int",
|
"Int",
|
||||||
"Int16",
|
"Int16",
|
||||||
"Int32",
|
"Int32",
|
||||||
|
@ -3254,6 +3268,7 @@ var stdlib = map[string][]string{
|
||||||
"NewChan",
|
"NewChan",
|
||||||
"NewChecker",
|
"NewChecker",
|
||||||
"NewConst",
|
"NewConst",
|
||||||
|
"NewContext",
|
||||||
"NewField",
|
"NewField",
|
||||||
"NewFunc",
|
"NewFunc",
|
||||||
"NewInterface",
|
"NewInterface",
|
||||||
|
@ -3268,10 +3283,14 @@ var stdlib = map[string][]string{
|
||||||
"NewPointer",
|
"NewPointer",
|
||||||
"NewScope",
|
"NewScope",
|
||||||
"NewSignature",
|
"NewSignature",
|
||||||
|
"NewSignatureType",
|
||||||
"NewSlice",
|
"NewSlice",
|
||||||
"NewStruct",
|
"NewStruct",
|
||||||
|
"NewTerm",
|
||||||
"NewTuple",
|
"NewTuple",
|
||||||
"NewTypeName",
|
"NewTypeName",
|
||||||
|
"NewTypeParam",
|
||||||
|
"NewUnion",
|
||||||
"NewVar",
|
"NewVar",
|
||||||
"Nil",
|
"Nil",
|
||||||
"Object",
|
"Object",
|
||||||
|
@ -3296,11 +3315,15 @@ var stdlib = map[string][]string{
|
||||||
"StdSizes",
|
"StdSizes",
|
||||||
"String",
|
"String",
|
||||||
"Struct",
|
"Struct",
|
||||||
|
"Term",
|
||||||
"Tuple",
|
"Tuple",
|
||||||
"Typ",
|
"Typ",
|
||||||
"Type",
|
"Type",
|
||||||
"TypeAndValue",
|
"TypeAndValue",
|
||||||
|
"TypeList",
|
||||||
"TypeName",
|
"TypeName",
|
||||||
|
"TypeParam",
|
||||||
|
"TypeParamList",
|
||||||
"TypeString",
|
"TypeString",
|
||||||
"Uint",
|
"Uint",
|
||||||
"Uint16",
|
"Uint16",
|
||||||
|
@ -3308,6 +3331,7 @@ var stdlib = map[string][]string{
|
||||||
"Uint64",
|
"Uint64",
|
||||||
"Uint8",
|
"Uint8",
|
||||||
"Uintptr",
|
"Uintptr",
|
||||||
|
"Union",
|
||||||
"Universe",
|
"Universe",
|
||||||
"Unsafe",
|
"Unsafe",
|
||||||
"UnsafePointer",
|
"UnsafePointer",
|
||||||
|
@ -4080,9 +4104,11 @@ var stdlib = map[string][]string{
|
||||||
"SRV",
|
"SRV",
|
||||||
"SplitHostPort",
|
"SplitHostPort",
|
||||||
"TCPAddr",
|
"TCPAddr",
|
||||||
|
"TCPAddrFromAddrPort",
|
||||||
"TCPConn",
|
"TCPConn",
|
||||||
"TCPListener",
|
"TCPListener",
|
||||||
"UDPAddr",
|
"UDPAddr",
|
||||||
|
"UDPAddrFromAddrPort",
|
||||||
"UDPConn",
|
"UDPConn",
|
||||||
"UnixAddr",
|
"UnixAddr",
|
||||||
"UnixConn",
|
"UnixConn",
|
||||||
|
@ -4142,6 +4168,7 @@ var stdlib = map[string][]string{
|
||||||
"ListenAndServe",
|
"ListenAndServe",
|
||||||
"ListenAndServeTLS",
|
"ListenAndServeTLS",
|
||||||
"LocalAddrContextKey",
|
"LocalAddrContextKey",
|
||||||
|
"MaxBytesHandler",
|
||||||
"MaxBytesReader",
|
"MaxBytesReader",
|
||||||
"MethodConnect",
|
"MethodConnect",
|
||||||
"MethodDelete",
|
"MethodDelete",
|
||||||
|
@ -4338,6 +4365,25 @@ var stdlib = map[string][]string{
|
||||||
"ParseDate",
|
"ParseDate",
|
||||||
"ReadMessage",
|
"ReadMessage",
|
||||||
},
|
},
|
||||||
|
"net/netip": []string{
|
||||||
|
"Addr",
|
||||||
|
"AddrFrom16",
|
||||||
|
"AddrFrom4",
|
||||||
|
"AddrFromSlice",
|
||||||
|
"AddrPort",
|
||||||
|
"AddrPortFrom",
|
||||||
|
"IPv4Unspecified",
|
||||||
|
"IPv6LinkLocalAllNodes",
|
||||||
|
"IPv6Unspecified",
|
||||||
|
"MustParseAddr",
|
||||||
|
"MustParseAddrPort",
|
||||||
|
"MustParsePrefix",
|
||||||
|
"ParseAddr",
|
||||||
|
"ParseAddrPort",
|
||||||
|
"ParsePrefix",
|
||||||
|
"Prefix",
|
||||||
|
"PrefixFrom",
|
||||||
|
},
|
||||||
"net/rpc": []string{
|
"net/rpc": []string{
|
||||||
"Accept",
|
"Accept",
|
||||||
"Call",
|
"Call",
|
||||||
|
@ -4641,6 +4687,8 @@ var stdlib = map[string][]string{
|
||||||
"Method",
|
"Method",
|
||||||
"New",
|
"New",
|
||||||
"NewAt",
|
"NewAt",
|
||||||
|
"Pointer",
|
||||||
|
"PointerTo",
|
||||||
"Ptr",
|
"Ptr",
|
||||||
"PtrTo",
|
"PtrTo",
|
||||||
"RecvDir",
|
"RecvDir",
|
||||||
|
@ -4819,9 +4867,11 @@ var stdlib = map[string][]string{
|
||||||
},
|
},
|
||||||
"runtime/debug": []string{
|
"runtime/debug": []string{
|
||||||
"BuildInfo",
|
"BuildInfo",
|
||||||
|
"BuildSetting",
|
||||||
"FreeOSMemory",
|
"FreeOSMemory",
|
||||||
"GCStats",
|
"GCStats",
|
||||||
"Module",
|
"Module",
|
||||||
|
"ParseBuildInfo",
|
||||||
"PrintStack",
|
"PrintStack",
|
||||||
"ReadBuildInfo",
|
"ReadBuildInfo",
|
||||||
"ReadGCStats",
|
"ReadGCStats",
|
||||||
|
@ -4939,11 +4989,13 @@ var stdlib = map[string][]string{
|
||||||
},
|
},
|
||||||
"strings": []string{
|
"strings": []string{
|
||||||
"Builder",
|
"Builder",
|
||||||
|
"Clone",
|
||||||
"Compare",
|
"Compare",
|
||||||
"Contains",
|
"Contains",
|
||||||
"ContainsAny",
|
"ContainsAny",
|
||||||
"ContainsRune",
|
"ContainsRune",
|
||||||
"Count",
|
"Count",
|
||||||
|
"Cut",
|
||||||
"EqualFold",
|
"EqualFold",
|
||||||
"Fields",
|
"Fields",
|
||||||
"FieldsFunc",
|
"FieldsFunc",
|
||||||
|
@ -9793,6 +9845,7 @@ var stdlib = map[string][]string{
|
||||||
"Syscall18",
|
"Syscall18",
|
||||||
"Syscall6",
|
"Syscall6",
|
||||||
"Syscall9",
|
"Syscall9",
|
||||||
|
"SyscallN",
|
||||||
"Sysctl",
|
"Sysctl",
|
||||||
"SysctlUint32",
|
"SysctlUint32",
|
||||||
"Sysctlnode",
|
"Sysctlnode",
|
||||||
|
@ -10202,7 +10255,6 @@ var stdlib = map[string][]string{
|
||||||
"Value",
|
"Value",
|
||||||
"ValueError",
|
"ValueError",
|
||||||
"ValueOf",
|
"ValueOf",
|
||||||
"Wrapper",
|
|
||||||
},
|
},
|
||||||
"testing": []string{
|
"testing": []string{
|
||||||
"AllocsPerRun",
|
"AllocsPerRun",
|
||||||
|
@ -10213,9 +10265,11 @@ var stdlib = map[string][]string{
|
||||||
"CoverBlock",
|
"CoverBlock",
|
||||||
"CoverMode",
|
"CoverMode",
|
||||||
"Coverage",
|
"Coverage",
|
||||||
|
"F",
|
||||||
"Init",
|
"Init",
|
||||||
"InternalBenchmark",
|
"InternalBenchmark",
|
||||||
"InternalExample",
|
"InternalExample",
|
||||||
|
"InternalFuzzTarget",
|
||||||
"InternalTest",
|
"InternalTest",
|
||||||
"M",
|
"M",
|
||||||
"Main",
|
"Main",
|
||||||
|
@ -10313,9 +10367,11 @@ var stdlib = map[string][]string{
|
||||||
"ActionNode",
|
"ActionNode",
|
||||||
"BoolNode",
|
"BoolNode",
|
||||||
"BranchNode",
|
"BranchNode",
|
||||||
|
"BreakNode",
|
||||||
"ChainNode",
|
"ChainNode",
|
||||||
"CommandNode",
|
"CommandNode",
|
||||||
"CommentNode",
|
"CommentNode",
|
||||||
|
"ContinueNode",
|
||||||
"DotNode",
|
"DotNode",
|
||||||
"FieldNode",
|
"FieldNode",
|
||||||
"IdentifierNode",
|
"IdentifierNode",
|
||||||
|
@ -10329,9 +10385,11 @@ var stdlib = map[string][]string{
|
||||||
"Node",
|
"Node",
|
||||||
"NodeAction",
|
"NodeAction",
|
||||||
"NodeBool",
|
"NodeBool",
|
||||||
|
"NodeBreak",
|
||||||
"NodeChain",
|
"NodeChain",
|
||||||
"NodeCommand",
|
"NodeCommand",
|
||||||
"NodeComment",
|
"NodeComment",
|
||||||
|
"NodeContinue",
|
||||||
"NodeDot",
|
"NodeDot",
|
||||||
"NodeField",
|
"NodeField",
|
||||||
"NodeIdentifier",
|
"NodeIdentifier",
|
||||||
|
@ -10727,6 +10785,7 @@ var stdlib = map[string][]string{
|
||||||
"IsSurrogate",
|
"IsSurrogate",
|
||||||
},
|
},
|
||||||
"unicode/utf8": []string{
|
"unicode/utf8": []string{
|
||||||
|
"AppendRune",
|
||||||
"DecodeLastRune",
|
"DecodeLastRune",
|
||||||
"DecodeLastRuneInString",
|
"DecodeLastRuneInString",
|
||||||
"DecodeRune",
|
"DecodeRune",
|
||||||
|
|
|
@ -16,11 +16,10 @@
|
||||||
// Additionally, this package contains common utilities for working with the
|
// Additionally, this package contains common utilities for working with the
|
||||||
// new generic constructs, to supplement the standard library APIs. Notably,
|
// new generic constructs, to supplement the standard library APIs. Notably,
|
||||||
// the StructuralTerms API computes a minimal representation of the structural
|
// the StructuralTerms API computes a minimal representation of the structural
|
||||||
// restrictions on a type parameter. In the future, this API may be available
|
// restrictions on a type parameter.
|
||||||
// from go/types.
|
|
||||||
//
|
//
|
||||||
// See the example/README.md for a more detailed guide on how to update tools
|
// An external version of these APIs is available in the
|
||||||
// to support generics.
|
// golang.org/x/exp/typeparams module.
|
||||||
package typeparams
|
package typeparams
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
122
test/tools/vendor/golang.org/x/tools/internal/typeparams/coretype.go
generated
vendored
Normal file
122
test/tools/vendor/golang.org/x/tools/internal/typeparams/coretype.go
generated
vendored
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
// Copyright 2022 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package typeparams
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CoreType returns the core type of T or nil if T does not have a core type.
|
||||||
|
//
|
||||||
|
// See https://go.dev/ref/spec#Core_types for the definition of a core type.
|
||||||
|
func CoreType(T types.Type) types.Type {
|
||||||
|
U := T.Underlying()
|
||||||
|
if _, ok := U.(*types.Interface); !ok {
|
||||||
|
return U // for non-interface types,
|
||||||
|
}
|
||||||
|
|
||||||
|
terms, err := _NormalTerms(U)
|
||||||
|
if len(terms) == 0 || err != nil {
|
||||||
|
// len(terms) -> empty type set of interface.
|
||||||
|
// err != nil => U is invalid, exceeds complexity bounds, or has an empty type set.
|
||||||
|
return nil // no core type.
|
||||||
|
}
|
||||||
|
|
||||||
|
U = terms[0].Type().Underlying()
|
||||||
|
var identical int // i in [0,identical) => Identical(U, terms[i].Type().Underlying())
|
||||||
|
for identical = 1; identical < len(terms); identical++ {
|
||||||
|
if !types.Identical(U, terms[identical].Type().Underlying()) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if identical == len(terms) {
|
||||||
|
// https://go.dev/ref/spec#Core_types
|
||||||
|
// "There is a single type U which is the underlying type of all types in the type set of T"
|
||||||
|
return U
|
||||||
|
}
|
||||||
|
ch, ok := U.(*types.Chan)
|
||||||
|
if !ok {
|
||||||
|
return nil // no core type as identical < len(terms) and U is not a channel.
|
||||||
|
}
|
||||||
|
// https://go.dev/ref/spec#Core_types
|
||||||
|
// "the type chan E if T contains only bidirectional channels, or the type chan<- E or
|
||||||
|
// <-chan E depending on the direction of the directional channels present."
|
||||||
|
for chans := identical; chans < len(terms); chans++ {
|
||||||
|
curr, ok := terms[chans].Type().Underlying().(*types.Chan)
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if !types.Identical(ch.Elem(), curr.Elem()) {
|
||||||
|
return nil // channel elements are not identical.
|
||||||
|
}
|
||||||
|
if ch.Dir() == types.SendRecv {
|
||||||
|
// ch is bidirectional. We can safely always use curr's direction.
|
||||||
|
ch = curr
|
||||||
|
} else if curr.Dir() != types.SendRecv && ch.Dir() != curr.Dir() {
|
||||||
|
// ch and curr are not bidirectional and not the same direction.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
// _NormalTerms returns a slice of terms representing the normalized structural
|
||||||
|
// type restrictions of a type, if any.
|
||||||
|
//
|
||||||
|
// For all types other than *types.TypeParam, *types.Interface, and
|
||||||
|
// *types.Union, this is just a single term with Tilde() == false and
|
||||||
|
// Type() == typ. For *types.TypeParam, *types.Interface, and *types.Union, see
|
||||||
|
// below.
|
||||||
|
//
|
||||||
|
// Structural type restrictions of a type parameter are created via
|
||||||
|
// non-interface types embedded in its constraint interface (directly, or via a
|
||||||
|
// chain of interface embeddings). For example, in the declaration type
|
||||||
|
// T[P interface{~int; m()}] int the structural restriction of the type
|
||||||
|
// parameter P is ~int.
|
||||||
|
//
|
||||||
|
// With interface embedding and unions, the specification of structural type
|
||||||
|
// restrictions may be arbitrarily complex. For example, consider the
|
||||||
|
// following:
|
||||||
|
//
|
||||||
|
// type A interface{ ~string|~[]byte }
|
||||||
|
//
|
||||||
|
// type B interface{ int|string }
|
||||||
|
//
|
||||||
|
// type C interface { ~string|~int }
|
||||||
|
//
|
||||||
|
// type T[P interface{ A|B; C }] int
|
||||||
|
//
|
||||||
|
// In this example, the structural type restriction of P is ~string|int: A|B
|
||||||
|
// expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int,
|
||||||
|
// which when intersected with C (~string|~int) yields ~string|int.
|
||||||
|
//
|
||||||
|
// _NormalTerms computes these expansions and reductions, producing a
|
||||||
|
// "normalized" form of the embeddings. A structural restriction is normalized
|
||||||
|
// if it is a single union containing no interface terms, and is minimal in the
|
||||||
|
// sense that removing any term changes the set of types satisfying the
|
||||||
|
// constraint. It is left as a proof for the reader that, modulo sorting, there
|
||||||
|
// is exactly one such normalized form.
|
||||||
|
//
|
||||||
|
// Because the minimal representation always takes this form, _NormalTerms
|
||||||
|
// returns a slice of tilde terms corresponding to the terms of the union in
|
||||||
|
// the normalized structural restriction. An error is returned if the type is
|
||||||
|
// invalid, exceeds complexity bounds, or has an empty type set. In the latter
|
||||||
|
// case, _NormalTerms returns ErrEmptyTypeSet.
|
||||||
|
//
|
||||||
|
// _NormalTerms makes no guarantees about the order of terms, except that it
|
||||||
|
// is deterministic.
|
||||||
|
func _NormalTerms(typ types.Type) ([]*Term, error) {
|
||||||
|
switch typ := typ.(type) {
|
||||||
|
case *TypeParam:
|
||||||
|
return StructuralTerms(typ)
|
||||||
|
case *Union:
|
||||||
|
return UnionTermSet(typ)
|
||||||
|
case *types.Interface:
|
||||||
|
return InterfaceTermSet(typ)
|
||||||
|
default:
|
||||||
|
return []*Term{NewTerm(false, typ)}, nil
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,7 +24,9 @@ var ErrEmptyTypeSet = errors.New("empty type set")
|
||||||
// Structural type restrictions of a type parameter are created via
|
// Structural type restrictions of a type parameter are created via
|
||||||
// non-interface types embedded in its constraint interface (directly, or via a
|
// non-interface types embedded in its constraint interface (directly, or via a
|
||||||
// chain of interface embeddings). For example, in the declaration
|
// chain of interface embeddings). For example, in the declaration
|
||||||
|
//
|
||||||
// type T[P interface{~int; m()}] int
|
// type T[P interface{~int; m()}] int
|
||||||
|
//
|
||||||
// the structural restriction of the type parameter P is ~int.
|
// the structural restriction of the type parameter P is ~int.
|
||||||
//
|
//
|
||||||
// With interface embedding and unions, the specification of structural type
|
// With interface embedding and unions, the specification of structural type
|
||||||
|
|
|
@ -97,15 +97,6 @@ func (xl termlist) norm() termlist {
|
||||||
return rl
|
return rl
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the type set represented by xl is specified by a single (non-𝓤) term,
|
|
||||||
// structuralType returns that type. Otherwise it returns nil.
|
|
||||||
func (xl termlist) structuralType() types.Type {
|
|
||||||
if nl := xl.norm(); len(nl) == 1 {
|
|
||||||
return nl[0].typ // if nl.isAll() then typ is nil, which is ok
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// union returns the union xl ∪ yl.
|
// union returns the union xl ∪ yl.
|
||||||
func (xl termlist) union(yl termlist) termlist {
|
func (xl termlist) union(yl termlist) termlist {
|
||||||
return append(xl, yl...).norm()
|
return append(xl, yl...).norm()
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
Copyright (c) 2019 The Go Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1,22 +0,0 @@
|
||||||
Additional IP Rights Grant (Patents)
|
|
||||||
|
|
||||||
"This implementation" means the copyrightable works distributed by
|
|
||||||
Google as part of the Go project.
|
|
||||||
|
|
||||||
Google hereby grants to You a perpetual, worldwide, non-exclusive,
|
|
||||||
no-charge, royalty-free, irrevocable (except as stated in this section)
|
|
||||||
patent license to make, have made, use, offer to sell, sell, import,
|
|
||||||
transfer and otherwise run, modify and propagate the contents of this
|
|
||||||
implementation of Go, where such license applies only to those patent
|
|
||||||
claims, both currently owned or controlled by Google and acquired in
|
|
||||||
the future, licensable by Google that are necessarily infringed by this
|
|
||||||
implementation of Go. This grant does not include claims that would be
|
|
||||||
infringed only as a consequence of further modification of this
|
|
||||||
implementation. If you or your agent or exclusive licensee institute or
|
|
||||||
order or agree to the institution of patent litigation against any
|
|
||||||
entity (including a cross-claim or counterclaim in a lawsuit) alleging
|
|
||||||
that this implementation of Go or any code incorporated within this
|
|
||||||
implementation of Go constitutes direct or contributory patent
|
|
||||||
infringement, or inducement of patent infringement, then any patent
|
|
||||||
rights granted to you under this License for this implementation of Go
|
|
||||||
shall terminate as of the date such litigation is filed.
|
|
|
@ -1,2 +0,0 @@
|
||||||
This repository holds the transition packages for the new Go 1.13 error values.
|
|
||||||
See golang.org/design/29934-error-values.
|
|
|
@ -1,193 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package xerrors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
// FormatError calls the FormatError method of f with an errors.Printer
|
|
||||||
// configured according to s and verb, and writes the result to s.
|
|
||||||
func FormatError(f Formatter, s fmt.State, verb rune) {
|
|
||||||
// Assuming this function is only called from the Format method, and given
|
|
||||||
// that FormatError takes precedence over Format, it cannot be called from
|
|
||||||
// any package that supports errors.Formatter. It is therefore safe to
|
|
||||||
// disregard that State may be a specific printer implementation and use one
|
|
||||||
// of our choice instead.
|
|
||||||
|
|
||||||
// limitations: does not support printing error as Go struct.
|
|
||||||
|
|
||||||
var (
|
|
||||||
sep = " " // separator before next error
|
|
||||||
p = &state{State: s}
|
|
||||||
direct = true
|
|
||||||
)
|
|
||||||
|
|
||||||
var err error = f
|
|
||||||
|
|
||||||
switch verb {
|
|
||||||
// Note that this switch must match the preference order
|
|
||||||
// for ordinary string printing (%#v before %+v, and so on).
|
|
||||||
|
|
||||||
case 'v':
|
|
||||||
if s.Flag('#') {
|
|
||||||
if stringer, ok := err.(fmt.GoStringer); ok {
|
|
||||||
io.WriteString(&p.buf, stringer.GoString())
|
|
||||||
goto exit
|
|
||||||
}
|
|
||||||
// proceed as if it were %v
|
|
||||||
} else if s.Flag('+') {
|
|
||||||
p.printDetail = true
|
|
||||||
sep = "\n - "
|
|
||||||
}
|
|
||||||
case 's':
|
|
||||||
case 'q', 'x', 'X':
|
|
||||||
// Use an intermediate buffer in the rare cases that precision,
|
|
||||||
// truncation, or one of the alternative verbs (q, x, and X) are
|
|
||||||
// specified.
|
|
||||||
direct = false
|
|
||||||
|
|
||||||
default:
|
|
||||||
p.buf.WriteString("%!")
|
|
||||||
p.buf.WriteRune(verb)
|
|
||||||
p.buf.WriteByte('(')
|
|
||||||
switch {
|
|
||||||
case err != nil:
|
|
||||||
p.buf.WriteString(reflect.TypeOf(f).String())
|
|
||||||
default:
|
|
||||||
p.buf.WriteString("<nil>")
|
|
||||||
}
|
|
||||||
p.buf.WriteByte(')')
|
|
||||||
io.Copy(s, &p.buf)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
loop:
|
|
||||||
for {
|
|
||||||
switch v := err.(type) {
|
|
||||||
case Formatter:
|
|
||||||
err = v.FormatError((*printer)(p))
|
|
||||||
case fmt.Formatter:
|
|
||||||
v.Format(p, 'v')
|
|
||||||
break loop
|
|
||||||
default:
|
|
||||||
io.WriteString(&p.buf, v.Error())
|
|
||||||
break loop
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if p.needColon || !p.printDetail {
|
|
||||||
p.buf.WriteByte(':')
|
|
||||||
p.needColon = false
|
|
||||||
}
|
|
||||||
p.buf.WriteString(sep)
|
|
||||||
p.inDetail = false
|
|
||||||
p.needNewline = false
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
width, okW := s.Width()
|
|
||||||
prec, okP := s.Precision()
|
|
||||||
|
|
||||||
if !direct || (okW && width > 0) || okP {
|
|
||||||
// Construct format string from State s.
|
|
||||||
format := []byte{'%'}
|
|
||||||
if s.Flag('-') {
|
|
||||||
format = append(format, '-')
|
|
||||||
}
|
|
||||||
if s.Flag('+') {
|
|
||||||
format = append(format, '+')
|
|
||||||
}
|
|
||||||
if s.Flag(' ') {
|
|
||||||
format = append(format, ' ')
|
|
||||||
}
|
|
||||||
if okW {
|
|
||||||
format = strconv.AppendInt(format, int64(width), 10)
|
|
||||||
}
|
|
||||||
if okP {
|
|
||||||
format = append(format, '.')
|
|
||||||
format = strconv.AppendInt(format, int64(prec), 10)
|
|
||||||
}
|
|
||||||
format = append(format, string(verb)...)
|
|
||||||
fmt.Fprintf(s, string(format), p.buf.String())
|
|
||||||
} else {
|
|
||||||
io.Copy(s, &p.buf)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var detailSep = []byte("\n ")
|
|
||||||
|
|
||||||
// state tracks error printing state. It implements fmt.State.
|
|
||||||
type state struct {
|
|
||||||
fmt.State
|
|
||||||
buf bytes.Buffer
|
|
||||||
|
|
||||||
printDetail bool
|
|
||||||
inDetail bool
|
|
||||||
needColon bool
|
|
||||||
needNewline bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) Write(b []byte) (n int, err error) {
|
|
||||||
if s.printDetail {
|
|
||||||
if len(b) == 0 {
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
if s.inDetail && s.needColon {
|
|
||||||
s.needNewline = true
|
|
||||||
if b[0] == '\n' {
|
|
||||||
b = b[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
k := 0
|
|
||||||
for i, c := range b {
|
|
||||||
if s.needNewline {
|
|
||||||
if s.inDetail && s.needColon {
|
|
||||||
s.buf.WriteByte(':')
|
|
||||||
s.needColon = false
|
|
||||||
}
|
|
||||||
s.buf.Write(detailSep)
|
|
||||||
s.needNewline = false
|
|
||||||
}
|
|
||||||
if c == '\n' {
|
|
||||||
s.buf.Write(b[k:i])
|
|
||||||
k = i + 1
|
|
||||||
s.needNewline = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.buf.Write(b[k:])
|
|
||||||
if !s.inDetail {
|
|
||||||
s.needColon = true
|
|
||||||
}
|
|
||||||
} else if !s.inDetail {
|
|
||||||
s.buf.Write(b)
|
|
||||||
}
|
|
||||||
return len(b), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// printer wraps a state to implement an xerrors.Printer.
|
|
||||||
type printer state
|
|
||||||
|
|
||||||
func (s *printer) Print(args ...interface{}) {
|
|
||||||
if !s.inDetail || s.printDetail {
|
|
||||||
fmt.Fprint((*state)(s), args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *printer) Printf(format string, args ...interface{}) {
|
|
||||||
if !s.inDetail || s.printDetail {
|
|
||||||
fmt.Fprintf((*state)(s), format, args...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *printer) Detail() bool {
|
|
||||||
s.inDetail = true
|
|
||||||
return s.printDetail
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
issuerepo: golang/go
|
|
|
@ -1,22 +0,0 @@
|
||||||
// Copyright 2019 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package xerrors implements functions to manipulate errors.
|
|
||||||
//
|
|
||||||
// This package is based on the Go 2 proposal for error values:
|
|
||||||
// https://golang.org/design/29934-error-values
|
|
||||||
//
|
|
||||||
// These functions were incorporated into the standard library's errors package
|
|
||||||
// in Go 1.13:
|
|
||||||
// - Is
|
|
||||||
// - As
|
|
||||||
// - Unwrap
|
|
||||||
//
|
|
||||||
// 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"
|
|
|
@ -1,33 +0,0 @@
|
||||||
// Copyright 2011 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package xerrors
|
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
// errorString is a trivial implementation of error.
|
|
||||||
type errorString struct {
|
|
||||||
s string
|
|
||||||
frame Frame
|
|
||||||
}
|
|
||||||
|
|
||||||
// New returns an error that formats as the given text.
|
|
||||||
//
|
|
||||||
// The returned error contains a Frame set to the caller's location and
|
|
||||||
// implements Formatter to show this information when printed with details.
|
|
||||||
func New(text string) error {
|
|
||||||
return &errorString{text, Caller(1)}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *errorString) Error() string {
|
|
||||||
return e.s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) }
|
|
||||||
|
|
||||||
func (e *errorString) FormatError(p Printer) (next error) {
|
|
||||||
p.Print(e.s)
|
|
||||||
e.frame.Format(p)
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,187 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package xerrors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"golang.org/x/xerrors/internal"
|
|
||||||
)
|
|
||||||
|
|
||||||
const percentBangString = "%!"
|
|
||||||
|
|
||||||
// Errorf formats according to a format specifier and returns the string as a
|
|
||||||
// value that satisfies error.
|
|
||||||
//
|
|
||||||
// The returned error includes the file and line number of the caller when
|
|
||||||
// formatted with additional detail enabled. If the last argument is an error
|
|
||||||
// the returned error's Format method will return it if the format string ends
|
|
||||||
// with ": %s", ": %v", or ": %w". If the last argument is an error and the
|
|
||||||
// format string ends with ": %w", the returned error implements an Unwrap
|
|
||||||
// method returning it.
|
|
||||||
//
|
|
||||||
// If the format specifier includes a %w verb with an error operand in a
|
|
||||||
// position other than at the end, the returned error will still implement an
|
|
||||||
// Unwrap method returning the operand, but the error's Format method will not
|
|
||||||
// return the wrapped error.
|
|
||||||
//
|
|
||||||
// It is invalid to include more than one %w verb or to supply it with an
|
|
||||||
// operand that does not implement the error interface. The %w verb is otherwise
|
|
||||||
// a synonym for %v.
|
|
||||||
func Errorf(format string, a ...interface{}) error {
|
|
||||||
format = formatPlusW(format)
|
|
||||||
// Support a ": %[wsv]" suffix, which works well with xerrors.Formatter.
|
|
||||||
wrap := strings.HasSuffix(format, ": %w")
|
|
||||||
idx, format2, ok := parsePercentW(format)
|
|
||||||
percentWElsewhere := !wrap && idx >= 0
|
|
||||||
if !percentWElsewhere && (wrap || strings.HasSuffix(format, ": %s") || strings.HasSuffix(format, ": %v")) {
|
|
||||||
err := errorAt(a, len(a)-1)
|
|
||||||
if err == nil {
|
|
||||||
return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)}
|
|
||||||
}
|
|
||||||
// TODO: this is not entirely correct. The error value could be
|
|
||||||
// printed elsewhere in format if it mixes numbered with unnumbered
|
|
||||||
// substitutions. With relatively small changes to doPrintf we can
|
|
||||||
// have it optionally ignore extra arguments and pass the argument
|
|
||||||
// list in its entirety.
|
|
||||||
msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...)
|
|
||||||
frame := Frame{}
|
|
||||||
if internal.EnableTrace {
|
|
||||||
frame = Caller(1)
|
|
||||||
}
|
|
||||||
if wrap {
|
|
||||||
return &wrapError{msg, err, frame}
|
|
||||||
}
|
|
||||||
return &noWrapError{msg, err, frame}
|
|
||||||
}
|
|
||||||
// Support %w anywhere.
|
|
||||||
// TODO: don't repeat the wrapped error's message when %w occurs in the middle.
|
|
||||||
msg := fmt.Sprintf(format2, a...)
|
|
||||||
if idx < 0 {
|
|
||||||
return &noWrapError{msg, nil, Caller(1)}
|
|
||||||
}
|
|
||||||
err := errorAt(a, idx)
|
|
||||||
if !ok || err == nil {
|
|
||||||
// Too many %ws or argument of %w is not an error. Approximate the Go
|
|
||||||
// 1.13 fmt.Errorf message.
|
|
||||||
return &noWrapError{fmt.Sprintf("%sw(%s)", percentBangString, msg), nil, Caller(1)}
|
|
||||||
}
|
|
||||||
frame := Frame{}
|
|
||||||
if internal.EnableTrace {
|
|
||||||
frame = Caller(1)
|
|
||||||
}
|
|
||||||
return &wrapError{msg, err, frame}
|
|
||||||
}
|
|
||||||
|
|
||||||
func errorAt(args []interface{}, i int) error {
|
|
||||||
if i < 0 || i >= len(args) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
err, ok := args[i].(error)
|
|
||||||
if !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// formatPlusW is used to avoid the vet check that will barf at %w.
|
|
||||||
func formatPlusW(s string) string {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the index of the only %w in format, or -1 if none.
|
|
||||||
// Also return a rewritten format string with %w replaced by %v, and
|
|
||||||
// false if there is more than one %w.
|
|
||||||
// TODO: handle "%[N]w".
|
|
||||||
func parsePercentW(format string) (idx int, newFormat string, ok bool) {
|
|
||||||
// Loosely copied from golang.org/x/tools/go/analysis/passes/printf/printf.go.
|
|
||||||
idx = -1
|
|
||||||
ok = true
|
|
||||||
n := 0
|
|
||||||
sz := 0
|
|
||||||
var isW bool
|
|
||||||
for i := 0; i < len(format); i += sz {
|
|
||||||
if format[i] != '%' {
|
|
||||||
sz = 1
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// "%%" is not a format directive.
|
|
||||||
if i+1 < len(format) && format[i+1] == '%' {
|
|
||||||
sz = 2
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
sz, isW = parsePrintfVerb(format[i:])
|
|
||||||
if isW {
|
|
||||||
if idx >= 0 {
|
|
||||||
ok = false
|
|
||||||
} else {
|
|
||||||
idx = n
|
|
||||||
}
|
|
||||||
// "Replace" the last character, the 'w', with a 'v'.
|
|
||||||
p := i + sz - 1
|
|
||||||
format = format[:p] + "v" + format[p+1:]
|
|
||||||
}
|
|
||||||
n++
|
|
||||||
}
|
|
||||||
return idx, format, ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the printf verb starting with a % at s[0].
|
|
||||||
// Return how many bytes it occupies and whether the verb is 'w'.
|
|
||||||
func parsePrintfVerb(s string) (int, bool) {
|
|
||||||
// Assume only that the directive is a sequence of non-letters followed by a single letter.
|
|
||||||
sz := 0
|
|
||||||
var r rune
|
|
||||||
for i := 1; i < len(s); i += sz {
|
|
||||||
r, sz = utf8.DecodeRuneInString(s[i:])
|
|
||||||
if unicode.IsLetter(r) {
|
|
||||||
return i + sz, r == 'w'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return len(s), false
|
|
||||||
}
|
|
||||||
|
|
||||||
type noWrapError struct {
|
|
||||||
msg string
|
|
||||||
err error
|
|
||||||
frame Frame
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *noWrapError) Error() string {
|
|
||||||
return fmt.Sprint(e)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) }
|
|
||||||
|
|
||||||
func (e *noWrapError) FormatError(p Printer) (next error) {
|
|
||||||
p.Print(e.msg)
|
|
||||||
e.frame.Format(p)
|
|
||||||
return e.err
|
|
||||||
}
|
|
||||||
|
|
||||||
type wrapError struct {
|
|
||||||
msg string
|
|
||||||
err error
|
|
||||||
frame Frame
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *wrapError) Error() string {
|
|
||||||
return fmt.Sprint(e)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) }
|
|
||||||
|
|
||||||
func (e *wrapError) FormatError(p Printer) (next error) {
|
|
||||||
p.Print(e.msg)
|
|
||||||
e.frame.Format(p)
|
|
||||||
return e.err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *wrapError) Unwrap() error {
|
|
||||||
return e.err
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package xerrors
|
|
||||||
|
|
||||||
// A Formatter formats error messages.
|
|
||||||
type Formatter interface {
|
|
||||||
error
|
|
||||||
|
|
||||||
// FormatError prints the receiver's first error and returns the next error in
|
|
||||||
// the error chain, if any.
|
|
||||||
FormatError(p Printer) (next error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Printer formats error messages.
|
|
||||||
//
|
|
||||||
// The most common implementation of Printer is the one provided by package fmt
|
|
||||||
// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message
|
|
||||||
// typically provide their own implementations.
|
|
||||||
type Printer interface {
|
|
||||||
// Print appends args to the message output.
|
|
||||||
Print(args ...interface{})
|
|
||||||
|
|
||||||
// Printf writes a formatted string.
|
|
||||||
Printf(format string, args ...interface{})
|
|
||||||
|
|
||||||
// Detail reports whether error detail is requested.
|
|
||||||
// After the first call to Detail, all text written to the Printer
|
|
||||||
// is formatted as additional detail, or ignored when
|
|
||||||
// detail has not been requested.
|
|
||||||
// If Detail returns false, the caller can avoid printing the detail at all.
|
|
||||||
Detail() bool
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package xerrors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"runtime"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A Frame contains part of a call stack.
|
|
||||||
type Frame struct {
|
|
||||||
// Make room for three PCs: the one we were asked for, what it called,
|
|
||||||
// and possibly a PC for skipPleaseUseCallersFrames. See:
|
|
||||||
// https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169
|
|
||||||
frames [3]uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// Caller returns a Frame that describes a frame on the caller's stack.
|
|
||||||
// The argument skip is the number of frames to skip over.
|
|
||||||
// Caller(0) returns the frame for the caller of Caller.
|
|
||||||
func Caller(skip int) Frame {
|
|
||||||
var s Frame
|
|
||||||
runtime.Callers(skip+1, s.frames[:])
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// location reports the file, line, and function of a frame.
|
|
||||||
//
|
|
||||||
// The returned function may be "" even if file and line are not.
|
|
||||||
func (f Frame) location() (function, file string, line int) {
|
|
||||||
frames := runtime.CallersFrames(f.frames[:])
|
|
||||||
if _, ok := frames.Next(); !ok {
|
|
||||||
return "", "", 0
|
|
||||||
}
|
|
||||||
fr, ok := frames.Next()
|
|
||||||
if !ok {
|
|
||||||
return "", "", 0
|
|
||||||
}
|
|
||||||
return fr.Function, fr.File, fr.Line
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format prints the stack as error detail.
|
|
||||||
// It should be called from an error's Format implementation
|
|
||||||
// after printing any other error detail.
|
|
||||||
func (f Frame) Format(p Printer) {
|
|
||||||
if p.Detail() {
|
|
||||||
function, file, line := f.location()
|
|
||||||
if function != "" {
|
|
||||||
p.Printf("%s\n ", function)
|
|
||||||
}
|
|
||||||
if file != "" {
|
|
||||||
p.Printf("%s:%d\n", file, line)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,3 +0,0 @@
|
||||||
module golang.org/x/xerrors
|
|
||||||
|
|
||||||
go 1.11
|
|
|
@ -1,8 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package internal
|
|
||||||
|
|
||||||
// EnableTrace indicates whether stack information should be recorded in errors.
|
|
||||||
var EnableTrace = true
|
|
|
@ -1,106 +0,0 @@
|
||||||
// Copyright 2018 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package xerrors
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A Wrapper provides context around another error.
|
|
||||||
type Wrapper interface {
|
|
||||||
// Unwrap returns the next error in the error chain.
|
|
||||||
// If there is no next error, Unwrap returns nil.
|
|
||||||
Unwrap() error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opaque returns an error with the same error formatting as err
|
|
||||||
// but that does not match err and cannot be unwrapped.
|
|
||||||
func Opaque(err error) error {
|
|
||||||
return noWrapper{err}
|
|
||||||
}
|
|
||||||
|
|
||||||
type noWrapper struct {
|
|
||||||
error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e noWrapper) FormatError(p Printer) (next error) {
|
|
||||||
if f, ok := e.error.(Formatter); ok {
|
|
||||||
return f.FormatError(p)
|
|
||||||
}
|
|
||||||
p.Print(e.error)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unwrap returns the result of calling the Unwrap method on err, if err implements
|
|
||||||
// Unwrap. Otherwise, Unwrap returns nil.
|
|
||||||
func Unwrap(err error) error {
|
|
||||||
u, ok := err.(Wrapper)
|
|
||||||
if !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return u.Unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is reports whether any error in err's chain matches target.
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
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.
|
|
||||||
//
|
|
||||||
// The As method should set the target to its value and return true if err
|
|
||||||
// matches the type to which target points.
|
|
||||||
func As(err error, target interface{}) 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(interface{}) bool }); ok && x.As(target) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
err = Unwrap(err)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
var errorType = reflect.TypeOf((*error)(nil)).Elem()
|
|
|
@ -19,7 +19,7 @@ github.com/vbatts/git-validation/rules/dco
|
||||||
github.com/vbatts/git-validation/rules/messageregexp
|
github.com/vbatts/git-validation/rules/messageregexp
|
||||||
github.com/vbatts/git-validation/rules/shortsubject
|
github.com/vbatts/git-validation/rules/shortsubject
|
||||||
github.com/vbatts/git-validation/validate
|
github.com/vbatts/git-validation/validate
|
||||||
# golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3
|
# golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4
|
||||||
golang.org/x/mod/internal/lazyregexp
|
golang.org/x/mod/internal/lazyregexp
|
||||||
golang.org/x/mod/module
|
golang.org/x/mod/module
|
||||||
golang.org/x/mod/semver
|
golang.org/x/mod/semver
|
||||||
|
@ -27,7 +27,7 @@ golang.org/x/mod/semver
|
||||||
golang.org/x/sys/execabs
|
golang.org/x/sys/execabs
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
# golang.org/x/tools v0.1.10
|
# golang.org/x/tools v0.1.11
|
||||||
## explicit
|
## explicit
|
||||||
golang.org/x/tools/cmd/goimports
|
golang.org/x/tools/cmd/goimports
|
||||||
golang.org/x/tools/go/ast/astutil
|
golang.org/x/tools/go/ast/astutil
|
||||||
|
@ -40,6 +40,3 @@ golang.org/x/tools/internal/gocommand
|
||||||
golang.org/x/tools/internal/gopathwalk
|
golang.org/x/tools/internal/gopathwalk
|
||||||
golang.org/x/tools/internal/imports
|
golang.org/x/tools/internal/imports
|
||||||
golang.org/x/tools/internal/typeparams
|
golang.org/x/tools/internal/typeparams
|
||||||
# golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
|
|
||||||
golang.org/x/xerrors
|
|
||||||
golang.org/x/xerrors/internal
|
|
||||||
|
|
Loading…
Reference in New Issue