1// Copyright 2014 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package typeutil
6
7import "go/types"
8
9// Dependencies returns all dependencies of the specified packages.
10//
11// Dependent packages appear in topological order: if package P imports
12// package Q, Q appears earlier than P in the result.
13// The algorithm follows import statements in the order they
14// appear in the source code, so the result is a total order.
15//
16func Dependencies(pkgs ...*types.Package) []*types.Package {
17	var result []*types.Package
18	seen := make(map[*types.Package]bool)
19	var visit func(pkgs []*types.Package)
20	visit = func(pkgs []*types.Package) {
21		for _, p := range pkgs {
22			if !seen[p] {
23				seen[p] = true
24				visit(p.Imports())
25				result = append(result, p)
26			}
27		}
28	}
29	visit(pkgs)
30	return result
31}
32