Beispiel #1
0
func ParseDir(dir string) ([]string, error) {
	var imports []string

	dirFile, err := os.Open(dir)
	if err != nil {
		return nil, err
	}
	defer dirFile.Close()
	info, err := dirFile.Stat()
	if err != nil {
		return nil, err
	}

	var pkgs map[string]*ast.Package

	if !info.IsDir() {
		var p *ast.File
		p, err = parser.ParseFile(token.NewFileSet(), dir, nil, 0)
		var pp ast.Package
		pkgs = make(map[string]*ast.Package)
		pp.Files = make(map[string]*ast.File)
		pp.Files[dir] = p
		pkgs[dir] = &pp
	} else {
		pkgs, err = parser.ParseDir(token.NewFileSet(), dir, FilterGo, 0)
		if err != nil {
			return nil, err
		}
	}

	for _, pkg := range pkgs {
		// var f *ast.File
		for _, f := range pkg.Files {
			for _, i := range f.Imports {
				d := strings.Trim(i.Path.Value, "\"")
				// from go/src/cmd/go/pkg.go
				//
				// p.Standard = p.Goroot && p.ImportPath != "" && !strings.Contains(p.ImportPath, ".")
				//
				// all Standard packages do not have "dot"
				if strings.Contains(d, ".") && !strings.HasPrefix(d, ".") {
					imports = append(imports, d)
				}
			}
		}
	}

	{
		dirs, err := dirFile.Readdir(-1)
		if err != nil {
			return nil, err
		}
		for _, info := range dirs {
			if info.IsDir() {
				t, e := ParseDir(path.Join(dir, info.Name()))
				if e != nil {
					return nil, e
				}
				imports = append(imports, t...)
			}
		}
	}

	return imports, nil
}