Home | History | Annotate | Download | only in stress
      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