1 // Copyright 2013 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 5 package main 6 7 import ( 8 "go/ast" 9 "go/parser" 10 "go/token" 11 "os" 12 "path" 13 "runtime" 14 "strings" 15 ) 16 17 func isGoFile(dir os.FileInfo) bool { 18 return !dir.IsDir() && 19 !strings.HasPrefix(dir.Name(), ".") && // ignore .files 20 path.Ext(dir.Name()) == ".go" 21 } 22 23 func isPkgFile(dir os.FileInfo) bool { 24 return isGoFile(dir) && 25 !strings.HasSuffix(dir.Name(), "_test.go") // ignore test files 26 } 27 28 func pkgName(filename string) string { 29 file, err := parser.ParseFile(token.NewFileSet(), filename, nil, parser.PackageClauseOnly) 30 if err != nil || file == nil { 31 return "" 32 } 33 return file.Name.Name 34 } 35 36 func parseDir(dirpath string) map[string]*ast.Package { 37 // the package name is the directory name within its parent. 38 // (use dirname instead of path because dirname is clean; it 39 // has no trailing '/') 40 _, pkgname := path.Split(dirpath) 41 42 // filter function to select the desired .go files 43 filter := func(d os.FileInfo) bool { 44 if isPkgFile(d) { 45 // Some directories contain main packages: Only accept 46 // files that belong to the expected package so that 47 // parser.ParsePackage doesn't return "multiple packages 48 // found" errors. 49 // Additionally, accept the special package name 50 // fakePkgName if we are looking at cmd documentation. 51 name := pkgName(dirpath + "/" + d.Name()) 52 return name == pkgname 53 } 54 return false 55 } 56 57 // get package AST 58 pkgs, err := parser.ParseDir(token.NewFileSet(), dirpath, filter, parser.ParseComments) 59 if err != nil { 60 println("parse", dirpath, err.Error()) 61 panic("go ParseDir fail: " + err.Error()) 62 } 63 return pkgs 64 } 65 66 func stressParseGo() { 67 pkgroot := runtime.GOROOT() + "/src/" 68 for { 69 m := make(map[string]map[string]*ast.Package) 70 for _, pkg := range packages { 71 m[pkg] = parseDir(pkgroot + pkg) 72 Println("parsed go package", pkg) 73 } 74 } 75 } 76 77 // find . -type d -not -path "./exp" -not -path "./exp/*" -printf "\t\"%p\",\n" | sort | sed "s/\.\///" | grep -v testdata 78 var packages = []string{ 79 "archive", 80 "archive/tar", 81 "archive/zip", 82 "bufio", 83 "builtin", 84 "bytes", 85 "compress", 86 "compress/bzip2", 87 "compress/flate", 88 "compress/gzip", 89 "compress/lzw", 90 "compress/zlib", 91 "container", 92 "container/heap", 93 "container/list", 94 "container/ring", 95 "crypto", 96 "crypto/aes", 97 "crypto/cipher", 98 "crypto/des", 99 "crypto/dsa", 100 "crypto/ecdsa", 101 "crypto/elliptic", 102 "crypto/hmac", 103 "crypto/md5", 104 "crypto/rand", 105 "crypto/rc4", 106 "crypto/rsa", 107 "crypto/sha1", 108 "crypto/sha256", 109 "crypto/sha512", 110 "crypto/subtle", 111 "crypto/tls", 112 "crypto/x509", 113 "crypto/x509/pkix", 114 "database", 115 "database/sql", 116 "database/sql/driver", 117 "debug", 118 "debug/dwarf", 119 "debug/elf", 120 "debug/gosym", 121 "debug/macho", 122 "debug/pe", 123 "encoding", 124 "encoding/ascii85", 125 "encoding/asn1", 126 "encoding/base32", 127 "encoding/base64", 128 "encoding/binary", 129 "encoding/csv", 130 "encoding/gob", 131 "encoding/hex", 132 "encoding/json", 133 "encoding/pem", 134 "encoding/xml", 135 "errors", 136 "expvar", 137 "flag", 138 "fmt", 139 "go", 140 "go/ast", 141 "go/build", 142 "go/doc", 143 "go/format", 144 "go/parser", 145 "go/printer", 146 "go/scanner", 147 "go/token", 148 "hash", 149 "hash/adler32", 150 "hash/crc32", 151 "hash/crc64", 152 "hash/fnv", 153 "html", 154 "html/template", 155 "image", 156 "image/color", 157 "image/draw", 158 "image/gif", 159 "image/jpeg", 160 "image/png", 161 "index", 162 "index/suffixarray", 163 "io", 164 "io/ioutil", 165 "log", 166 "log/syslog", 167 "math", 168 "math/big", 169 "math/cmplx", 170 "math/rand", 171 "mime", 172 "mime/multipart", 173 "net", 174 "net/http", 175 "net/http/cgi", 176 "net/http/cookiejar", 177 "net/http/fcgi", 178 "net/http/httptest", 179 "net/http/httputil", 180 "net/http/pprof", 181 "net/mail", 182 "net/rpc", 183 "net/rpc/jsonrpc", 184 "net/smtp", 185 "net/textproto", 186 "net/url", 187 "os", 188 "os/exec", 189 "os/signal", 190 "os/user", 191 "path", 192 "path/filepath", 193 "reflect", 194 "regexp", 195 "regexp/syntax", 196 "runtime", 197 "runtime/cgo", 198 "runtime/debug", 199 "runtime/pprof", 200 "runtime/race", 201 "sort", 202 "strconv", 203 "strings", 204 "sync", 205 "sync/atomic", 206 "syscall", 207 "testing", 208 "testing/iotest", 209 "testing/quick", 210 "text", 211 "text/scanner", 212 "text/tabwriter", 213 "text/template", 214 "text/template/parse", 215 "time", 216 "unicode", 217 "unicode/utf16", 218 "unicode/utf8", 219 "unsafe", 220 } 221