|  | // 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", | 
|  | } |