From: Rob Pike Date: Tue, 14 May 2013 22:49:58 +0000 (-0700) Subject: cmd/vet: fix for changes to go/types package X-Git-Tag: go1.2rc2~1520 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d73452b30f777152895002792cfd5751df642ea4;p=gostls13.git cmd/vet: fix for changes to go/types package Need to use (or stub) exact.Value. R=gri CC=golang-dev https://golang.org/cl/9126043 --- diff --git a/src/cmd/vet/main.go b/src/cmd/vet/main.go index 2fefa0b47a..b3d12d09f9 100644 --- a/src/cmd/vet/main.go +++ b/src/cmd/vet/main.go @@ -179,7 +179,7 @@ func doPackageDir(directory string) { type Package struct { types map[ast.Expr]Type - values map[ast.Expr]interface{} + values map[ast.Expr]ExactValue files []*File } diff --git a/src/cmd/vet/types.go b/src/cmd/vet/types.go index 75f195b0fb..46e4d94807 100644 --- a/src/cmd/vet/types.go +++ b/src/cmd/vet/types.go @@ -14,19 +14,27 @@ import ( "go/ast" "go/token" + "code.google.com/p/go.exp/go/exact" "code.google.com/p/go.exp/go/types" ) -// Type is equivalent to go/types.Type. Repeating it here allows us to avoid -// depending on the go/types package. +// Type is equivalent to types.Type. Repeating it here allows us to avoid +// having main depend on the go/types package. type Type interface { String() string } +// ExactValue is equivalent to exact.Value. Repeating it here allows us to +// avoid having main depend on the go/exact package. +type ExactValue interface { + Kind() exact.Kind + String() string +} + func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) error { pkg.types = make(map[ast.Expr]Type) - pkg.values = make(map[ast.Expr]interface{}) - exprFn := func(x ast.Expr, typ types.Type, val interface{}) { + pkg.values = make(map[ast.Expr]ExactValue) + exprFn := func(x ast.Expr, typ types.Type, val exact.Value) { pkg.types[x] = typ if val != nil { pkg.values[x] = val @@ -93,10 +101,8 @@ func (f *File) matchArgType(t printfArgType, arg ast.Expr) bool { return t&argFloat != 0 case types.UntypedFloat: // If it's integral, we can use an int format. - switch f.pkg.values[arg].(type) { - case int, int8, int16, int32, int64: - return t&(argInt|argFloat) != 0 - case uint, uint8, uint16, uint32, uint64: + switch f.pkg.values[arg].Kind() { + case exact.Int: return t&(argInt|argFloat) != 0 } return t&argFloat != 0 diff --git a/src/cmd/vet/typestub.go b/src/cmd/vet/typestub.go index fabbbe19dd..74a3b13e26 100644 --- a/src/cmd/vet/typestub.go +++ b/src/cmd/vet/typestub.go @@ -15,11 +15,16 @@ import ( ) // Type is equivalent to go/types.Type. Repeating it here allows us to avoid -// depending on the go/types package. +// having main depend on the go/types package. type Type interface { String() string } +// ExactValue is a stub for exact.Value. Stubbing it here allows us to +// avoid having main depend on the go/exact package. +type ExactValue interface { +} + func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) error { return nil }