From 4408c1bf42e6b7cb46783eac464add017cfd12a6 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 25 May 2014 00:40:22 -0400 Subject: [PATCH] More work on the constant generation tool. We can almost actually write the generator portion now... --- experiments/windowsconstgen.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/experiments/windowsconstgen.go b/experiments/windowsconstgen.go index ed9561e..e09bee7 100644 --- a/experiments/windowsconstgen.go +++ b/experiments/windowsconstgen.go @@ -2,7 +2,7 @@ package main import ( - "fmt" +// "fmt" "os" "strings" "go/token" @@ -33,20 +33,35 @@ func main() { } do(pkg) + if len(unknown) > 0 { + s := "error: the following are still unknown!" + for k, _ := range unknown { + s += "\n" + k + } + panic(s) + } } type walker struct { desired func(string) bool } +var known = map[string]string{} +var unknown = map[string]struct{}{} + func (w *walker) Visit(node ast.Node) ast.Visitor { if n, ok := node.(*ast.Ident); ok { if w.desired(n.Name) { - known := "" if n.Obj != nil { - known = n.Obj.Kind.String() + delete(unknown, n.Name) + kind := n.Obj.Kind.String() + if known[n.Name] != "" && known[n.Name] != kind { + panic(n.Name + "(" + kind + ") already known to be a " + known[n.Name]) + } + known[n.Name] = kind + } else if _, ok := known[n.Name]; !ok { // only if not known + unknown[n.Name] = struct{}{} } - fmt.Println(n.Name + "\t\t" + known) } } return w