Source file
test/stress/parsego.go
1
2
3
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(), ".") &&
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")
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
38
39
40 _, pkgname := path.Split(dirpath)
41
42
43 filter := func(d os.FileInfo) bool {
44 if isPkgFile(d) {
45
46
47
48
49
50
51 name := pkgName(dirpath + "/" + d.Name())
52 return name == pkgname
53 }
54 return false
55 }
56
57
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
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
View as plain text