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
5package main
6
7import (
8	"go/ast"
9	"go/parser"
10	"go/token"
11	"os"
12	"path"
13	"runtime"
14	"strings"
15)
16
17func isGoFile(dir os.FileInfo) bool {
18	return !dir.IsDir() &&
19		!strings.HasPrefix(dir.Name(), ".") && // ignore .files
20		path.Ext(dir.Name()) == ".go"
21}
22
23func isPkgFile(dir os.FileInfo) bool {
24	return isGoFile(dir) &&
25		!strings.HasSuffix(dir.Name(), "_test.go") // ignore test files
26}
27
28func 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
36func 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
66func 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
78var 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