32 lines
886 B
Go
32 lines
886 B
Go
|
// Copyright 2014 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 typeutil
|
||
|
|
||
|
import "go/types"
|
||
|
|
||
|
// Dependencies returns all dependencies of the specified packages.
|
||
|
//
|
||
|
// Dependent packages appear in topological order: if package P imports
|
||
|
// package Q, Q appears earlier than P in the result.
|
||
|
// The algorithm follows import statements in the order they
|
||
|
// appear in the source code, so the result is a total order.
|
||
|
//
|
||
|
func Dependencies(pkgs ...*types.Package) []*types.Package {
|
||
|
var result []*types.Package
|
||
|
seen := make(map[*types.Package]bool)
|
||
|
var visit func(pkgs []*types.Package)
|
||
|
visit = func(pkgs []*types.Package) {
|
||
|
for _, p := range pkgs {
|
||
|
if !seen[p] {
|
||
|
seen[p] = true
|
||
|
visit(p.Imports())
|
||
|
result = append(result, p)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
visit(pkgs)
|
||
|
return result
|
||
|
}
|