...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package main
17
18 import (
19 "flag"
20 "fmt"
21 "go/ast"
22 "log"
23 "reflect"
24 "sort"
25
26 "golang.org/x/tools/go/packages"
27 )
28
29 func main() {
30 flag.Parse()
31
32
33 config := packages.Config{
34 Mode: packages.NeedSyntax | packages.NeedFiles,
35 Tests: true,
36 }
37 pkgs, err := packages.Load(&config, flag.Args()...)
38 if err != nil {
39 log.Fatal(err)
40 }
41
42
43 var (
44 byType = make(map[reflect.Type]int)
45 total int
46 )
47 packages.Visit(pkgs, nil, func(p *packages.Package) {
48 for _, f := range p.Syntax {
49 ast.Inspect(f, func(n ast.Node) bool {
50 if n != nil {
51 byType[reflect.TypeOf(n)]++
52 total++
53 }
54 return true
55 })
56 }
57 })
58
59
60 var types []reflect.Type
61 for t := range byType {
62 types = append(types, t)
63 }
64 sort.Slice(types, func(i, j int) bool {
65 return byType[types[i]] > byType[types[j]]
66 })
67 for _, t := range types {
68 percent := 100 * float64(byType[t]) / float64(total)
69 fmt.Printf("%6.2f%%\t%8d\t%s\n", percent, byType[t], t)
70 }
71 }
72
View as plain text