andlabs-ui/experiments/windowsconstgen.go

69 lines
1.1 KiB
Go

// 24 may 2014
package main
import (
"fmt"
"os"
"strings"
"go/token"
"go/ast"
"go/parser"
)
func main() {
var pkg *ast.Package
importpath := os.Args[1]
fileset := token.NewFileSet()
filter := func(i os.FileInfo) bool {
return strings.HasSuffix(i.Name(), "_windows.go")
}
pkgs, err := parser.ParseDir(fileset, importpath,
filter, parser.AllErrors)
if err != nil {
panic(err)
}
if len(pkgs) != 1 {
panic("more than one package found")
}
for k, _ := range pkgs { // get the sole key
pkg = pkgs[k]
}
do(pkg)
}
type walker struct {
desired func(string) bool
}
func (w *walker) Visit(node ast.Node) ast.Visitor {
if n, ok := node.(*ast.Ident); ok {
if w.desired(n.Name) {
known := "<unknown>"
if n.Obj != nil {
known = n.Obj.Kind.String()
}
fmt.Println(n.Name + "\t\t" + known)
}
}
return w
}
func do(pkg *ast.Package) {
desired := func(name string) bool {
if strings.HasPrefix(name, "_") && len(name) > 1 {
return !strings.ContainsAny(name,
"abcdefghijklmnopqrstuvwxyz")
}
return false
}
for _, f := range pkg.Files {
for _, d := range f.Decls {
ast.Walk(&walker{desired}, d)
}
}
}