Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / go / packages / visit.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/packages/visit.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/packages/visit.go
new file mode 100644 (file)
index 0000000..b13cb08
--- /dev/null
@@ -0,0 +1,55 @@
+package packages
+
+import (
+       "fmt"
+       "os"
+       "sort"
+)
+
+// Visit visits all the packages in the import graph whose roots are
+// pkgs, calling the optional pre function the first time each package
+// is encountered (preorder), and the optional post function after a
+// package's dependencies have been visited (postorder).
+// The boolean result of pre(pkg) determines whether
+// the imports of package pkg are visited.
+func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) {
+       seen := make(map[*Package]bool)
+       var visit func(*Package)
+       visit = func(pkg *Package) {
+               if !seen[pkg] {
+                       seen[pkg] = true
+
+                       if pre == nil || pre(pkg) {
+                               paths := make([]string, 0, len(pkg.Imports))
+                               for path := range pkg.Imports {
+                                       paths = append(paths, path)
+                               }
+                               sort.Strings(paths) // Imports is a map, this makes visit stable
+                               for _, path := range paths {
+                                       visit(pkg.Imports[path])
+                               }
+                       }
+
+                       if post != nil {
+                               post(pkg)
+                       }
+               }
+       }
+       for _, pkg := range pkgs {
+               visit(pkg)
+       }
+}
+
+// PrintErrors prints to os.Stderr the accumulated errors of all
+// packages in the import graph rooted at pkgs, dependencies first.
+// PrintErrors returns the number of errors printed.
+func PrintErrors(pkgs []*Package) int {
+       var n int
+       Visit(pkgs, nil, func(pkg *Package) {
+               for _, err := range pkg.Errors {
+                       fmt.Fprintln(os.Stderr, err)
+                       n++
+               }
+       })
+       return n
+}