//Usage: %name %flags regexp [package|directory] func main() { log.SetFlags(0) fatal := log.Fatalln flag.Usage = Usage flag.Parse() args := flag.Args() if len(args) == 0 || len(args) > 2 { Usage() os.Exit(2) } re, err := regexp.Compile(args[0]) if err != nil { fatal(err) } if *l { re.Longest() } var m goutil.StringMatcher = re if *v { m = negmatcher{re} } tree := false imp := "." if len(args) > 1 { imp = args[1] if d, f := filepath.Split(imp); f == "..." { tree = true imp = d } } var pkgs goutil.Packages switch { case tree && *r: pkgs, err := goutil.ImportTree(nil, imp) if err != nil { log.Println(err) } var ps goutil.Packages for _, p := range pkgs { t, err := p.ImportDeps() if err != nil { fatal(err) } ps = append(ps, t...) } pkgs = append(pkgs, ps...).Uniq() case tree: pkgs, err = goutil.ImportTree(nil, imp) if err != nil { log.Println(err) } case *r: pkgs, err = goutil.ImportRec(nil, imp) if err != nil { fatal(err) } default: p, err := goutil.Import(nil, imp) if err != nil { fatal(err) } pkgs = goutil.Packages{p} } if *nostdlib { pkgs = pkgs.NoStdlib() } err = pkgs.Parse(false) if err != nil { fatal(err) } multiples := len(pkgs) > 1 for _, pkg := range pkgs { for _, d := range pkg.Decls().SplitSpecs().Named(m) { print(multiples, pkg, d) } } }