blob: 2c321ed6081c41f5d180a630ba41f3ec1351dc93 [file] [log] [blame]
// +build ignore,OMIT
package main
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"io/ioutil"
"path/filepath"
"runtime"
"strings"
)
func walk(dir string, f func(string) bool) bool {
fis, err := ioutil.ReadDir(dir)
if err != nil {
panic(err)
}
// parse all *.go files in directory;
// traverse subdirectories, but don't walk into testdata
for _, fi := range fis {
path := filepath.Join(dir, fi.Name())
if fi.IsDir() {
if fi.Name() != "testdata" {
if !walk(path, f) {
return false
}
}
} else if strings.HasSuffix(fi.Name(), ".go") && !strings.HasPrefix(fi.Name(), ".") {
if !f(path) {
return false
}
}
}
return true
}
func walkStdLib(f func(filename string) bool) {
walk(filepath.Join(runtime.GOROOT(), "src"), f)
}
// histogram START OMIT
type histogram map[string]int
// histogram END OMIT
// add START OMIT
func (h histogram) add(filename string) {
f, err := parser.ParseFile(token.NewFileSet(), filename, nil, 0)
if err != nil {
panic(err)
}
ast.Inspect(f, func(n ast.Node) bool {
if n, ok := n.(ast.Stmt); ok { // type test: is n an ast.Stmt?
h[fmt.Sprintf("%T", n)]++
}
return true
})
}
// add END OMIT
// print START OMIT
func (h histogram) print() {
// determine total number of statements
total := 0
for _, count := range h {
total += count
}
// print map entries
i := 0
percent := 100 / float64(total)
for key, count := range h {
fmt.Printf("%4d. %5.2f%% %5d %s\n", i, float64(count)*percent, count, key)
i++
}
}
// print END OMIT
// main START OMIT
func main() {
// body START OMIT
h := make(histogram)
walkStdLib(func(filename string) bool {
h.add(filename) // does all the hard work
return true
})
// body END OMIT
h.print()
}
// main END OMIT