Brad Fitzpatrick | b3809ca | 2013-04-15 11:50:14 -0700 | [diff] [blame] | 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() { |
Russ Cox | 220a6de | 2014-09-08 00:06:45 -0400 | [diff] [blame] | 67 | pkgroot := runtime.GOROOT() + "/src/" |
Brad Fitzpatrick | b3809ca | 2013-04-15 11:50:14 -0700 | [diff] [blame] | 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 | } |