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