| // Copyright 2013 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 main |
| |
| import ( |
| "go/ast" |
| "go/parser" |
| "go/token" |
| "os" |
| "path" |
| "runtime" |
| "strings" |
| ) |
| |
| func isGoFile(dir os.FileInfo) bool { |
| return !dir.IsDir() && |
| !strings.HasPrefix(dir.Name(), ".") && // ignore .files |
| path.Ext(dir.Name()) == ".go" |
| } |
| |
| func isPkgFile(dir os.FileInfo) bool { |
| return isGoFile(dir) && |
| !strings.HasSuffix(dir.Name(), "_test.go") // ignore test files |
| } |
| |
| func pkgName(filename string) string { |
| file, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.PackageClauseOnly) |
| if err != nil || file == nil { |
| return "" |
| } |
| return file.Name.Name |
| } |
| |
| func parseDir(dirpath string) map[string]*ast.Package { |
| // the package name is the directory name within its parent. |
| // (use dirname instead of path because dirname is clean; it |
| // has no trailing '/') |
| _, pkgname := path.Split(dirpath) |
| |
| // filter function to select the desired .go files |
| filter := func(d os.FileInfo) bool { |
| if isPkgFile(d) { |
| // Some directories contain main packages: Only accept |
| // files that belong to the expected package so that |
| // parser.ParsePackage doesn't return "multiple packages |
| // found" errors. |
| // Additionally, accept the special package name |
| // fakePkgName if we are looking at cmd documentation. |
| name := pkgName(dirpath + "/" + d.Name()) |
| return name == pkgname |
| } |
| return false |
| } |
| |
| // get package AST |
| pkgs, err := parser.ParseDir(token.NewFileSet(), dirpath, filter, parser.ParseComments) |
| if err != nil { |
| println("parse", dirpath, err.Error()) |
| panic("go ParseDir fail: " + err.Error()) |
| } |
| return pkgs |
| } |
| |
| func stressParseGo() { |
| pkgroot := runtime.GOROOT() + "/src/" |
| for { |
| m := make(map[string]map[string]*ast.Package) |
| for _, pkg := range packages { |
| m[pkg] = parseDir(pkgroot + pkg) |
| Println("parsed go package", pkg) |
| } |
| } |
| } |
| |
| // find . -type d -not -path "./exp" -not -path "./exp/*" -printf "\t\"%p\",\n" | sort | sed "s/\.\///" | grep -v testdata |
| var packages = []string{ |
| "archive", |
| "archive/tar", |
| "archive/zip", |
| "bufio", |
| "builtin", |
| "bytes", |
| "compress", |
| "compress/bzip2", |
| "compress/flate", |
| "compress/gzip", |
| "compress/lzw", |
| "compress/zlib", |
| "container", |
| "container/heap", |
| "container/list", |
| "container/ring", |
| "crypto", |
| "crypto/aes", |
| "crypto/cipher", |
| "crypto/des", |
| "crypto/dsa", |
| "crypto/ecdsa", |
| "crypto/elliptic", |
| "crypto/hmac", |
| "crypto/md5", |
| "crypto/rand", |
| "crypto/rc4", |
| "crypto/rsa", |
| "crypto/sha1", |
| "crypto/sha256", |
| "crypto/sha512", |
| "crypto/subtle", |
| "crypto/tls", |
| "crypto/x509", |
| "crypto/x509/pkix", |
| "database", |
| "database/sql", |
| "database/sql/driver", |
| "debug", |
| "debug/dwarf", |
| "debug/elf", |
| "debug/gosym", |
| "debug/macho", |
| "debug/pe", |
| "encoding", |
| "encoding/ascii85", |
| "encoding/asn1", |
| "encoding/base32", |
| "encoding/base64", |
| "encoding/binary", |
| "encoding/csv", |
| "encoding/gob", |
| "encoding/hex", |
| "encoding/json", |
| "encoding/pem", |
| "encoding/xml", |
| "errors", |
| "expvar", |
| "flag", |
| "fmt", |
| "go", |
| "go/ast", |
| "go/build", |
| "go/doc", |
| "go/format", |
| "go/parser", |
| "go/printer", |
| "go/scanner", |
| "go/token", |
| "hash", |
| "hash/adler32", |
| "hash/crc32", |
| "hash/crc64", |
| "hash/fnv", |
| "html", |
| "html/template", |
| "image", |
| "image/color", |
| "image/draw", |
| "image/gif", |
| "image/jpeg", |
| "image/png", |
| "index", |
| "index/suffixarray", |
| "io", |
| "io/ioutil", |
| "log", |
| "log/syslog", |
| "math", |
| "math/big", |
| "math/cmplx", |
| "math/rand", |
| "mime", |
| "mime/multipart", |
| "net", |
| "net/http", |
| "net/http/cgi", |
| "net/http/cookiejar", |
| "net/http/fcgi", |
| "net/http/httptest", |
| "net/http/httputil", |
| "net/http/pprof", |
| "net/mail", |
| "net/rpc", |
| "net/rpc/jsonrpc", |
| "net/smtp", |
| "net/textproto", |
| "net/url", |
| "os", |
| "os/exec", |
| "os/signal", |
| "os/user", |
| "path", |
| "path/filepath", |
| "reflect", |
| "regexp", |
| "regexp/syntax", |
| "runtime", |
| "runtime/cgo", |
| "runtime/debug", |
| "runtime/pprof", |
| "runtime/race", |
| "sort", |
| "strconv", |
| "strings", |
| "sync", |
| "sync/atomic", |
| "syscall", |
| "testing", |
| "testing/iotest", |
| "testing/quick", |
| "text", |
| "text/scanner", |
| "text/tabwriter", |
| "text/template", |
| "text/template/parse", |
| "time", |
| "unicode", |
| "unicode/utf16", |
| "unicode/utf8", |
| "unsafe", |
| } |