aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/fix
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-02-21 12:19:54 -0500
committerRuss Cox <rsc@golang.org>2013-02-21 12:19:54 -0500
commitdf93283d5694814efc97efd2132da11722d11523 (patch)
tree53ffc57362ce1141a12ada5562bb86d2030ce469 /src/cmd/fix
parent92cbf82f1443223e21856f408b50821082babecc (diff)
downloadgo-df93283d5694814efc97efd2132da11722d11523.tar.gz
go-df93283d5694814efc97efd2132da11722d11523.zip
cmd/fix: delete pre-Go 1 fixes
Assume people who were going to update to Go 1 have done so. Those with pre-Go 1 trees remaining will need to update first to Go 1.0 (using its 'go fix') and then to Go 1.1. Cuts the cmd/fix test time by 99% (3 seconds to 0.03 seconds). R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/7402046
Diffstat (limited to 'src/cmd/fix')
-rw-r--r--src/cmd/fix/error.go353
-rw-r--r--src/cmd/fix/error_test.go240
-rw-r--r--src/cmd/fix/filepath.go56
-rw-r--r--src/cmd/fix/filepath_test.go33
-rw-r--r--src/cmd/fix/go1pkgrename.go146
-rw-r--r--src/cmd/fix/go1pkgrename_test.go139
-rw-r--r--src/cmd/fix/go1rename.go167
-rw-r--r--src/cmd/fix/go1rename_test.go195
-rw-r--r--src/cmd/fix/googlecode.go41
-rw-r--r--src/cmd/fix/googlecode_test.go31
-rw-r--r--src/cmd/fix/hashsum.go94
-rw-r--r--src/cmd/fix/hashsum_test.go99
-rw-r--r--src/cmd/fix/hmacnew.go61
-rw-r--r--src/cmd/fix/hmacnew_test.go107
-rw-r--r--src/cmd/fix/htmlerr.go47
-rw-r--r--src/cmd/fix/htmlerr_test.go39
-rw-r--r--src/cmd/fix/httpfinalurl.go57
-rw-r--r--src/cmd/fix/httpfinalurl_test.go37
-rw-r--r--src/cmd/fix/httpfs.go70
-rw-r--r--src/cmd/fix/httpfs_test.go47
-rw-r--r--src/cmd/fix/httpheaders.go67
-rw-r--r--src/cmd/fix/httpheaders_test.go73
-rw-r--r--src/cmd/fix/httpserver.go141
-rw-r--r--src/cmd/fix/httpserver_test.go53
-rw-r--r--src/cmd/fix/imagecolor.go85
-rw-r--r--src/cmd/fix/imagecolor_test.go126
-rw-r--r--src/cmd/fix/imagenew.go83
-rw-r--r--src/cmd/fix/imagenew_test.go51
-rw-r--r--src/cmd/fix/imageycbcr.go64
-rw-r--r--src/cmd/fix/imageycbcr_test.go54
-rw-r--r--src/cmd/fix/iocopyn.go41
-rw-r--r--src/cmd/fix/iocopyn_test.go37
-rw-r--r--src/cmd/fix/mapdelete.go89
-rw-r--r--src/cmd/fix/mapdelete_test.go43
-rw-r--r--src/cmd/fix/math.go51
-rw-r--r--src/cmd/fix/math_test.go47
-rw-r--r--src/cmd/fix/netdial.go117
-rw-r--r--src/cmd/fix/netdial_test.go57
-rw-r--r--src/cmd/fix/netudpgroup.go58
-rw-r--r--src/cmd/fix/netudpgroup_test.go53
-rw-r--r--src/cmd/fix/newwriter.go90
-rw-r--r--src/cmd/fix/newwriter_test.go83
-rw-r--r--src/cmd/fix/oserrorstring.go75
-rw-r--r--src/cmd/fix/oserrorstring_test.go57
-rw-r--r--src/cmd/fix/osopen.go124
-rw-r--r--src/cmd/fix/osopen_test.go82
-rw-r--r--src/cmd/fix/procattr.go62
-rw-r--r--src/cmd/fix/procattr_test.go74
-rw-r--r--src/cmd/fix/reflect.go862
-rw-r--r--src/cmd/fix/reflect_test.go38
-rw-r--r--src/cmd/fix/signal.go50
-rw-r--r--src/cmd/fix/signal_test.go94
-rw-r--r--src/cmd/fix/sorthelpers.go49
-rw-r--r--src/cmd/fix/sorthelpers_test.go45
-rw-r--r--src/cmd/fix/sortslice.go52
-rw-r--r--src/cmd/fix/sortslice_test.go35
-rw-r--r--src/cmd/fix/strconv.go127
-rw-r--r--src/cmd/fix/strconv_test.go93
-rw-r--r--src/cmd/fix/stringssplit.go72
-rw-r--r--src/cmd/fix/stringssplit_test.go51
-rw-r--r--src/cmd/fix/template.go111
-rw-r--r--src/cmd/fix/template_test.go55
-rw-r--r--src/cmd/fix/timefileinfo.go298
-rw-r--r--src/cmd/fix/timefileinfo_test.go187
-rw-r--r--src/cmd/fix/url.go101
-rw-r--r--src/cmd/fix/url2.go46
-rw-r--r--src/cmd/fix/url2_test.go31
-rw-r--r--src/cmd/fix/url_test.go159
-rw-r--r--src/cmd/fix/xmlapi.go111
-rw-r--r--src/cmd/fix/xmlapi_test.go85
70 files changed, 0 insertions, 6848 deletions
diff --git a/src/cmd/fix/error.go b/src/cmd/fix/error.go
deleted file mode 100644
index 55613210a7..0000000000
--- a/src/cmd/fix/error.go
+++ /dev/null
@@ -1,353 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "regexp"
- "strings"
-)
-
-func init() {
- register(errorFix)
-}
-
-var errorFix = fix{
- "error",
- "2011-11-02",
- errorFn,
- `Use error instead of os.Error.
-
-This fix rewrites code using os.Error to use error:
-
- os.Error -> error
- os.NewError -> errors.New
- os.EOF -> io.EOF
-
-Seeing the old names above (os.Error and so on) triggers the following
-heuristic rewrites. The heuristics can be forced using the -force=error flag.
-
-A top-level function, variable, or constant named error is renamed error_.
-
-Error implementations—those types used as os.Error or named
-XxxError—have their String methods renamed to Error. Any existing
-Error field or method is renamed to Err.
-
-Error values—those with type os.Error or named e, err, error, err1,
-and so on—have method calls and field references rewritten just
-as the types do (String to Error, Error to Err). Also, a type assertion
-of the form err.(*os.Waitmsg) becomes err.(*exec.ExitError).
-
-http://codereview.appspot.com/5305066
-`,
-}
-
-// At minimum, this fix applies the following rewrites:
-//
-// os.Error -> error
-// os.NewError -> errors.New
-// os.EOF -> io.EOF
-//
-// However, if can apply any of those rewrites, it assumes that the
-// file predates the error type and tries to update the code to use
-// the new definition for error - an Error method, not a String method.
-// This more heuristic procedure may not be 100% accurate, so it is
-// only run when the file needs updating anyway. The heuristic can
-// be forced to run using -force=error.
-//
-// First, we must identify the implementations of os.Error.
-// These include the type of any value returned as or assigned to an os.Error.
-// To that set we add any type whose name contains "Error" or "error".
-// The heuristic helps for implementations that are not used as os.Error
-// in the file in which they are defined.
-//
-// In any implementation of os.Error, we rename an existing struct field
-// or method named Error to Err and rename the String method to Error.
-//
-// Second, we must identify the values of type os.Error.
-// These include any value that obviously has type os.Error.
-// To that set we add any variable whose name is e or err or error
-// possibly followed by _ or a numeric or capitalized suffix.
-// The heuristic helps for variables that are initialized using calls
-// to functions in other packages. The type checker does not have
-// information about those packages available, and in general cannot
-// (because the packages may themselves not compile).
-//
-// For any value of type os.Error, we replace a call to String with a call to Error.
-// We also replace type assertion err.(*os.Waitmsg) with err.(*exec.ExitError).
-
-// Variables matching this regexp are assumed to have type os.Error.
-var errVar = regexp.MustCompile(`^(e|err|error)_?([A-Z0-9].*)?$`)
-
-// Types matching this regexp are assumed to be implementations of os.Error.
-var errType = regexp.MustCompile(`^\*?([Ee]rror|.*Error)$`)
-
-// Type-checking configuration: tell the type-checker this basic
-// information about types, functions, and variables in external packages.
-var errorTypeConfig = &TypeConfig{
- Type: map[string]*Type{
- "os.Error": {},
- },
- Func: map[string]string{
- "fmt.Errorf": "os.Error",
- "os.NewError": "os.Error",
- },
- Var: map[string]string{
- "os.EPERM": "os.Error",
- "os.ENOENT": "os.Error",
- "os.ESRCH": "os.Error",
- "os.EINTR": "os.Error",
- "os.EIO": "os.Error",
- "os.ENXIO": "os.Error",
- "os.E2BIG": "os.Error",
- "os.ENOEXEC": "os.Error",
- "os.EBADF": "os.Error",
- "os.ECHILD": "os.Error",
- "os.EDEADLK": "os.Error",
- "os.ENOMEM": "os.Error",
- "os.EACCES": "os.Error",
- "os.EFAULT": "os.Error",
- "os.EBUSY": "os.Error",
- "os.EEXIST": "os.Error",
- "os.EXDEV": "os.Error",
- "os.ENODEV": "os.Error",
- "os.ENOTDIR": "os.Error",
- "os.EISDIR": "os.Error",
- "os.EINVAL": "os.Error",
- "os.ENFILE": "os.Error",
- "os.EMFILE": "os.Error",
- "os.ENOTTY": "os.Error",
- "os.EFBIG": "os.Error",
- "os.ENOSPC": "os.Error",
- "os.ESPIPE": "os.Error",
- "os.EROFS": "os.Error",
- "os.EMLINK": "os.Error",
- "os.EPIPE": "os.Error",
- "os.EAGAIN": "os.Error",
- "os.EDOM": "os.Error",
- "os.ERANGE": "os.Error",
- "os.EADDRINUSE": "os.Error",
- "os.ECONNREFUSED": "os.Error",
- "os.ENAMETOOLONG": "os.Error",
- "os.EAFNOSUPPORT": "os.Error",
- "os.ETIMEDOUT": "os.Error",
- "os.ENOTCONN": "os.Error",
- },
-}
-
-func errorFn(f *ast.File) bool {
- if !imports(f, "os") && !force["error"] {
- return false
- }
-
- // Fix gets called once to run the heuristics described above
- // when we notice that this file definitely needs fixing
- // (it mentions os.Error or something similar).
- var fixed bool
- var didHeuristic bool
- heuristic := func() {
- if didHeuristic {
- return
- }
- didHeuristic = true
-
- // We have identified a necessary fix (like os.Error -> error)
- // but have not applied it or any others yet. Prepare the file
- // for fixing and apply heuristic fixes.
-
- // Rename error to error_ to make room for error.
- fixed = renameTop(f, "error", "error_") || fixed
-
- // Use type checker to build list of error implementations.
- typeof, assign := typecheck(errorTypeConfig, f)
-
- isError := map[string]bool{}
- for _, val := range assign["os.Error"] {
- t := typeof[val]
- if strings.HasPrefix(t, "*") {
- t = t[1:]
- }
- if t != "" && !strings.HasPrefix(t, "func(") {
- isError[t] = true
- }
- }
-
- // We use both the type check results and the "Error" name heuristic
- // to identify implementations of os.Error.
- isErrorImpl := func(typ string) bool {
- return isError[typ] || errType.MatchString(typ)
- }
-
- isErrorVar := func(x ast.Expr) bool {
- if typ := typeof[x]; typ != "" {
- return isErrorImpl(typ) || typ == "os.Error"
- }
- if sel, ok := x.(*ast.SelectorExpr); ok {
- return sel.Sel.Name == "Error" || sel.Sel.Name == "Err"
- }
- if id, ok := x.(*ast.Ident); ok {
- return errVar.MatchString(id.Name)
- }
- return false
- }
-
- walk(f, func(n interface{}) {
- // In method declaration on error implementation type,
- // rename String() to Error() and Error() to Err().
- fn, ok := n.(*ast.FuncDecl)
- if ok &&
- fn.Recv != nil &&
- len(fn.Recv.List) == 1 &&
- isErrorImpl(typeName(fn.Recv.List[0].Type)) {
- // Rename.
- switch fn.Name.Name {
- case "String":
- fn.Name.Name = "Error"
- fixed = true
- case "Error":
- fn.Name.Name = "Err"
- fixed = true
- }
- return
- }
-
- // In type definition of an error implementation type,
- // rename Error field to Err to make room for method.
- // Given type XxxError struct { ... Error T } rename field to Err.
- d, ok := n.(*ast.GenDecl)
- if ok {
- for _, s := range d.Specs {
- switch s := s.(type) {
- case *ast.TypeSpec:
- if isErrorImpl(typeName(s.Name)) {
- st, ok := s.Type.(*ast.StructType)
- if ok {
- for _, f := range st.Fields.List {
- for _, n := range f.Names {
- if n.Name == "Error" {
- n.Name = "Err"
- fixed = true
- }
- }
- }
- }
- }
- }
- }
- }
-
- // For values that are an error implementation type,
- // rename .Error to .Err and .String to .Error
- sel, selok := n.(*ast.SelectorExpr)
- if selok && isErrorImpl(typeof[sel.X]) {
- switch sel.Sel.Name {
- case "Error":
- sel.Sel.Name = "Err"
- fixed = true
- case "String":
- sel.Sel.Name = "Error"
- fixed = true
- }
- }
-
- // Assume x.Err is an error value and rename .String to .Error
- // Children have been processed so the rewrite from Error to Err
- // has already happened there.
- if selok {
- if subsel, ok := sel.X.(*ast.SelectorExpr); ok && subsel.Sel.Name == "Err" && sel.Sel.Name == "String" {
- sel.Sel.Name = "Error"
- fixed = true
- }
- }
-
- // For values that are an error variable, rename .String to .Error.
- if selok && isErrorVar(sel.X) && sel.Sel.Name == "String" {
- sel.Sel.Name = "Error"
- fixed = true
- }
-
- // Rewrite composite literal of error type to turn Error: into Err:.
- lit, ok := n.(*ast.CompositeLit)
- if ok && isErrorImpl(typeof[lit]) {
- for _, e := range lit.Elts {
- if kv, ok := e.(*ast.KeyValueExpr); ok && isName(kv.Key, "Error") {
- kv.Key.(*ast.Ident).Name = "Err"
- fixed = true
- }
- }
- }
-
- // Rename os.Waitmsg to exec.ExitError
- // when used in a type assertion on an error.
- ta, ok := n.(*ast.TypeAssertExpr)
- if ok && isErrorVar(ta.X) && isPtrPkgDot(ta.Type, "os", "Waitmsg") {
- addImport(f, "exec")
- sel := ta.Type.(*ast.StarExpr).X.(*ast.SelectorExpr)
- sel.X.(*ast.Ident).Name = "exec"
- sel.Sel.Name = "ExitError"
- fixed = true
- }
-
- })
- }
-
- fix := func() {
- if fixed {
- return
- }
- fixed = true
- heuristic()
- }
-
- if force["error"] {
- heuristic()
- }
-
- walk(f, func(n interface{}) {
- p, ok := n.(*ast.Expr)
- if !ok {
- return
- }
- sel, ok := (*p).(*ast.SelectorExpr)
- if !ok {
- return
- }
- switch {
- case isPkgDot(sel, "os", "Error"):
- fix()
- *p = &ast.Ident{NamePos: sel.Pos(), Name: "error"}
- case isPkgDot(sel, "os", "NewError"):
- fix()
- addImport(f, "errors")
- sel.X.(*ast.Ident).Name = "errors"
- sel.Sel.Name = "New"
- case isPkgDot(sel, "os", "EOF"):
- fix()
- addImport(f, "io")
- sel.X.(*ast.Ident).Name = "io"
- }
- })
-
- if fixed && !usesImport(f, "os") {
- deleteImport(f, "os")
- }
-
- return fixed
-}
-
-func typeName(typ ast.Expr) string {
- if p, ok := typ.(*ast.StarExpr); ok {
- typ = p.X
- }
- id, ok := typ.(*ast.Ident)
- if ok {
- return id.Name
- }
- sel, ok := typ.(*ast.SelectorExpr)
- if ok {
- return typeName(sel.X) + "." + sel.Sel.Name
- }
- return ""
-}
diff --git a/src/cmd/fix/error_test.go b/src/cmd/fix/error_test.go
deleted file mode 100644
index 027eed24f8..0000000000
--- a/src/cmd/fix/error_test.go
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(errorTests, errorFn)
-}
-
-var errorTests = []testCase{
- {
- Name: "error.0",
- In: `package main
-
-func error() {}
-
-var error int
-`,
- Out: `package main
-
-func error() {}
-
-var error int
-`,
- },
- {
- Name: "error.1",
- In: `package main
-
-import "os"
-
-func f() os.Error {
- return os.EOF
-}
-
-func error() {}
-
-var error int
-
-func g() {
- error := 1
- _ = error
-}
-
-func h(os.Error) {}
-
-func i(...os.Error) {}
-`,
- Out: `package main
-
-import "io"
-
-func f() error {
- return io.EOF
-}
-
-func error_() {}
-
-var error_ int
-
-func g() {
- error := 1
- _ = error
-}
-
-func h(error) {}
-
-func i(...error) {}
-`,
- },
- {
- Name: "error.2",
- In: `package main
-
-import "os"
-
-func f() os.Error {
- return os.EOF
-}
-
-func g() string {
- // these all convert because f is known
- if err := f(); err != nil {
- return err.String()
- }
- if err1 := f(); err1 != nil {
- return err1.String()
- }
- if e := f(); e != nil {
- return e.String()
- }
- if x := f(); x != nil {
- return x.String()
- }
-
- // only the error names (err, err1, e) convert; u is not known
- if err := u(); err != nil {
- return err.String()
- }
- if err1 := u(); err1 != nil {
- return err1.String()
- }
- if e := u(); e != nil {
- return e.String()
- }
- if x := u(); x != nil {
- return x.String()
- }
- return ""
-}
-
-type T int
-
-func (t T) String() string { return "t" }
-
-type PT int
-
-func (p *PT) String() string { return "pt" }
-
-type MyError int
-
-func (t MyError) String() string { return "myerror" }
-
-type PMyError int
-
-func (p *PMyError) String() string { return "pmyerror" }
-
-func error() {}
-
-var error int
-`,
- Out: `package main
-
-import "io"
-
-func f() error {
- return io.EOF
-}
-
-func g() string {
- // these all convert because f is known
- if err := f(); err != nil {
- return err.Error()
- }
- if err1 := f(); err1 != nil {
- return err1.Error()
- }
- if e := f(); e != nil {
- return e.Error()
- }
- if x := f(); x != nil {
- return x.Error()
- }
-
- // only the error names (err, err1, e) convert; u is not known
- if err := u(); err != nil {
- return err.Error()
- }
- if err1 := u(); err1 != nil {
- return err1.Error()
- }
- if e := u(); e != nil {
- return e.Error()
- }
- if x := u(); x != nil {
- return x.String()
- }
- return ""
-}
-
-type T int
-
-func (t T) String() string { return "t" }
-
-type PT int
-
-func (p *PT) String() string { return "pt" }
-
-type MyError int
-
-func (t MyError) Error() string { return "myerror" }
-
-type PMyError int
-
-func (p *PMyError) Error() string { return "pmyerror" }
-
-func error_() {}
-
-var error_ int
-`,
- },
- {
- Name: "error.3",
- In: `package main
-
-import "os"
-
-func f() os.Error {
- return os.EOF
-}
-
-type PathError struct {
- Name string
- Error os.Error
-}
-
-func (p *PathError) String() string {
- return p.Name + ": " + p.Error.String()
-}
-
-func (p *PathError) Error1() string {
- p = &PathError{Error: nil}
- return fmt.Sprint(p.Name, ": ", p.Error)
-}
-`,
- Out: `package main
-
-import "io"
-
-func f() error {
- return io.EOF
-}
-
-type PathError struct {
- Name string
- Err error
-}
-
-func (p *PathError) Error() string {
- return p.Name + ": " + p.Err.Error()
-}
-
-func (p *PathError) Error1() string {
- p = &PathError{Err: nil}
- return fmt.Sprint(p.Name, ": ", p.Err)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/filepath.go b/src/cmd/fix/filepath.go
deleted file mode 100644
index f31226018a..0000000000
--- a/src/cmd/fix/filepath.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(filepathFix)
-}
-
-var filepathFix = fix{
- "filepath",
- "2011-06-26",
- filepathFunc,
- `Adapt code from filepath.[List]SeparatorString to string(filepath.[List]Separator).
-
-http://codereview.appspot.com/4527090
-`,
-}
-
-func filepathFunc(f *ast.File) (fixed bool) {
- if !imports(f, "path/filepath") {
- return
- }
-
- walk(f, func(n interface{}) {
- e, ok := n.(*ast.Expr)
- if !ok {
- return
- }
-
- var ident string
- switch {
- case isPkgDot(*e, "filepath", "SeparatorString"):
- ident = "filepath.Separator"
- case isPkgDot(*e, "filepath", "ListSeparatorString"):
- ident = "filepath.ListSeparator"
- default:
- return
- }
-
- // string(filepath.[List]Separator)
- *e = &ast.CallExpr{
- Fun: ast.NewIdent("string"),
- Args: []ast.Expr{ast.NewIdent(ident)},
- }
-
- fixed = true
- })
-
- return
-}
diff --git a/src/cmd/fix/filepath_test.go b/src/cmd/fix/filepath_test.go
deleted file mode 100644
index 37a2f5d9f0..0000000000
--- a/src/cmd/fix/filepath_test.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(filepathTests, filepathFunc)
-}
-
-var filepathTests = []testCase{
- {
- Name: "filepath.0",
- In: `package main
-
-import (
- "path/filepath"
-)
-
-var _ = filepath.SeparatorString
-var _ = filepath.ListSeparatorString
-`,
- Out: `package main
-
-import (
- "path/filepath"
-)
-
-var _ = string(filepath.Separator)
-var _ = string(filepath.ListSeparator)
-`,
- },
-}
diff --git a/src/cmd/fix/go1pkgrename.go b/src/cmd/fix/go1pkgrename.go
deleted file mode 100644
index f701f62f0a..0000000000
--- a/src/cmd/fix/go1pkgrename.go
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "strings"
-)
-
-func init() {
- register(go1pkgrenameFix)
-}
-
-var go1pkgrenameFix = fix{
- "go1rename",
- "2011-11-08",
- go1pkgrename,
- `Rewrite imports for packages moved during transition to Go 1.
-
-http://codereview.appspot.com/5316078
-`,
-}
-
-var go1PackageRenames = []struct{ old, new string }{
- {"asn1", "encoding/asn1"},
- {"big", "math/big"},
- {"cmath", "math/cmplx"},
- {"csv", "encoding/csv"},
- {"exec", "os/exec"},
- {"exp/template/html", "html/template"},
- {"gob", "encoding/gob"},
- {"http", "net/http"},
- {"http/cgi", "net/http/cgi"},
- {"http/fcgi", "net/http/fcgi"},
- {"http/httptest", "net/http/httptest"},
- {"http/pprof", "net/http/pprof"},
- {"json", "encoding/json"},
- {"mail", "net/mail"},
- {"rpc", "net/rpc"},
- {"rpc/jsonrpc", "net/rpc/jsonrpc"},
- {"scanner", "text/scanner"},
- {"smtp", "net/smtp"},
- {"syslog", "log/syslog"},
- {"tabwriter", "text/tabwriter"},
- {"template", "text/template"},
- {"template/parse", "text/template/parse"},
- {"rand", "math/rand"},
- {"url", "net/url"},
- {"utf16", "unicode/utf16"},
- {"utf8", "unicode/utf8"},
- {"xml", "encoding/xml"},
-
- // go.crypto sub-repository
- {"crypto/bcrypt", "code.google.com/p/go.crypto/bcrypt"},
- {"crypto/blowfish", "code.google.com/p/go.crypto/blowfish"},
- {"crypto/cast5", "code.google.com/p/go.crypto/cast5"},
- {"crypto/md4", "code.google.com/p/go.crypto/md4"},
- {"crypto/ocsp", "code.google.com/p/go.crypto/ocsp"},
- {"crypto/openpgp", "code.google.com/p/go.crypto/openpgp"},
- {"crypto/openpgp/armor", "code.google.com/p/go.crypto/openpgp/armor"},
- {"crypto/openpgp/elgamal", "code.google.com/p/go.crypto/openpgp/elgamal"},
- {"crypto/openpgp/errors", "code.google.com/p/go.crypto/openpgp/errors"},
- {"crypto/openpgp/packet", "code.google.com/p/go.crypto/openpgp/packet"},
- {"crypto/openpgp/s2k", "code.google.com/p/go.crypto/openpgp/s2k"},
- {"crypto/ripemd160", "code.google.com/p/go.crypto/ripemd160"},
- {"crypto/twofish", "code.google.com/p/go.crypto/twofish"},
- {"crypto/xtea", "code.google.com/p/go.crypto/xtea"},
- {"exp/ssh", "code.google.com/p/go.crypto/ssh"},
-
- // go.image sub-repository
- {"image/bmp", "code.google.com/p/go.image/bmp"},
- {"image/tiff", "code.google.com/p/go.image/tiff"},
-
- // go.net sub-repository
- {"net/dict", "code.google.com/p/go.net/dict"},
- {"net/websocket", "code.google.com/p/go.net/websocket"},
- {"exp/spdy", "code.google.com/p/go.net/spdy"},
- {"http/spdy", "code.google.com/p/go.net/spdy"},
-
- // go.codereview sub-repository
- {"encoding/git85", "code.google.com/p/go.codereview/git85"},
- {"patch", "code.google.com/p/go.codereview/patch"},
-
- // exp
- {"ebnf", "exp/ebnf"},
- {"go/types", "exp/types"},
-
- // deleted
- {"container/vector", ""},
- {"exp/datafmt", ""},
- {"go/typechecker", ""},
- {"old/netchan", ""},
- {"old/regexp", ""},
- {"old/template", ""},
- {"try", ""},
-}
-
-var go1PackageNameRenames = []struct{ newPath, old, new string }{
- {"html/template", "html", "template"},
- {"math/cmplx", "cmath", "cmplx"},
-}
-
-func go1pkgrename(f *ast.File) bool {
- fixed := false
-
- // First update the imports.
- for _, rename := range go1PackageRenames {
- spec := importSpec(f, rename.old)
- if spec == nil {
- continue
- }
- if rename.new == "" {
- warn(spec.Pos(), "package %q has been deleted in Go 1", rename.old)
- continue
- }
- if rewriteImport(f, rename.old, rename.new) {
- fixed = true
- }
- if strings.HasPrefix(rename.new, "exp/") {
- warn(spec.Pos(), "package %q is not part of Go 1", rename.new)
- }
- }
- if !fixed {
- return false
- }
-
- // Now update the package names used by importers.
- for _, rename := range go1PackageNameRenames {
- // These are rare packages, so do the import test before walking.
- if imports(f, rename.newPath) {
- walk(f, func(n interface{}) {
- if sel, ok := n.(*ast.SelectorExpr); ok {
- if isTopName(sel.X, rename.old) {
- // We know Sel.X is an Ident.
- sel.X.(*ast.Ident).Name = rename.new
- return
- }
- }
- })
- }
- }
-
- return fixed
-}
diff --git a/src/cmd/fix/go1pkgrename_test.go b/src/cmd/fix/go1pkgrename_test.go
deleted file mode 100644
index 840e443b01..0000000000
--- a/src/cmd/fix/go1pkgrename_test.go
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(go1pkgrenameTests, go1pkgrename)
-}
-
-var go1pkgrenameTests = []testCase{
- {
- Name: "go1rename.0",
- In: `package main
-
-import (
- "asn1"
- "big"
- "cmath"
- "csv"
- "exec"
- "exp/template/html"
- "gob"
- "http"
- "http/cgi"
- "http/fcgi"
- "http/httptest"
- "http/pprof"
- "json"
- "mail"
- "rand"
- "rpc"
- "rpc/jsonrpc"
- "scanner"
- "smtp"
- "syslog"
- "tabwriter"
- "template"
- "template/parse"
- "url"
- "utf16"
- "utf8"
- "xml"
-
- "crypto/bcrypt"
-)
-`,
- Out: `package main
-
-import (
- "encoding/asn1"
- "encoding/csv"
- "encoding/gob"
- "encoding/json"
- "encoding/xml"
- "html/template"
- "log/syslog"
- "math/big"
- "math/cmplx"
- "math/rand"
- "net/http"
- "net/http/cgi"
- "net/http/fcgi"
- "net/http/httptest"
- "net/http/pprof"
- "net/mail"
- "net/rpc"
- "net/rpc/jsonrpc"
- "net/smtp"
- "net/url"
- "os/exec"
- "text/scanner"
- "text/tabwriter"
- "text/template"
- "text/template/parse"
- "unicode/utf16"
- "unicode/utf8"
-
- "code.google.com/p/go.crypto/bcrypt"
-)
-`,
- },
- {
- Name: "go1rename.1",
- In: `package main
-
-import "cmath"
-import poot "exp/template/html"
-
-import (
- "ebnf"
- "old/regexp"
-)
-
-var _ = cmath.Sin
-var _ = poot.Poot
-`,
- Out: `package main
-
-import "math/cmplx"
-import poot "html/template"
-
-import (
- "exp/ebnf"
- "old/regexp"
-)
-
-var _ = cmplx.Sin
-var _ = poot.Poot
-`,
- },
- {
- Name: "go1rename.2",
- In: `package foo
-
-import (
- "fmt"
- "http"
- "url"
-
- "google/secret/project/go"
-)
-
-func main() {}
-`,
- Out: `package foo
-
-import (
- "fmt"
- "net/http"
- "net/url"
-
- "google/secret/project/go"
-)
-
-func main() {}
-`,
- },
-}
diff --git a/src/cmd/fix/go1rename.go b/src/cmd/fix/go1rename.go
deleted file mode 100644
index 9266c749c5..0000000000
--- a/src/cmd/fix/go1rename.go
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- register(go1renameFix)
-}
-
-var go1renameFix = fix{
- "go1rename",
- "2012-02-12",
- renameFix(go1renameReplace),
- `Rewrite package-level names that have been renamed in Go 1.
-
-http://codereview.appspot.com/5625045/
-http://codereview.appspot.com/5672072/
-`,
-}
-
-var go1renameReplace = []rename{
- {
- OldImport: "crypto/aes",
- NewImport: "crypto/cipher",
- Old: "*aes.Cipher",
- New: "cipher.Block",
- },
- {
- OldImport: "crypto/des",
- NewImport: "crypto/cipher",
- Old: "*des.Cipher",
- New: "cipher.Block",
- },
- {
- OldImport: "crypto/des",
- NewImport: "crypto/cipher",
- Old: "*des.TripleDESCipher",
- New: "cipher.Block",
- },
- {
- OldImport: "encoding/json",
- NewImport: "",
- Old: "json.MarshalForHTML",
- New: "json.Marshal",
- },
- {
- OldImport: "net/url",
- NewImport: "",
- Old: "url.ParseWithReference",
- New: "url.Parse",
- },
- {
- OldImport: "net/url",
- NewImport: "",
- Old: "url.ParseRequest",
- New: "url.ParseRequestURI",
- },
- {
- OldImport: "os",
- NewImport: "syscall",
- Old: "os.Exec",
- New: "syscall.Exec",
- },
- {
- OldImport: "runtime",
- NewImport: "",
- Old: "runtime.Cgocalls",
- New: "runtime.NumCgoCall",
- },
- {
- OldImport: "runtime",
- NewImport: "",
- Old: "runtime.Goroutines",
- New: "runtime.NumGoroutine",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.ErrPersistEOF",
- New: "httputil.ErrPersistEOF",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.ErrPipeline",
- New: "httputil.ErrPipeline",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.ErrClosed",
- New: "httputil.ErrClosed",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.ServerConn",
- New: "httputil.ServerConn",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.ClientConn",
- New: "httputil.ClientConn",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.NewChunkedReader",
- New: "httputil.NewChunkedReader",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.NewChunkedWriter",
- New: "httputil.NewChunkedWriter",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.ReverseProxy",
- New: "httputil.ReverseProxy",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.NewSingleHostReverseProxy",
- New: "httputil.NewSingleHostReverseProxy",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.DumpRequest",
- New: "httputil.DumpRequest",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.DumpRequestOut",
- New: "httputil.DumpRequestOut",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.DumpResponse",
- New: "httputil.DumpResponse",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.NewClientConn",
- New: "httputil.NewClientConn",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.NewServerConn",
- New: "httputil.NewServerConn",
- },
- {
- OldImport: "net/http",
- NewImport: "net/http/httputil",
- Old: "http.NewProxyClientConn",
- New: "httputil.NewProxyClientConn",
- },
-}
diff --git a/src/cmd/fix/go1rename_test.go b/src/cmd/fix/go1rename_test.go
deleted file mode 100644
index 90219ba710..0000000000
--- a/src/cmd/fix/go1rename_test.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(go1renameTests, go1renameFix.f)
-}
-
-var go1renameTests = []testCase{
- {
- Name: "go1rename.0",
- In: `package main
-
-import (
- "crypto/aes"
- "crypto/des"
- "encoding/json"
- "net/http"
- "net/url"
- "os"
- "runtime"
-)
-
-var (
- _ *aes.Cipher
- _ *des.Cipher
- _ *des.TripleDESCipher
- _ = json.MarshalForHTML
- _ = aes.New()
- _ = url.Parse
- _ = url.ParseWithReference
- _ = url.ParseRequest
- _ = os.Exec
- _ = runtime.Cgocalls
- _ = runtime.Goroutines
- _ = http.ErrPersistEOF
- _ = http.ErrPipeline
- _ = http.ErrClosed
- _ = http.NewSingleHostReverseProxy
- _ = http.NewChunkedReader
- _ = http.NewChunkedWriter
- _ *http.ReverseProxy
- _ *http.ClientConn
- _ *http.ServerConn
-)
-`,
- Out: `package main
-
-import (
- "crypto/aes"
- "crypto/cipher"
- "encoding/json"
- "net/http/httputil"
- "net/url"
- "runtime"
- "syscall"
-)
-
-var (
- _ cipher.Block
- _ cipher.Block
- _ cipher.Block
- _ = json.Marshal
- _ = aes.New()
- _ = url.Parse
- _ = url.Parse
- _ = url.ParseRequestURI
- _ = syscall.Exec
- _ = runtime.NumCgoCall
- _ = runtime.NumGoroutine
- _ = httputil.ErrPersistEOF
- _ = httputil.ErrPipeline
- _ = httputil.ErrClosed
- _ = httputil.NewSingleHostReverseProxy
- _ = httputil.NewChunkedReader
- _ = httputil.NewChunkedWriter
- _ *httputil.ReverseProxy
- _ *httputil.ClientConn
- _ *httputil.ServerConn
-)
-`,
- },
- {
- Name: "httputil.0",
- In: `package main
-
-import "net/http"
-
-func f() {
- http.DumpRequest(nil, false)
- http.DumpRequestOut(nil, false)
- http.DumpResponse(nil, false)
- http.NewChunkedReader(nil)
- http.NewChunkedWriter(nil)
- http.NewClientConn(nil, nil)
- http.NewProxyClientConn(nil, nil)
- http.NewServerConn(nil, nil)
- http.NewSingleHostReverseProxy(nil)
-}
-`,
- Out: `package main
-
-import "net/http/httputil"
-
-func f() {
- httputil.DumpRequest(nil, false)
- httputil.DumpRequestOut(nil, false)
- httputil.DumpResponse(nil, false)
- httputil.NewChunkedReader(nil)
- httputil.NewChunkedWriter(nil)
- httputil.NewClientConn(nil, nil)
- httputil.NewProxyClientConn(nil, nil)
- httputil.NewServerConn(nil, nil)
- httputil.NewSingleHostReverseProxy(nil)
-}
-`,
- },
- {
- Name: "httputil.1",
- In: `package main
-
-import "net/http"
-
-func f() {
- http.DumpRequest(nil, false)
- http.DumpRequestOut(nil, false)
- http.DumpResponse(nil, false)
- http.NewChunkedReader(nil)
- http.NewChunkedWriter(nil)
- http.NewClientConn(nil, nil)
- http.NewProxyClientConn(nil, nil)
- http.NewServerConn(nil, nil)
- http.NewSingleHostReverseProxy(nil)
-}
-`,
- Out: `package main
-
-import "net/http/httputil"
-
-func f() {
- httputil.DumpRequest(nil, false)
- httputil.DumpRequestOut(nil, false)
- httputil.DumpResponse(nil, false)
- httputil.NewChunkedReader(nil)
- httputil.NewChunkedWriter(nil)
- httputil.NewClientConn(nil, nil)
- httputil.NewProxyClientConn(nil, nil)
- httputil.NewServerConn(nil, nil)
- httputil.NewSingleHostReverseProxy(nil)
-}
-`,
- },
- {
- Name: "httputil.2",
- In: `package main
-
-import "net/http"
-
-func f() {
- http.DumpRequest(nil, false)
- http.DumpRequestOut(nil, false)
- http.DumpResponse(nil, false)
- http.NewChunkedReader(nil)
- http.NewChunkedWriter(nil)
- http.NewClientConn(nil, nil)
- http.NewProxyClientConn(nil, nil)
- http.NewServerConn(nil, nil)
- http.NewSingleHostReverseProxy(nil)
- http.Get("")
-}
-`,
- Out: `package main
-
-import (
- "net/http"
- "net/http/httputil"
-)
-
-func f() {
- httputil.DumpRequest(nil, false)
- httputil.DumpRequestOut(nil, false)
- httputil.DumpResponse(nil, false)
- httputil.NewChunkedReader(nil)
- httputil.NewChunkedWriter(nil)
- httputil.NewClientConn(nil, nil)
- httputil.NewProxyClientConn(nil, nil)
- httputil.NewServerConn(nil, nil)
- httputil.NewSingleHostReverseProxy(nil)
- http.Get("")
-}
-`,
- },
-}
diff --git a/src/cmd/fix/googlecode.go b/src/cmd/fix/googlecode.go
deleted file mode 100644
index 143781a74f..0000000000
--- a/src/cmd/fix/googlecode.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "regexp"
-)
-
-func init() {
- register(googlecodeFix)
-}
-
-var googlecodeFix = fix{
- "googlecode",
- "2011-11-21",
- googlecode,
- `Rewrite Google Code imports from the deprecated form
-"foo.googlecode.com/vcs/path" to "code.google.com/p/foo/path".
-`,
-}
-
-var googlecodeRe = regexp.MustCompile(`^([a-z0-9\-]+)\.googlecode\.com/(svn|git|hg)(/[a-z0-9A-Z_.\-/]+)?$`)
-
-func googlecode(f *ast.File) bool {
- fixed := false
-
- for _, s := range f.Imports {
- old := importPath(s)
- if m := googlecodeRe.FindStringSubmatch(old); m != nil {
- new := "code.google.com/p/" + m[1] + m[3]
- if rewriteImport(f, old, new) {
- fixed = true
- }
- }
- }
-
- return fixed
-}
diff --git a/src/cmd/fix/googlecode_test.go b/src/cmd/fix/googlecode_test.go
deleted file mode 100644
index c62ee4f326..0000000000
--- a/src/cmd/fix/googlecode_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(googlecodeTests, googlecode)
-}
-
-var googlecodeTests = []testCase{
- {
- Name: "googlecode.0",
- In: `package main
-
-import (
- "foo.googlecode.com/hg/bar"
- "go-qux-23.googlecode.com/svn"
- "zap.googlecode.com/git/some/path"
-)
-`,
- Out: `package main
-
-import (
- "code.google.com/p/foo/bar"
- "code.google.com/p/go-qux-23"
- "code.google.com/p/zap/some/path"
-)
-`,
- },
-}
diff --git a/src/cmd/fix/hashsum.go b/src/cmd/fix/hashsum.go
deleted file mode 100644
index 0df6ad7496..0000000000
--- a/src/cmd/fix/hashsum.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(hashSumFix)
-}
-
-var hashSumFix = fix{
- "hashsum",
- "2011-11-30",
- hashSumFn,
- `Pass a nil argument to calls to hash.Sum
-
-This fix rewrites code so that it passes a nil argument to hash.Sum.
-The additional argument will allow callers to avoid an
-allocation in the future.
-
-http://codereview.appspot.com/5448065
-`,
-}
-
-// Type-checking configuration: tell the type-checker this basic
-// information about types, functions, and variables in external packages.
-var hashSumTypeConfig = &TypeConfig{
- Var: map[string]string{
- "crypto.MD4": "crypto.Hash",
- "crypto.MD5": "crypto.Hash",
- "crypto.SHA1": "crypto.Hash",
- "crypto.SHA224": "crypto.Hash",
- "crypto.SHA256": "crypto.Hash",
- "crypto.SHA384": "crypto.Hash",
- "crypto.SHA512": "crypto.Hash",
- "crypto.MD5SHA1": "crypto.Hash",
- "crypto.RIPEMD160": "crypto.Hash",
- },
-
- Func: map[string]string{
- "adler32.New": "hash.Hash",
- "crc32.New": "hash.Hash",
- "crc32.NewIEEE": "hash.Hash",
- "crc64.New": "hash.Hash",
- "fnv.New32a": "hash.Hash",
- "fnv.New32": "hash.Hash",
- "fnv.New64a": "hash.Hash",
- "fnv.New64": "hash.Hash",
- "hmac.New": "hash.Hash",
- "hmac.NewMD5": "hash.Hash",
- "hmac.NewSHA1": "hash.Hash",
- "hmac.NewSHA256": "hash.Hash",
- "md4.New": "hash.Hash",
- "md5.New": "hash.Hash",
- "ripemd160.New": "hash.Hash",
- "sha1.New224": "hash.Hash",
- "sha1.New": "hash.Hash",
- "sha256.New224": "hash.Hash",
- "sha256.New": "hash.Hash",
- "sha512.New384": "hash.Hash",
- "sha512.New": "hash.Hash",
- },
-
- Type: map[string]*Type{
- "crypto.Hash": {
- Method: map[string]string{
- "New": "func() hash.Hash",
- },
- },
- },
-}
-
-func hashSumFn(f *ast.File) bool {
- typeof, _ := typecheck(hashSumTypeConfig, f)
-
- fixed := false
-
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if ok && len(call.Args) == 0 {
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if ok && sel.Sel.Name == "Sum" && typeof[sel.X] == "hash.Hash" {
- call.Args = append(call.Args, ast.NewIdent("nil"))
- fixed = true
- }
- }
- })
-
- return fixed
-}
diff --git a/src/cmd/fix/hashsum_test.go b/src/cmd/fix/hashsum_test.go
deleted file mode 100644
index 241af2020d..0000000000
--- a/src/cmd/fix/hashsum_test.go
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(hashSumTests, hashSumFn)
-}
-
-var hashSumTests = []testCase{
- {
- Name: "hashsum.0",
- In: `package main
-
-import "crypto/sha256"
-
-func f() []byte {
- h := sha256.New()
- return h.Sum()
-}
-`,
- Out: `package main
-
-import "crypto/sha256"
-
-func f() []byte {
- h := sha256.New()
- return h.Sum(nil)
-}
-`,
- },
-
- {
- Name: "hashsum.1",
- In: `package main
-
-func f(h hash.Hash) []byte {
- return h.Sum()
-}
-`,
- Out: `package main
-
-func f(h hash.Hash) []byte {
- return h.Sum(nil)
-}
-`,
- },
-
- {
- Name: "hashsum.0",
- In: `package main
-
-import "crypto/sha256"
-
-func f() []byte {
- h := sha256.New()
- h.Write([]byte("foo"))
- digest := h.Sum()
-}
-`,
- Out: `package main
-
-import "crypto/sha256"
-
-func f() []byte {
- h := sha256.New()
- h.Write([]byte("foo"))
- digest := h.Sum(nil)
-}
-`,
- },
-
- {
- Name: "hashsum.0",
- In: `package main
-
-import _ "crypto/sha256"
-import "crypto"
-
-func f() []byte {
- hashType := crypto.SHA256
- h := hashType.New()
- digest := h.Sum()
-}
-`,
- Out: `package main
-
-import _ "crypto/sha256"
-import "crypto"
-
-func f() []byte {
- hashType := crypto.SHA256
- h := hashType.New()
- digest := h.Sum(nil)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/hmacnew.go b/src/cmd/fix/hmacnew.go
deleted file mode 100644
index c0c44ef3e6..0000000000
--- a/src/cmd/fix/hmacnew.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "go/ast"
-
-func init() {
- register(hmacNewFix)
-}
-
-var hmacNewFix = fix{
- "hmacnew",
- "2012-01-19",
- hmacnew,
- `Deprecate hmac.NewMD5, hmac.NewSHA1 and hmac.NewSHA256.
-
-This fix rewrites code using hmac.NewMD5, hmac.NewSHA1 and hmac.NewSHA256 to
-use hmac.New:
-
- hmac.NewMD5(key) -> hmac.New(md5.New, key)
- hmac.NewSHA1(key) -> hmac.New(sha1.New, key)
- hmac.NewSHA256(key) -> hmac.New(sha256.New, key)
-
-`,
-}
-
-func hmacnew(f *ast.File) (fixed bool) {
- if !imports(f, "crypto/hmac") {
- return
- }
-
- walk(f, func(n interface{}) {
- ce, ok := n.(*ast.CallExpr)
- if !ok {
- return
- }
-
- var pkg string
- switch {
- case isPkgDot(ce.Fun, "hmac", "NewMD5"):
- pkg = "md5"
- case isPkgDot(ce.Fun, "hmac", "NewSHA1"):
- pkg = "sha1"
- case isPkgDot(ce.Fun, "hmac", "NewSHA256"):
- pkg = "sha256"
- default:
- return
- }
-
- addImport(f, "crypto/"+pkg)
-
- ce.Fun = ast.NewIdent("hmac.New")
- ce.Args = append([]ast.Expr{ast.NewIdent(pkg + ".New")}, ce.Args...)
-
- fixed = true
- })
-
- return
-}
diff --git a/src/cmd/fix/hmacnew_test.go b/src/cmd/fix/hmacnew_test.go
deleted file mode 100644
index 5aeee85738..0000000000
--- a/src/cmd/fix/hmacnew_test.go
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(hmacNewTests, hmacnew)
-}
-
-var hmacNewTests = []testCase{
- {
- Name: "hmacnew.0",
- In: `package main
-
-import "crypto/hmac"
-
-var f = hmac.NewSHA1([]byte("some key"))
-`,
- Out: `package main
-
-import (
- "crypto/hmac"
- "crypto/sha1"
-)
-
-var f = hmac.New(sha1.New, []byte("some key"))
-`,
- },
- {
- Name: "hmacnew.1",
- In: `package main
-
-import "crypto/hmac"
-
-var key = make([]byte, 8)
-var f = hmac.NewSHA1(key)
-`,
- Out: `package main
-
-import (
- "crypto/hmac"
- "crypto/sha1"
-)
-
-var key = make([]byte, 8)
-var f = hmac.New(sha1.New, key)
-`,
- },
- {
- Name: "hmacnew.2",
- In: `package main
-
-import "crypto/hmac"
-
-var f = hmac.NewMD5([]byte("some key"))
-`,
- Out: `package main
-
-import (
- "crypto/hmac"
- "crypto/md5"
-)
-
-var f = hmac.New(md5.New, []byte("some key"))
-`,
- },
- {
- Name: "hmacnew.3",
- In: `package main
-
-import "crypto/hmac"
-
-var f = hmac.NewSHA256([]byte("some key"))
-`,
- Out: `package main
-
-import (
- "crypto/hmac"
- "crypto/sha256"
-)
-
-var f = hmac.New(sha256.New, []byte("some key"))
-`,
- },
- {
- Name: "hmacnew.4",
- In: `package main
-
-import (
- "crypto/hmac"
- "crypto/sha1"
-)
-
-var f = hmac.New(sha1.New, []byte("some key"))
-`,
- Out: `package main
-
-import (
- "crypto/hmac"
- "crypto/sha1"
-)
-
-var f = hmac.New(sha1.New, []byte("some key"))
-`,
- },
-}
diff --git a/src/cmd/fix/htmlerr.go b/src/cmd/fix/htmlerr.go
deleted file mode 100644
index b5105c8226..0000000000
--- a/src/cmd/fix/htmlerr.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(htmlerrFix)
-}
-
-var htmlerrFix = fix{
- "htmlerr",
- "2011-11-04",
- htmlerr,
- `Rename html's Tokenizer.Error method to Err.
-
-http://codereview.appspot.com/5327064/
-`,
-}
-
-var htmlerrTypeConfig = &TypeConfig{
- Func: map[string]string{
- "html.NewTokenizer": "html.Tokenizer",
- },
-}
-
-func htmlerr(f *ast.File) bool {
- if !imports(f, "html") {
- return false
- }
-
- typeof, _ := typecheck(htmlerrTypeConfig, f)
-
- fixed := false
- walk(f, func(n interface{}) {
- s, ok := n.(*ast.SelectorExpr)
- if ok && typeof[s.X] == "html.Tokenizer" && s.Sel.Name == "Error" {
- s.Sel.Name = "Err"
- fixed = true
- }
- })
- return fixed
-}
diff --git a/src/cmd/fix/htmlerr_test.go b/src/cmd/fix/htmlerr_test.go
deleted file mode 100644
index 043abc42a2..0000000000
--- a/src/cmd/fix/htmlerr_test.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(htmlerrTests, htmlerr)
-}
-
-var htmlerrTests = []testCase{
- {
- Name: "htmlerr.0",
- In: `package main
-
-import (
- "html"
-)
-
-func f() {
- e := errors.New("")
- t := html.NewTokenizer(r)
- _, _ = e.Error(), t.Error()
-}
-`,
- Out: `package main
-
-import (
- "html"
-)
-
-func f() {
- e := errors.New("")
- t := html.NewTokenizer(r)
- _, _ = e.Error(), t.Err()
-}
-`,
- },
-}
diff --git a/src/cmd/fix/httpfinalurl.go b/src/cmd/fix/httpfinalurl.go
deleted file mode 100644
index 49b9f1c516..0000000000
--- a/src/cmd/fix/httpfinalurl.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(httpFinalURLFix)
-}
-
-var httpFinalURLFix = fix{
- "httpfinalurl",
- "2011-05-13",
- httpfinalurl,
- `Adapt http Get calls to not have a finalURL result parameter.
-
-http://codereview.appspot.com/4535056/
-`,
-}
-
-func httpfinalurl(f *ast.File) bool {
- if !imports(f, "http") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- // Fix up calls to http.Get.
- //
- // If they have blank identifiers, remove them:
- // resp, _, err := http.Get(url)
- // -> resp, err := http.Get(url)
- //
- // But if they're using the finalURL parameter, warn:
- // resp, finalURL, err := http.Get(url)
- as, ok := n.(*ast.AssignStmt)
- if !ok || len(as.Lhs) != 3 || len(as.Rhs) != 1 {
- return
- }
-
- if !isCall(as.Rhs[0], "http", "Get") {
- return
- }
-
- if isBlank(as.Lhs[1]) {
- as.Lhs = []ast.Expr{as.Lhs[0], as.Lhs[2]}
- fixed = true
- } else {
- warn(as.Pos(), "call to http.Get records final URL")
- }
- })
- return fixed
-}
diff --git a/src/cmd/fix/httpfinalurl_test.go b/src/cmd/fix/httpfinalurl_test.go
deleted file mode 100644
index 9249f7e185..0000000000
--- a/src/cmd/fix/httpfinalurl_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(httpfinalurlTests, httpfinalurl)
-}
-
-var httpfinalurlTests = []testCase{
- {
- Name: "finalurl.0",
- In: `package main
-
-import (
- "http"
-)
-
-func f() {
- resp, _, err := http.Get("http://www.google.com/")
- _, _ = resp, err
-}
-`,
- Out: `package main
-
-import (
- "http"
-)
-
-func f() {
- resp, err := http.Get("http://www.google.com/")
- _, _ = resp, err
-}
-`,
- },
-}
diff --git a/src/cmd/fix/httpfs.go b/src/cmd/fix/httpfs.go
deleted file mode 100644
index d87b30f9de..0000000000
--- a/src/cmd/fix/httpfs.go
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "go/token"
-)
-
-func init() {
- register(httpFileSystemFix)
-}
-
-var httpFileSystemFix = fix{
- "httpfs",
- "2011-06-27",
- httpfs,
- `Adapt http FileServer to take a FileSystem.
-
-http://codereview.appspot.com/4629047 http FileSystem interface
-`,
-}
-
-func httpfs(f *ast.File) bool {
- if !imports(f, "http") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if !ok || !isPkgDot(call.Fun, "http", "FileServer") {
- return
- }
- if len(call.Args) != 2 {
- return
- }
- dir, prefix := call.Args[0], call.Args[1]
- call.Args = []ast.Expr{&ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: ast.NewIdent("http"),
- Sel: ast.NewIdent("Dir"),
- },
- Args: []ast.Expr{dir},
- }}
- wrapInStripHandler := true
- if prefixLit, ok := prefix.(*ast.BasicLit); ok {
- if prefixLit.Kind == token.STRING && (prefixLit.Value == `"/"` || prefixLit.Value == `""`) {
- wrapInStripHandler = false
- }
- }
- if wrapInStripHandler {
- call.Fun.(*ast.SelectorExpr).Sel = ast.NewIdent("StripPrefix")
- call.Args = []ast.Expr{
- prefix,
- &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: ast.NewIdent("http"),
- Sel: ast.NewIdent("FileServer"),
- },
- Args: call.Args,
- },
- }
- }
- fixed = true
- })
- return fixed
-}
diff --git a/src/cmd/fix/httpfs_test.go b/src/cmd/fix/httpfs_test.go
deleted file mode 100644
index dd8ef2cfd6..0000000000
--- a/src/cmd/fix/httpfs_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(httpFileSystemTests, httpfs)
-}
-
-var httpFileSystemTests = []testCase{
- {
- Name: "httpfs.0",
- In: `package httpfs
-
-import (
- "http"
-)
-
-func f() {
- _ = http.FileServer("/var/www/foo", "/")
- _ = http.FileServer("/var/www/foo", "")
- _ = http.FileServer("/var/www/foo/bar", "/bar")
- s := "/foo"
- _ = http.FileServer(s, "/")
- prefix := "/p"
- _ = http.FileServer(s, prefix)
-}
-`,
- Out: `package httpfs
-
-import (
- "http"
-)
-
-func f() {
- _ = http.FileServer(http.Dir("/var/www/foo"))
- _ = http.FileServer(http.Dir("/var/www/foo"))
- _ = http.StripPrefix("/bar", http.FileServer(http.Dir("/var/www/foo/bar")))
- s := "/foo"
- _ = http.FileServer(http.Dir(s))
- prefix := "/p"
- _ = http.StripPrefix(prefix, http.FileServer(http.Dir(s)))
-}
-`,
- },
-}
diff --git a/src/cmd/fix/httpheaders.go b/src/cmd/fix/httpheaders.go
deleted file mode 100644
index 15c21ac867..0000000000
--- a/src/cmd/fix/httpheaders.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(httpHeadersFix)
-}
-
-var httpHeadersFix = fix{
- "httpheaders",
- "2011-06-16",
- httpheaders,
- `Rename http Referer, UserAgent, Cookie, SetCookie, which are now methods.
-
-http://codereview.appspot.com/4620049/
-`,
-}
-
-func httpheaders(f *ast.File) bool {
- if !imports(f, "http") {
- return false
- }
-
- called := make(map[ast.Node]bool)
- walk(f, func(ni interface{}) {
- switch n := ni.(type) {
- case *ast.CallExpr:
- called[n.Fun] = true
- }
- })
-
- fixed := false
- typeof, _ := typecheck(headerTypeConfig, f)
- walk(f, func(ni interface{}) {
- switch n := ni.(type) {
- case *ast.SelectorExpr:
- if called[n] {
- break
- }
- if t := typeof[n.X]; t != "*http.Request" && t != "*http.Response" {
- break
- }
- switch n.Sel.Name {
- case "Referer", "UserAgent":
- n.Sel.Name += "()"
- fixed = true
- case "Cookie":
- n.Sel.Name = "Cookies()"
- fixed = true
- }
- }
- })
- return fixed
-}
-
-var headerTypeConfig = &TypeConfig{
- Type: map[string]*Type{
- "*http.Request": {},
- "*http.Response": {},
- },
-}
diff --git a/src/cmd/fix/httpheaders_test.go b/src/cmd/fix/httpheaders_test.go
deleted file mode 100644
index 37506b82da..0000000000
--- a/src/cmd/fix/httpheaders_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(httpHeadersTests, httpheaders)
-}
-
-var httpHeadersTests = []testCase{
- {
- Name: "httpheaders.0",
- In: `package headertest
-
-import (
- "http"
-)
-
-type Other struct {
- Referer string
- UserAgent string
- Cookie []*http.Cookie
-}
-
-func f(req *http.Request, res *http.Response, other *Other) {
- _ = req.Referer
- _ = req.UserAgent
- _ = req.Cookie
-
- _ = res.Cookie
-
- _ = other.Referer
- _ = other.UserAgent
- _ = other.Cookie
-
- _ = req.Referer()
- _ = req.UserAgent()
- _ = req.Cookies()
- _ = res.Cookies()
-}
-`,
- Out: `package headertest
-
-import (
- "http"
-)
-
-type Other struct {
- Referer string
- UserAgent string
- Cookie []*http.Cookie
-}
-
-func f(req *http.Request, res *http.Response, other *Other) {
- _ = req.Referer()
- _ = req.UserAgent()
- _ = req.Cookies()
-
- _ = res.Cookies()
-
- _ = other.Referer
- _ = other.UserAgent
- _ = other.Cookie
-
- _ = req.Referer()
- _ = req.UserAgent()
- _ = req.Cookies()
- _ = res.Cookies()
-}
-`,
- },
-}
diff --git a/src/cmd/fix/httpserver.go b/src/cmd/fix/httpserver.go
deleted file mode 100644
index 7aa6517864..0000000000
--- a/src/cmd/fix/httpserver.go
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "go/token"
-)
-
-func init() {
- register(httpserverFix)
-}
-
-var httpserverFix = fix{
- "httpserver",
- "2011-03-15",
- httpserver,
- `Adapt http server methods and functions to changes
-made to the http ResponseWriter interface.
-
-http://codereview.appspot.com/4245064 Hijacker
-http://codereview.appspot.com/4239076 Header
-http://codereview.appspot.com/4239077 Flusher
-http://codereview.appspot.com/4248075 RemoteAddr, UsingTLS
-`,
-}
-
-func httpserver(f *ast.File) bool {
- if !imports(f, "http") {
- return false
- }
-
- fixed := false
- for _, decl := range f.Decls {
- fn, ok := decl.(*ast.FuncDecl)
- if !ok {
- continue
- }
- w, req, ok := isServeHTTP(fn)
- if !ok {
- continue
- }
- walk(fn.Body, func(n interface{}) {
- // Want to replace expression sometimes,
- // so record pointer to it for updating below.
- ptr, ok := n.(*ast.Expr)
- if ok {
- n = *ptr
- }
-
- // Look for w.UsingTLS() and w.Remoteaddr().
- call, ok := n.(*ast.CallExpr)
- if !ok || (len(call.Args) != 0 && len(call.Args) != 2) {
- return
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok {
- return
- }
- if !refersTo(sel.X, w) {
- return
- }
- switch sel.Sel.String() {
- case "Hijack":
- // replace w with w.(http.Hijacker)
- sel.X = &ast.TypeAssertExpr{
- X: sel.X,
- Type: ast.NewIdent("http.Hijacker"),
- }
- fixed = true
- case "Flush":
- // replace w with w.(http.Flusher)
- sel.X = &ast.TypeAssertExpr{
- X: sel.X,
- Type: ast.NewIdent("http.Flusher"),
- }
- fixed = true
- case "UsingTLS":
- if ptr == nil {
- // can only replace expression if we have pointer to it
- break
- }
- // replace with req.TLS != nil
- *ptr = &ast.BinaryExpr{
- X: &ast.SelectorExpr{
- X: ast.NewIdent(req.String()),
- Sel: ast.NewIdent("TLS"),
- },
- Op: token.NEQ,
- Y: ast.NewIdent("nil"),
- }
- fixed = true
- case "RemoteAddr":
- if ptr == nil {
- // can only replace expression if we have pointer to it
- break
- }
- // replace with req.RemoteAddr
- *ptr = &ast.SelectorExpr{
- X: ast.NewIdent(req.String()),
- Sel: ast.NewIdent("RemoteAddr"),
- }
- fixed = true
- case "SetHeader":
- // replace w.SetHeader with w.Header().Set
- // or w.Header().Del if second argument is ""
- sel.X = &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: ast.NewIdent(w.String()),
- Sel: ast.NewIdent("Header"),
- },
- }
- sel.Sel = ast.NewIdent("Set")
- if len(call.Args) == 2 && isEmptyString(call.Args[1]) {
- sel.Sel = ast.NewIdent("Del")
- call.Args = call.Args[:1]
- }
- fixed = true
- }
- })
- }
- return fixed
-}
-
-func isServeHTTP(fn *ast.FuncDecl) (w, req *ast.Ident, ok bool) {
- for _, field := range fn.Type.Params.List {
- if isPkgDot(field.Type, "http", "ResponseWriter") {
- w = field.Names[0]
- continue
- }
- if isPtrPkgDot(field.Type, "http", "Request") {
- req = field.Names[0]
- continue
- }
- }
-
- ok = w != nil && req != nil
- return
-}
diff --git a/src/cmd/fix/httpserver_test.go b/src/cmd/fix/httpserver_test.go
deleted file mode 100644
index b6ddff27e2..0000000000
--- a/src/cmd/fix/httpserver_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(httpserverTests, httpserver)
-}
-
-var httpserverTests = []testCase{
- {
- Name: "httpserver.0",
- In: `package main
-
-import "http"
-
-func f(xyz http.ResponseWriter, abc *http.Request, b string) {
- xyz.SetHeader("foo", "bar")
- xyz.SetHeader("baz", "")
- xyz.Hijack()
- xyz.Flush()
- go xyz.Hijack()
- defer xyz.Flush()
- _ = xyz.UsingTLS()
- _ = true == xyz.UsingTLS()
- _ = xyz.RemoteAddr()
- _ = xyz.RemoteAddr() == "hello"
- if xyz.UsingTLS() {
- }
-}
-`,
- Out: `package main
-
-import "http"
-
-func f(xyz http.ResponseWriter, abc *http.Request, b string) {
- xyz.Header().Set("foo", "bar")
- xyz.Header().Del("baz")
- xyz.(http.Hijacker).Hijack()
- xyz.(http.Flusher).Flush()
- go xyz.(http.Hijacker).Hijack()
- defer xyz.(http.Flusher).Flush()
- _ = abc.TLS != nil
- _ = true == (abc.TLS != nil)
- _ = abc.RemoteAddr
- _ = abc.RemoteAddr == "hello"
- if abc.TLS != nil {
- }
-}
-`,
- },
-}
diff --git a/src/cmd/fix/imagecolor.go b/src/cmd/fix/imagecolor.go
deleted file mode 100644
index 1aac40a6fd..0000000000
--- a/src/cmd/fix/imagecolor.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(imagecolorFix)
-}
-
-var imagecolorFix = fix{
- "imagecolor",
- "2011-10-04",
- imagecolor,
- `Adapt code to types moved from image to color.
-
-http://codereview.appspot.com/5132048
-`,
-}
-
-var colorRenames = []struct{ in, out string }{
- {"Color", "Color"},
- {"ColorModel", "Model"},
- {"ColorModelFunc", "ModelFunc"},
- {"PalettedColorModel", "Palette"},
-
- {"RGBAColor", "RGBA"},
- {"RGBA64Color", "RGBA64"},
- {"NRGBAColor", "NRGBA"},
- {"NRGBA64Color", "NRGBA64"},
- {"AlphaColor", "Alpha"},
- {"Alpha16Color", "Alpha16"},
- {"GrayColor", "Gray"},
- {"Gray16Color", "Gray16"},
-
- {"RGBAColorModel", "RGBAModel"},
- {"RGBA64ColorModel", "RGBA64Model"},
- {"NRGBAColorModel", "NRGBAModel"},
- {"NRGBA64ColorModel", "NRGBA64Model"},
- {"AlphaColorModel", "AlphaModel"},
- {"Alpha16ColorModel", "Alpha16Model"},
- {"GrayColorModel", "GrayModel"},
- {"Gray16ColorModel", "Gray16Model"},
-}
-
-func imagecolor(f *ast.File) (fixed bool) {
- if !imports(f, "image") {
- return
- }
-
- walk(f, func(n interface{}) {
- s, ok := n.(*ast.SelectorExpr)
-
- if !ok || !isTopName(s.X, "image") {
- return
- }
-
- switch sel := s.Sel.String(); {
- case sel == "ColorImage":
- s.Sel = &ast.Ident{Name: "Uniform"}
- fixed = true
- case sel == "NewColorImage":
- s.Sel = &ast.Ident{Name: "NewUniform"}
- fixed = true
- default:
- for _, rename := range colorRenames {
- if sel == rename.in {
- addImport(f, "image/color")
- s.X.(*ast.Ident).Name = "color"
- s.Sel.Name = rename.out
- fixed = true
- }
- }
- }
- })
-
- if fixed && !usesImport(f, "image") {
- deleteImport(f, "image")
- }
- return
-}
diff --git a/src/cmd/fix/imagecolor_test.go b/src/cmd/fix/imagecolor_test.go
deleted file mode 100644
index c623654817..0000000000
--- a/src/cmd/fix/imagecolor_test.go
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(colorTests, imagecolor)
-}
-
-var colorTests = []testCase{
- {
- Name: "color.0",
- In: `package main
-
-import (
- "image"
-)
-
-var (
- _ image.Image
- _ image.RGBA
- _ image.Black
- _ image.Color
- _ image.ColorModel
- _ image.ColorModelFunc
- _ image.PalettedColorModel
- _ image.RGBAColor
- _ image.RGBA64Color
- _ image.NRGBAColor
- _ image.NRGBA64Color
- _ image.AlphaColor
- _ image.Alpha16Color
- _ image.GrayColor
- _ image.Gray16Color
-)
-
-func f() {
- _ = image.RGBAColorModel
- _ = image.RGBA64ColorModel
- _ = image.NRGBAColorModel
- _ = image.NRGBA64ColorModel
- _ = image.AlphaColorModel
- _ = image.Alpha16ColorModel
- _ = image.GrayColorModel
- _ = image.Gray16ColorModel
-}
-`,
- Out: `package main
-
-import (
- "image"
- "image/color"
-)
-
-var (
- _ image.Image
- _ image.RGBA
- _ image.Black
- _ color.Color
- _ color.Model
- _ color.ModelFunc
- _ color.Palette
- _ color.RGBA
- _ color.RGBA64
- _ color.NRGBA
- _ color.NRGBA64
- _ color.Alpha
- _ color.Alpha16
- _ color.Gray
- _ color.Gray16
-)
-
-func f() {
- _ = color.RGBAModel
- _ = color.RGBA64Model
- _ = color.NRGBAModel
- _ = color.NRGBA64Model
- _ = color.AlphaModel
- _ = color.Alpha16Model
- _ = color.GrayModel
- _ = color.Gray16Model
-}
-`,
- },
- {
- Name: "color.1",
- In: `package main
-
-import (
- "fmt"
- "image"
-)
-
-func f() {
- fmt.Println(image.RGBAColor{1, 2, 3, 4}.RGBA())
-}
-`,
- Out: `package main
-
-import (
- "fmt"
- "image/color"
-)
-
-func f() {
- fmt.Println(color.RGBA{1, 2, 3, 4}.RGBA())
-}
-`,
- },
- {
- Name: "color.2",
- In: `package main
-
-import "image"
-
-var c *image.ColorImage = image.NewColorImage(nil)
-`,
- Out: `package main
-
-import "image"
-
-var c *image.Uniform = image.NewUniform(nil)
-`,
- },
-}
diff --git a/src/cmd/fix/imagenew.go b/src/cmd/fix/imagenew.go
deleted file mode 100644
index b4e36d4f0c..0000000000
--- a/src/cmd/fix/imagenew.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(imagenewFix)
-}
-
-var imagenewFix = fix{
- "imagenew",
- "2011-09-14",
- imagenew,
- `Adapt image.NewXxx calls to pass an image.Rectangle instead of (w, h int).
-
-http://codereview.appspot.com/4964073
-`,
-}
-
-var imagenewFuncs = map[string]bool{
- "NewRGBA": true,
- "NewRGBA64": true,
- "NewNRGBA": true,
- "NewNRGBA64": true,
- "NewAlpha": true,
- "NewAlpha16": true,
- "NewGray": true,
- "NewGray16": true,
-}
-
-func imagenew(f *ast.File) bool {
- if !imports(f, "image") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if !ok {
- return
- }
- isNewFunc := false
- for newFunc := range imagenewFuncs {
- if len(call.Args) == 2 && isPkgDot(call.Fun, "image", newFunc) {
- isNewFunc = true
- break
- }
- }
- if len(call.Args) == 3 && isPkgDot(call.Fun, "image", "NewPaletted") {
- isNewFunc = true
- }
- if !isNewFunc {
- return
- }
- // Replace image.NewXxx(w, h) with image.NewXxx(image.Rect(0, 0, w, h)).
- rectArgs := []ast.Expr{
- &ast.BasicLit{Value: "0"},
- &ast.BasicLit{Value: "0"},
- }
- rectArgs = append(rectArgs, call.Args[:2]...)
- rect := []ast.Expr{
- &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: &ast.Ident{
- Name: "image",
- },
- Sel: &ast.Ident{
- Name: "Rect",
- },
- },
- Args: rectArgs,
- },
- }
- call.Args = append(rect, call.Args[2:]...)
- fixed = true
- })
- return fixed
-}
diff --git a/src/cmd/fix/imagenew_test.go b/src/cmd/fix/imagenew_test.go
deleted file mode 100644
index 30abed23c2..0000000000
--- a/src/cmd/fix/imagenew_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(imagenewTests, imagenew)
-}
-
-var imagenewTests = []testCase{
- {
- Name: "imagenew.0",
- In: `package main
-
-import (
- "image"
-)
-
-func f() {
- image.NewRGBA(1, 2)
- image.NewRGBA64(1, 2)
- image.NewNRGBA(1, 2)
- image.NewNRGBA64(1, 2)
- image.NewAlpha(1, 2)
- image.NewAlpha16(1, 2)
- image.NewGray(1, 2)
- image.NewGray16(1, 2)
- image.NewPaletted(1, 2, nil)
-}
-`,
- Out: `package main
-
-import (
- "image"
-)
-
-func f() {
- image.NewRGBA(image.Rect(0, 0, 1, 2))
- image.NewRGBA64(image.Rect(0, 0, 1, 2))
- image.NewNRGBA(image.Rect(0, 0, 1, 2))
- image.NewNRGBA64(image.Rect(0, 0, 1, 2))
- image.NewAlpha(image.Rect(0, 0, 1, 2))
- image.NewAlpha16(image.Rect(0, 0, 1, 2))
- image.NewGray(image.Rect(0, 0, 1, 2))
- image.NewGray16(image.Rect(0, 0, 1, 2))
- image.NewPaletted(image.Rect(0, 0, 1, 2), nil)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/imageycbcr.go b/src/cmd/fix/imageycbcr.go
deleted file mode 100644
index 41b96d18d3..0000000000
--- a/src/cmd/fix/imageycbcr.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(imageycbcrFix)
-}
-
-var imageycbcrFix = fix{
- "imageycbcr",
- "2011-12-20",
- imageycbcr,
- `Adapt code to types moved from image/ycbcr to image and image/color.
-
-http://codereview.appspot.com/5493084
-`,
-}
-
-func imageycbcr(f *ast.File) (fixed bool) {
- if !imports(f, "image/ycbcr") {
- return
- }
-
- walk(f, func(n interface{}) {
- s, ok := n.(*ast.SelectorExpr)
-
- if !ok || !isTopName(s.X, "ycbcr") {
- return
- }
-
- switch s.Sel.String() {
- case "RGBToYCbCr", "YCbCrToRGB":
- addImport(f, "image/color")
- s.X.(*ast.Ident).Name = "color"
- case "YCbCrColor":
- addImport(f, "image/color")
- s.X.(*ast.Ident).Name = "color"
- s.Sel.Name = "YCbCr"
- case "YCbCrColorModel":
- addImport(f, "image/color")
- s.X.(*ast.Ident).Name = "color"
- s.Sel.Name = "YCbCrModel"
- case "SubsampleRatio", "SubsampleRatio444", "SubsampleRatio422", "SubsampleRatio420":
- addImport(f, "image")
- s.X.(*ast.Ident).Name = "image"
- s.Sel.Name = "YCbCr" + s.Sel.Name
- case "YCbCr":
- addImport(f, "image")
- s.X.(*ast.Ident).Name = "image"
- default:
- return
- }
- fixed = true
- })
-
- deleteImport(f, "image/ycbcr")
- return
-}
diff --git a/src/cmd/fix/imageycbcr_test.go b/src/cmd/fix/imageycbcr_test.go
deleted file mode 100644
index 23b599dcd3..0000000000
--- a/src/cmd/fix/imageycbcr_test.go
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(ycbcrTests, imageycbcr)
-}
-
-var ycbcrTests = []testCase{
- {
- Name: "ycbcr.0",
- In: `package main
-
-import (
- "image/ycbcr"
-)
-
-func f() {
- _ = ycbcr.RGBToYCbCr
- _ = ycbcr.YCbCrToRGB
- _ = ycbcr.YCbCrColorModel
- var _ ycbcr.YCbCrColor
- var _ ycbcr.YCbCr
- var (
- _ ycbcr.SubsampleRatio = ycbcr.SubsampleRatio444
- _ ycbcr.SubsampleRatio = ycbcr.SubsampleRatio422
- _ ycbcr.SubsampleRatio = ycbcr.SubsampleRatio420
- )
-}
-`,
- Out: `package main
-
-import (
- "image"
- "image/color"
-)
-
-func f() {
- _ = color.RGBToYCbCr
- _ = color.YCbCrToRGB
- _ = color.YCbCrModel
- var _ color.YCbCr
- var _ image.YCbCr
- var (
- _ image.YCbCrSubsampleRatio = image.YCbCrSubsampleRatio444
- _ image.YCbCrSubsampleRatio = image.YCbCrSubsampleRatio422
- _ image.YCbCrSubsampleRatio = image.YCbCrSubsampleRatio420
- )
-}
-`,
- },
-}
diff --git a/src/cmd/fix/iocopyn.go b/src/cmd/fix/iocopyn.go
deleted file mode 100644
index 720f3c6890..0000000000
--- a/src/cmd/fix/iocopyn.go
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(ioCopyNFix)
-}
-
-var ioCopyNFix = fix{
- "iocopyn",
- "2011-09-30",
- ioCopyN,
- `Rename io.Copyn to io.CopyN.
-
-http://codereview.appspot.com/5157045
-`,
-}
-
-func ioCopyN(f *ast.File) bool {
- if !imports(f, "io") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- if expr, ok := n.(ast.Expr); ok {
- if isPkgDot(expr, "io", "Copyn") {
- expr.(*ast.SelectorExpr).Sel.Name = "CopyN"
- fixed = true
- return
- }
- }
- })
- return fixed
-}
diff --git a/src/cmd/fix/iocopyn_test.go b/src/cmd/fix/iocopyn_test.go
deleted file mode 100644
index f86fad7637..0000000000
--- a/src/cmd/fix/iocopyn_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(ioCopyNTests, ioCopyN)
-}
-
-var ioCopyNTests = []testCase{
- {
- Name: "io.CopyN.0",
- In: `package main
-
-import (
- "io"
-)
-
-func f() {
- io.Copyn(dst, src)
- foo.Copyn(dst, src)
-}
-`,
- Out: `package main
-
-import (
- "io"
-)
-
-func f() {
- io.CopyN(dst, src)
- foo.Copyn(dst, src)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/mapdelete.go b/src/cmd/fix/mapdelete.go
deleted file mode 100644
index db89c7bf45..0000000000
--- a/src/cmd/fix/mapdelete.go
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "go/ast"
-
-func init() {
- register(mapdeleteFix)
-}
-
-var mapdeleteFix = fix{
- "mapdelete",
- "2011-10-18",
- mapdelete,
- `Use delete(m, k) instead of m[k] = 0, false.
-
-http://codereview.appspot.com/5272045
-`,
-}
-
-func mapdelete(f *ast.File) bool {
- fixed := false
- walk(f, func(n interface{}) {
- stmt, ok := n.(*ast.Stmt)
- if !ok {
- return
- }
- as, ok := (*stmt).(*ast.AssignStmt)
- if !ok || len(as.Lhs) != 1 || len(as.Rhs) != 2 {
- return
- }
- ix, ok := as.Lhs[0].(*ast.IndexExpr)
- if !ok {
- return
- }
- if !isTopName(as.Rhs[1], "false") {
- warn(as.Pos(), "two-element map assignment with non-false second value")
- return
- }
- if !canDrop(as.Rhs[0]) {
- warn(as.Pos(), "two-element map assignment with non-trivial first value")
- return
- }
- *stmt = &ast.ExprStmt{
- X: &ast.CallExpr{
- Fun: &ast.Ident{
- NamePos: as.Pos(),
- Name: "delete",
- },
- Args: []ast.Expr{ix.X, ix.Index},
- },
- }
- fixed = true
- })
- return fixed
-}
-
-// canDrop reports whether it is safe to drop the
-// evaluation of n from the program.
-// It is very conservative.
-func canDrop(n ast.Expr) bool {
- switch n := n.(type) {
- case *ast.Ident, *ast.BasicLit:
- return true
- case *ast.ParenExpr:
- return canDrop(n.X)
- case *ast.SelectorExpr:
- return canDrop(n.X)
- case *ast.CompositeLit:
- if !canDrop(n.Type) {
- return false
- }
- for _, e := range n.Elts {
- if !canDrop(e) {
- return false
- }
- }
- return true
- case *ast.StarExpr:
- // Dropping *x is questionable,
- // but we have to be able to drop (*T)(nil).
- return canDrop(n.X)
- case *ast.ArrayType, *ast.ChanType, *ast.FuncType, *ast.InterfaceType, *ast.MapType, *ast.StructType:
- return true
- }
- return false
-}
diff --git a/src/cmd/fix/mapdelete_test.go b/src/cmd/fix/mapdelete_test.go
deleted file mode 100644
index 8ed50328e9..0000000000
--- a/src/cmd/fix/mapdelete_test.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(mapdeleteTests, mapdelete)
-}
-
-var mapdeleteTests = []testCase{
- {
- Name: "mapdelete.0",
- In: `package main
-
-func f() {
- m[x] = 0, false
- m[x] = g(), false
- m[x] = 1
- delete(m, x)
- m[x] = 0, b
-}
-
-func g(false bool) {
- m[x] = 0, false
-}
-`,
- Out: `package main
-
-func f() {
- delete(m, x)
- m[x] = g(), false
- m[x] = 1
- delete(m, x)
- m[x] = 0, b
-}
-
-func g(false bool) {
- m[x] = 0, false
-}
-`,
- },
-}
diff --git a/src/cmd/fix/math.go b/src/cmd/fix/math.go
deleted file mode 100644
index 2ec837eb00..0000000000
--- a/src/cmd/fix/math.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "go/ast"
-
-func init() {
- register(mathFix)
-}
-
-var mathFix = fix{
- "math",
- "2011-09-29",
- math,
- `Remove the leading F from math functions such as Fabs.
-
-http://codereview.appspot.com/5158043
-`,
-}
-
-var mathRenames = []struct{ in, out string }{
- {"Fabs", "Abs"},
- {"Fdim", "Dim"},
- {"Fmax", "Max"},
- {"Fmin", "Min"},
- {"Fmod", "Mod"},
-}
-
-func math(f *ast.File) bool {
- if !imports(f, "math") {
- return false
- }
-
- fixed := false
-
- walk(f, func(n interface{}) {
- // Rename functions.
- if expr, ok := n.(ast.Expr); ok {
- for _, s := range mathRenames {
- if isPkgDot(expr, "math", s.in) {
- expr.(*ast.SelectorExpr).Sel.Name = s.out
- fixed = true
- return
- }
- }
- }
- })
- return fixed
-}
diff --git a/src/cmd/fix/math_test.go b/src/cmd/fix/math_test.go
deleted file mode 100644
index b8d69d2f2f..0000000000
--- a/src/cmd/fix/math_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(mathTests, math)
-}
-
-var mathTests = []testCase{
- {
- Name: "math.0",
- In: `package main
-
-import (
- "math"
-)
-
-func f() {
- math.Fabs(1)
- math.Fdim(1)
- math.Fmax(1)
- math.Fmin(1)
- math.Fmod(1)
- math.Abs(1)
- foo.Fabs(1)
-}
-`,
- Out: `package main
-
-import (
- "math"
-)
-
-func f() {
- math.Abs(1)
- math.Dim(1)
- math.Max(1)
- math.Min(1)
- math.Mod(1)
- math.Abs(1)
- foo.Fabs(1)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/netdial.go b/src/cmd/fix/netdial.go
deleted file mode 100644
index 2de994cffe..0000000000
--- a/src/cmd/fix/netdial.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(netdialFix)
- register(tlsdialFix)
- register(netlookupFix)
-}
-
-var netdialFix = fix{
- "netdial",
- "2011-03-28",
- netdial,
- `Adapt 3-argument calls of net.Dial to use 2-argument form.
-
-http://codereview.appspot.com/4244055
-`,
-}
-
-var tlsdialFix = fix{
- "tlsdial",
- "2011-03-28",
- tlsdial,
- `Adapt 4-argument calls of tls.Dial to use 3-argument form.
-
-http://codereview.appspot.com/4244055
-`,
-}
-
-var netlookupFix = fix{
- "netlookup",
- "2011-03-28",
- netlookup,
- `Adapt 3-result calls to net.LookupHost to use 2-result form.
-
-http://codereview.appspot.com/4244055
-`,
-}
-
-func netdial(f *ast.File) bool {
- if !imports(f, "net") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if !ok || !isPkgDot(call.Fun, "net", "Dial") || len(call.Args) != 3 {
- return
- }
- // net.Dial(a, "", b) -> net.Dial(a, b)
- if !isEmptyString(call.Args[1]) {
- warn(call.Pos(), "call to net.Dial with non-empty second argument")
- return
- }
- call.Args[1] = call.Args[2]
- call.Args = call.Args[:2]
- fixed = true
- })
- return fixed
-}
-
-func tlsdial(f *ast.File) bool {
- if !imports(f, "crypto/tls") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if !ok || !isPkgDot(call.Fun, "tls", "Dial") || len(call.Args) != 4 {
- return
- }
- // tls.Dial(a, "", b, c) -> tls.Dial(a, b, c)
- if !isEmptyString(call.Args[1]) {
- warn(call.Pos(), "call to tls.Dial with non-empty second argument")
- return
- }
- call.Args[1] = call.Args[2]
- call.Args[2] = call.Args[3]
- call.Args = call.Args[:3]
- fixed = true
- })
- return fixed
-}
-
-func netlookup(f *ast.File) bool {
- if !imports(f, "net") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- as, ok := n.(*ast.AssignStmt)
- if !ok || len(as.Lhs) != 3 || len(as.Rhs) != 1 {
- return
- }
- call, ok := as.Rhs[0].(*ast.CallExpr)
- if !ok || !isPkgDot(call.Fun, "net", "LookupHost") {
- return
- }
- if !isBlank(as.Lhs[2]) {
- warn(as.Pos(), "call to net.LookupHost expecting cname; use net.LookupCNAME")
- return
- }
- as.Lhs = as.Lhs[:2]
- fixed = true
- })
- return fixed
-}
diff --git a/src/cmd/fix/netdial_test.go b/src/cmd/fix/netdial_test.go
deleted file mode 100644
index fff00b4ada..0000000000
--- a/src/cmd/fix/netdial_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(netdialTests, nil)
-}
-
-var netdialTests = []testCase{
- {
- Name: "netdial.0",
- Fn: netdial,
- In: `package main
-
-import "net"
-
-func f() {
- c, err := net.Dial(net, "", addr)
- c, err = net.Dial(net, "", addr)
-}
-`,
- Out: `package main
-
-import "net"
-
-func f() {
- c, err := net.Dial(net, addr)
- c, err = net.Dial(net, addr)
-}
-`,
- },
-
- {
- Name: "netlookup.0",
- Fn: netlookup,
- In: `package main
-
-import "net"
-
-func f() {
- foo, bar, _ := net.LookupHost(host)
- foo, bar, _ = net.LookupHost(host)
-}
-`,
- Out: `package main
-
-import "net"
-
-func f() {
- foo, bar := net.LookupHost(host)
- foo, bar = net.LookupHost(host)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/netudpgroup.go b/src/cmd/fix/netudpgroup.go
deleted file mode 100644
index b54beb0de3..0000000000
--- a/src/cmd/fix/netudpgroup.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(netudpgroupFix)
-}
-
-var netudpgroupFix = fix{
- "netudpgroup",
- "2011-08-18",
- netudpgroup,
- `Adapt 1-argument calls of net.(*UDPConn).JoinGroup, LeaveGroup to use 2-argument form.
-
-http://codereview.appspot.com/4815074
-`,
-}
-
-func netudpgroup(f *ast.File) bool {
- if !imports(f, "net") {
- return false
- }
-
- fixed := false
- for _, d := range f.Decls {
- fd, ok := d.(*ast.FuncDecl)
- if !ok || fd.Body == nil {
- continue
- }
- walk(fd.Body, func(n interface{}) {
- ce, ok := n.(*ast.CallExpr)
- if !ok {
- return
- }
- se, ok := ce.Fun.(*ast.SelectorExpr)
- if !ok || len(ce.Args) != 1 {
- return
- }
- switch se.Sel.String() {
- case "JoinGroup", "LeaveGroup":
- // c.JoinGroup(a) -> c.JoinGroup(nil, a)
- // c.LeaveGroup(a) -> c.LeaveGroup(nil, a)
- arg := ce.Args[0]
- ce.Args = make([]ast.Expr, 2)
- ce.Args[0] = ast.NewIdent("nil")
- ce.Args[1] = arg
- fixed = true
- }
- })
- }
- return fixed
-}
diff --git a/src/cmd/fix/netudpgroup_test.go b/src/cmd/fix/netudpgroup_test.go
deleted file mode 100644
index 88c0e093fc..0000000000
--- a/src/cmd/fix/netudpgroup_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(netudpgroupTests, netudpgroup)
-}
-
-var netudpgroupTests = []testCase{
- {
- Name: "netudpgroup.0",
- In: `package main
-
-import "net"
-
-func f() {
- err := x.JoinGroup(gaddr)
- err = y.LeaveGroup(gaddr)
-}
-`,
- Out: `package main
-
-import "net"
-
-func f() {
- err := x.JoinGroup(nil, gaddr)
- err = y.LeaveGroup(nil, gaddr)
-}
-`,
- },
- // Innocent function with no body.
- {
- Name: "netudpgroup.1",
- In: `package main
-
-import "net"
-
-func f()
-
-var _ net.IP
-`,
- Out: `package main
-
-import "net"
-
-func f()
-
-var _ net.IP
-`,
- },
-}
diff --git a/src/cmd/fix/newwriter.go b/src/cmd/fix/newwriter.go
deleted file mode 100644
index 4befe24fb6..0000000000
--- a/src/cmd/fix/newwriter.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(newWriterFix)
-}
-
-var newWriterFix = fix{
- "newWriter",
- "2012-02-14",
- newWriter,
- `Adapt bufio, gzip and zlib NewWriterXxx calls for whether they return errors.
-
-Also rename gzip.Compressor and gzip.Decompressor to gzip.Writer and gzip.Reader.
-
-http://codereview.appspot.com/5639057 and
-http://codereview.appspot.com/5642054
-`,
-}
-
-func newWriter(f *ast.File) bool {
- if !imports(f, "bufio") && !imports(f, "compress/gzip") && !imports(f, "compress/zlib") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- switch n := n.(type) {
- case *ast.SelectorExpr:
- if isTopName(n.X, "gzip") {
- switch n.Sel.String() {
- case "Compressor":
- n.Sel = &ast.Ident{Name: "Writer"}
- fixed = true
- case "Decompressor":
- n.Sel = &ast.Ident{Name: "Reader"}
- fixed = true
- }
- } else if isTopName(n.X, "zlib") {
- if n.Sel.String() == "NewWriterDict" {
- n.Sel = &ast.Ident{Name: "NewWriterLevelDict"}
- fixed = true
- }
- }
-
- case *ast.AssignStmt:
- // Drop the ", _" in assignments of the form:
- // w0, _ = gzip.NewWriter(w1)
- if len(n.Lhs) != 2 || len(n.Rhs) != 1 {
- return
- }
- i, ok := n.Lhs[1].(*ast.Ident)
- if !ok {
- return
- }
- if i.String() != "_" {
- return
- }
- c, ok := n.Rhs[0].(*ast.CallExpr)
- if !ok {
- return
- }
- s, ok := c.Fun.(*ast.SelectorExpr)
- if !ok {
- return
- }
- sel := s.Sel.String()
- switch {
- case isTopName(s.X, "bufio") && (sel == "NewReaderSize" || sel == "NewWriterSize"):
- // No-op.
- case isTopName(s.X, "gzip") && sel == "NewWriter":
- // No-op.
- case isTopName(s.X, "zlib") && sel == "NewWriter":
- // No-op.
- default:
- return
- }
- n.Lhs = n.Lhs[:1]
- fixed = true
- }
- })
- return fixed
-}
diff --git a/src/cmd/fix/newwriter_test.go b/src/cmd/fix/newwriter_test.go
deleted file mode 100644
index 1f59628a0d..0000000000
--- a/src/cmd/fix/newwriter_test.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(newWriterTests, newWriter)
-}
-
-var newWriterTests = []testCase{
- {
- Name: "newWriter.0",
- In: `package main
-
-import (
- "bufio"
- "compress/gzip"
- "compress/zlib"
- "io"
-
- "foo"
-)
-
-func f() *gzip.Compressor {
- var (
- _ gzip.Compressor
- _ *gzip.Decompressor
- _ struct {
- W *gzip.Compressor
- R gzip.Decompressor
- }
- )
-
- var w io.Writer
- br := bufio.NewReader(nil)
- br, _ = bufio.NewReaderSize(nil, 256)
- bw, err := bufio.NewWriterSize(w, 256) // Unfixable, as it declares an err variable.
- bw, _ = bufio.NewWriterSize(w, 256)
- fw, _ := foo.NewWriter(w)
- gw, _ := gzip.NewWriter(w)
- gw, _ = gzip.NewWriter(w)
- zw, _ := zlib.NewWriter(w)
- _ = zlib.NewWriterDict(zw, 0, nil)
- return gw
-}
-`,
- Out: `package main
-
-import (
- "bufio"
- "compress/gzip"
- "compress/zlib"
- "io"
-
- "foo"
-)
-
-func f() *gzip.Writer {
- var (
- _ gzip.Writer
- _ *gzip.Reader
- _ struct {
- W *gzip.Writer
- R gzip.Reader
- }
- )
-
- var w io.Writer
- br := bufio.NewReader(nil)
- br = bufio.NewReaderSize(nil, 256)
- bw, err := bufio.NewWriterSize(w, 256) // Unfixable, as it declares an err variable.
- bw = bufio.NewWriterSize(w, 256)
- fw, _ := foo.NewWriter(w)
- gw := gzip.NewWriter(w)
- gw = gzip.NewWriter(w)
- zw := zlib.NewWriter(w)
- _ = zlib.NewWriterLevelDict(zw, 0, nil)
- return gw
-}
-`,
- },
-}
diff --git a/src/cmd/fix/oserrorstring.go b/src/cmd/fix/oserrorstring.go
deleted file mode 100644
index a75a2c12d3..0000000000
--- a/src/cmd/fix/oserrorstring.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(oserrorstringFix)
-}
-
-var oserrorstringFix = fix{
- "oserrorstring",
- "2011-06-22",
- oserrorstring,
- `Replace os.ErrorString() conversions with calls to os.NewError().
-
-http://codereview.appspot.com/4607052
-`,
-}
-
-func oserrorstring(f *ast.File) bool {
- if !imports(f, "os") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- // The conversion os.ErrorString(x) looks like a call
- // of os.ErrorString with one argument.
- if call := callExpr(n, "os", "ErrorString"); call != nil {
- // os.ErrorString(args) -> os.NewError(args)
- call.Fun.(*ast.SelectorExpr).Sel.Name = "NewError"
- // os.ErrorString(args) -> os.NewError(args)
- call.Fun.(*ast.SelectorExpr).Sel.Name = "NewError"
- fixed = true
- return
- }
-
- // Remove os.Error type from variable declarations initialized
- // with an os.NewError.
- // (An *ast.ValueSpec may also be used in a const declaration
- // but those won't be initialized with a call to os.NewError.)
- if spec, ok := n.(*ast.ValueSpec); ok &&
- len(spec.Names) == 1 &&
- isPkgDot(spec.Type, "os", "Error") &&
- len(spec.Values) == 1 &&
- callExpr(spec.Values[0], "os", "NewError") != nil {
- // var name os.Error = os.NewError(x) ->
- // var name = os.NewError(x)
- spec.Type = nil
- fixed = true
- return
- }
-
- // Other occurrences of os.ErrorString are not fixed
- // but they are rare.
-
- })
- return fixed
-}
-
-// callExpr returns the call expression if x is a call to pkg.name with one argument;
-// otherwise it returns nil.
-func callExpr(x interface{}, pkg, name string) *ast.CallExpr {
- if call, ok := x.(*ast.CallExpr); ok &&
- len(call.Args) == 1 &&
- isPkgDot(call.Fun, pkg, name) {
- return call
- }
- return nil
-}
diff --git a/src/cmd/fix/oserrorstring_test.go b/src/cmd/fix/oserrorstring_test.go
deleted file mode 100644
index 75551480c5..0000000000
--- a/src/cmd/fix/oserrorstring_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(oserrorstringTests, oserrorstring)
-}
-
-var oserrorstringTests = []testCase{
- {
- Name: "oserrorstring.0",
- In: `package main
-
-import "os"
-
-var _ = os.ErrorString("foo")
-var _ os.Error = os.ErrorString("bar1")
-var _ os.Error = os.NewError("bar2")
-var _ os.Error = MyError("bal") // don't rewrite this one
-
-var (
- _ = os.ErrorString("foo")
- _ os.Error = os.ErrorString("bar1")
- _ os.Error = os.NewError("bar2")
- _ os.Error = MyError("bal") // don't rewrite this one
-)
-
-func _() (err os.Error) {
- err = os.ErrorString("foo")
- return os.ErrorString("foo")
-}
-`,
- Out: `package main
-
-import "os"
-
-var _ = os.NewError("foo")
-var _ = os.NewError("bar1")
-var _ = os.NewError("bar2")
-var _ os.Error = MyError("bal") // don't rewrite this one
-
-var (
- _ = os.NewError("foo")
- _ = os.NewError("bar1")
- _ = os.NewError("bar2")
- _ os.Error = MyError("bal") // don't rewrite this one
-)
-
-func _() (err os.Error) {
- err = os.NewError("foo")
- return os.NewError("foo")
-}
-`,
- },
-}
diff --git a/src/cmd/fix/osopen.go b/src/cmd/fix/osopen.go
deleted file mode 100644
index 5fe4cd067f..0000000000
--- a/src/cmd/fix/osopen.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(osopenFix)
-}
-
-var osopenFix = fix{
- "osopen",
- "2011-04-04",
- osopen,
- `Adapt os.Open calls to new, easier API and rename O_CREAT O_CREATE.
-
-http://codereview.appspot.com/4357052
-`,
-}
-
-func osopen(f *ast.File) bool {
- if !imports(f, "os") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- // Rename O_CREAT to O_CREATE.
- if expr, ok := n.(ast.Expr); ok && isPkgDot(expr, "os", "O_CREAT") {
- expr.(*ast.SelectorExpr).Sel.Name = "O_CREATE"
- fixed = true
- return
- }
-
- // Fix up calls to Open.
- call, ok := n.(*ast.CallExpr)
- if !ok || len(call.Args) != 3 {
- return
- }
- if !isPkgDot(call.Fun, "os", "Open") {
- return
- }
- sel := call.Fun.(*ast.SelectorExpr)
- args := call.Args
- // os.Open(a, os.O_RDONLY, c) -> os.Open(a)
- if isPkgDot(args[1], "os", "O_RDONLY") || isPkgDot(args[1], "syscall", "O_RDONLY") {
- call.Args = call.Args[0:1]
- fixed = true
- return
- }
- // os.Open(a, createlike_flags, c) -> os.Create(a, c)
- if isCreateFlag(args[1]) {
- sel.Sel.Name = "Create"
- if !isSimplePerm(args[2]) {
- warn(sel.Pos(), "rewrote os.Open to os.Create with permission not 0666")
- }
- call.Args = args[0:1]
- fixed = true
- return
- }
- // Fallback: os.Open(a, b, c) -> os.OpenFile(a, b, c)
- sel.Sel.Name = "OpenFile"
- fixed = true
- })
- return fixed
-}
-
-func isCreateFlag(flag ast.Expr) bool {
- foundCreate := false
- foundTrunc := false
- // OR'ing of flags: is O_CREATE on? + or | would be fine; we just look for os.O_CREATE
- // and don't worry about the actual operator.
- p := flag.Pos()
- for {
- lhs := flag
- expr, isBinary := flag.(*ast.BinaryExpr)
- if isBinary {
- lhs = expr.Y
- }
- sel, ok := lhs.(*ast.SelectorExpr)
- if !ok || !isTopName(sel.X, "os") {
- return false
- }
- switch sel.Sel.Name {
- case "O_CREATE":
- foundCreate = true
- case "O_TRUNC":
- foundTrunc = true
- case "O_RDONLY", "O_WRONLY", "O_RDWR":
- // okay
- default:
- // Unexpected flag, like O_APPEND or O_EXCL.
- // Be conservative and do not rewrite.
- return false
- }
- if !isBinary {
- break
- }
- flag = expr.X
- }
- if !foundCreate {
- return false
- }
- if !foundTrunc {
- warn(p, "rewrote os.Open with O_CREATE but not O_TRUNC to os.Create")
- }
- return foundCreate
-}
-
-func isSimplePerm(perm ast.Expr) bool {
- basicLit, ok := perm.(*ast.BasicLit)
- if !ok {
- return false
- }
- switch basicLit.Value {
- case "0666":
- return true
- }
- return false
-}
diff --git a/src/cmd/fix/osopen_test.go b/src/cmd/fix/osopen_test.go
deleted file mode 100644
index 5797adb7b2..0000000000
--- a/src/cmd/fix/osopen_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(osopenTests, osopen)
-}
-
-var osopenTests = []testCase{
- {
- Name: "osopen.0",
- In: `package main
-
-import (
- "os"
-)
-
-func f() {
- os.OpenFile(a, b, c)
- os.Open(a, os.O_RDONLY, 0)
- os.Open(a, os.O_RDONLY, 0666)
- os.Open(a, os.O_RDWR, 0)
- os.Open(a, os.O_CREAT, 0666)
- os.Open(a, os.O_CREAT|os.O_TRUNC, 0664)
- os.Open(a, os.O_CREATE, 0666)
- os.Open(a, os.O_CREATE|os.O_TRUNC, 0664)
- os.Open(a, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
- os.Open(a, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
- os.Open(a, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666)
- os.Open(a, os.O_SURPRISE|os.O_CREATE, 0666)
- _ = os.O_CREAT
-}
-`,
- Out: `package main
-
-import (
- "os"
-)
-
-func f() {
- os.OpenFile(a, b, c)
- os.Open(a)
- os.Open(a)
- os.OpenFile(a, os.O_RDWR, 0)
- os.Create(a)
- os.Create(a)
- os.Create(a)
- os.Create(a)
- os.Create(a)
- os.OpenFile(a, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
- os.OpenFile(a, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666)
- os.OpenFile(a, os.O_SURPRISE|os.O_CREATE, 0666)
- _ = os.O_CREATE
-}
-`,
- },
- {
- Name: "osopen.1",
- In: `package main
-
-import (
- "os"
-)
-
-func f() {
- _ = os.O_CREAT
-}
-`,
- Out: `package main
-
-import (
- "os"
-)
-
-func f() {
- _ = os.O_CREATE
-}
-`,
- },
-}
diff --git a/src/cmd/fix/procattr.go b/src/cmd/fix/procattr.go
deleted file mode 100644
index ea375ec9dd..0000000000
--- a/src/cmd/fix/procattr.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "go/token"
-)
-
-func init() {
- register(procattrFix)
-}
-
-var procattrFix = fix{
- "procattr",
- "2011-03-15",
- procattr,
- `Adapt calls to os.StartProcess to use new ProcAttr type.
-
-http://codereview.appspot.com/4253052
-`,
-}
-
-func procattr(f *ast.File) bool {
- if !imports(f, "os") && !imports(f, "syscall") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if !ok || len(call.Args) != 5 {
- return
- }
- var pkg string
- if isPkgDot(call.Fun, "os", "StartProcess") {
- pkg = "os"
- } else if isPkgDot(call.Fun, "syscall", "StartProcess") {
- pkg = "syscall"
- } else {
- return
- }
- // os.StartProcess(a, b, c, d, e) -> os.StartProcess(a, b, &os.ProcAttr{Env: c, Dir: d, Files: e})
- lit := &ast.CompositeLit{Type: ast.NewIdent(pkg + ".ProcAttr")}
- env, dir, files := call.Args[2], call.Args[3], call.Args[4]
- if !isName(env, "nil") && !isCall(env, "os", "Environ") {
- lit.Elts = append(lit.Elts, &ast.KeyValueExpr{Key: ast.NewIdent("Env"), Value: env})
- }
- if !isEmptyString(dir) {
- lit.Elts = append(lit.Elts, &ast.KeyValueExpr{Key: ast.NewIdent("Dir"), Value: dir})
- }
- if !isName(files, "nil") {
- lit.Elts = append(lit.Elts, &ast.KeyValueExpr{Key: ast.NewIdent("Files"), Value: files})
- }
- call.Args[2] = &ast.UnaryExpr{Op: token.AND, X: lit}
- call.Args = call.Args[:3]
- fixed = true
- })
- return fixed
-}
diff --git a/src/cmd/fix/procattr_test.go b/src/cmd/fix/procattr_test.go
deleted file mode 100644
index 9e2b86e744..0000000000
--- a/src/cmd/fix/procattr_test.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(procattrTests, procattr)
-}
-
-var procattrTests = []testCase{
- {
- Name: "procattr.0",
- In: `package main
-
-import (
- "os"
- "syscall"
-)
-
-func f() {
- os.StartProcess(a, b, c, d, e)
- os.StartProcess(a, b, os.Environ(), d, e)
- os.StartProcess(a, b, nil, d, e)
- os.StartProcess(a, b, c, "", e)
- os.StartProcess(a, b, c, d, nil)
- os.StartProcess(a, b, nil, "", nil)
-
- os.StartProcess(
- a,
- b,
- c,
- d,
- e,
- )
-
- syscall.StartProcess(a, b, c, d, e)
- syscall.StartProcess(a, b, os.Environ(), d, e)
- syscall.StartProcess(a, b, nil, d, e)
- syscall.StartProcess(a, b, c, "", e)
- syscall.StartProcess(a, b, c, d, nil)
- syscall.StartProcess(a, b, nil, "", nil)
-}
-`,
- Out: `package main
-
-import (
- "os"
- "syscall"
-)
-
-func f() {
- os.StartProcess(a, b, &os.ProcAttr{Env: c, Dir: d, Files: e})
- os.StartProcess(a, b, &os.ProcAttr{Dir: d, Files: e})
- os.StartProcess(a, b, &os.ProcAttr{Dir: d, Files: e})
- os.StartProcess(a, b, &os.ProcAttr{Env: c, Files: e})
- os.StartProcess(a, b, &os.ProcAttr{Env: c, Dir: d})
- os.StartProcess(a, b, &os.ProcAttr{})
-
- os.StartProcess(
- a,
- b, &os.ProcAttr{Env: c, Dir: d, Files: e},
- )
-
- syscall.StartProcess(a, b, &syscall.ProcAttr{Env: c, Dir: d, Files: e})
- syscall.StartProcess(a, b, &syscall.ProcAttr{Dir: d, Files: e})
- syscall.StartProcess(a, b, &syscall.ProcAttr{Dir: d, Files: e})
- syscall.StartProcess(a, b, &syscall.ProcAttr{Env: c, Files: e})
- syscall.StartProcess(a, b, &syscall.ProcAttr{Env: c, Dir: d})
- syscall.StartProcess(a, b, &syscall.ProcAttr{})
-}
-`,
- },
-}
diff --git a/src/cmd/fix/reflect.go b/src/cmd/fix/reflect.go
deleted file mode 100644
index a81f485467..0000000000
--- a/src/cmd/fix/reflect.go
+++ /dev/null
@@ -1,862 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TODO(rsc): Once there is better support for writing
-// multi-package commands, this should really be in
-// its own package, and then we can drop all the "reflect"
-// prefixes on the global variables and functions.
-
-package main
-
-import (
- "go/ast"
- "go/token"
- "strings"
-)
-
-func init() {
- register(reflectFix)
-}
-
-var reflectFix = fix{
- "reflect",
- "2011-04-08",
- reflectFn,
- `Adapt code to new reflect API.
-
-http://codereview.appspot.com/4281055
-http://codereview.appspot.com/4433066
-`,
-}
-
-// The reflect API change dropped the concrete types *reflect.ArrayType etc.
-// Any type assertions prior to method calls can be deleted:
-// x.(*reflect.ArrayType).Len() -> x.Len()
-//
-// Any type checks can be replaced by assignment and check of Kind:
-// x, y := z.(*reflect.ArrayType)
-// ->
-// x := z
-// y := x.Kind() == reflect.Array
-//
-// If z is an ordinary variable name and x is not subsequently assigned to,
-// references to x can be replaced by z and the assignment deleted.
-// We only bother if x and z are the same name.
-// If y is not subsequently assigned to and neither is x, references to
-// y can be replaced by its expression. We only bother when there is
-// just one use or when the use appears in an if clause.
-//
-// Not all type checks result in a single Kind check. The rewrite of the type check for
-// reflect.ArrayOrSliceType checks x.Kind() against reflect.Array and reflect.Slice.
-// The rewrite for *reflect.IntType checks against Int, Int8, Int16, Int32, Int64.
-// The rewrite for *reflect.UintType adds Uintptr.
-//
-// A type switch turns into an assignment and a switch on Kind:
-// switch x := y.(type) {
-// case reflect.ArrayOrSliceType:
-// ...
-// case *reflect.ChanType:
-// ...
-// case *reflect.IntType:
-// ...
-// }
-// ->
-// switch x := y; x.Kind() {
-// case reflect.Array, reflect.Slice:
-// ...
-// case reflect.Chan:
-// ...
-// case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-// ...
-// }
-//
-// The same simplification applies: we drop x := x if x is not assigned
-// to in the switch cases.
-//
-// Because the type check assignment includes a type assertion in its
-// syntax and the rewrite traversal is bottom up, we must do a pass to
-// rewrite the type check assignments and then a separate pass to
-// rewrite the type assertions.
-//
-// The same process applies to the API changes for reflect.Value.
-//
-// For both cases, but especially Value, the code needs to be aware
-// of the type of a receiver when rewriting a method call. For example,
-// x.(*reflect.ArrayValue).Elem(i) becomes x.Index(i) while
-// x.(*reflect.MapValue).Elem(v) becomes x.MapIndex(v).
-// In general, reflectFn needs to know the type of the receiver expression.
-// In most cases (and in all the cases in the Go source tree), the toy
-// type checker in typecheck.go provides enough information for fix
-// to make the rewrite. If fix misses a rewrite, the code that is left over
-// will not compile, so it will be noticed immediately.
-
-func reflectFn(f *ast.File) bool {
- if !imports(f, "reflect") {
- return false
- }
-
- fixed := false
-
- // Rewrite names in method calls.
- // Needs basic type information (see above).
- typeof, _ := typecheck(reflectTypeConfig, f)
- walk(f, func(n interface{}) {
- switch n := n.(type) {
- case *ast.SelectorExpr:
- typ := typeof[n.X]
- if m := reflectRewriteMethod[typ]; m != nil {
- if replace := m[n.Sel.Name]; replace != "" {
- n.Sel.Name = replace
- fixed = true
- return
- }
- }
-
- // For all reflect Values, replace SetValue with Set.
- if isReflectValue[typ] && n.Sel.Name == "SetValue" {
- n.Sel.Name = "Set"
- fixed = true
- return
- }
-
- // Replace reflect.MakeZero with reflect.Zero.
- if isPkgDot(n, "reflect", "MakeZero") {
- n.Sel.Name = "Zero"
- fixed = true
- return
- }
- }
- })
-
- // Replace PtrValue's PointTo(x) with Set(x.Addr()).
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if !ok || len(call.Args) != 1 {
- return
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok || sel.Sel.Name != "PointTo" {
- return
- }
- typ := typeof[sel.X]
- if typ != "*reflect.PtrValue" {
- return
- }
- sel.Sel.Name = "Set"
- if !isTopName(call.Args[0], "nil") {
- call.Args[0] = &ast.SelectorExpr{
- X: call.Args[0],
- Sel: ast.NewIdent("Addr()"),
- }
- }
- fixed = true
- })
-
- // Fix type switches.
- walk(f, func(n interface{}) {
- if reflectFixSwitch(n) {
- fixed = true
- }
- })
-
- // Fix type assertion checks (multiple assignment statements).
- // Have to work on the statement context (statement list or if statement)
- // so that we can insert an extra statement occasionally.
- // Ignoring for and switch because they don't come up in
- // typical code.
- walk(f, func(n interface{}) {
- switch n := n.(type) {
- case *[]ast.Stmt:
- // v is the replacement statement list.
- var v []ast.Stmt
- insert := func(x ast.Stmt) {
- v = append(v, x)
- }
- for i, x := range *n {
- // Tentatively append to v; if we rewrite x
- // we'll have to update the entry, so remember
- // the index.
- j := len(v)
- v = append(v, x)
- if reflectFixTypecheck(&x, insert, (*n)[i+1:]) {
- // reflectFixTypecheck may have overwritten x.
- // Update the entry we appended just before the call.
- v[j] = x
- fixed = true
- }
- }
- *n = v
- case *ast.IfStmt:
- x := &ast.ExprStmt{X: n.Cond}
- if reflectFixTypecheck(&n.Init, nil, []ast.Stmt{x, n.Body, n.Else}) {
- n.Cond = x.X
- fixed = true
- }
- }
- })
-
- // Warn about any typecheck statements that we missed.
- walk(f, reflectWarnTypecheckStmt)
-
- // Now that those are gone, fix remaining type assertions.
- // Delayed because the type checks have
- // type assertions as part of their syntax.
- walk(f, func(n interface{}) {
- if reflectFixAssert(n) {
- fixed = true
- }
- })
-
- // Now that the type assertions are gone, rewrite remaining
- // references to specific reflect types to use the general ones.
- walk(f, func(n interface{}) {
- ptr, ok := n.(*ast.Expr)
- if !ok {
- return
- }
- nn := *ptr
- typ := reflectType(nn)
- if typ == "" {
- return
- }
- if strings.HasSuffix(typ, "Type") {
- *ptr = newPkgDot(nn.Pos(), "reflect", "Type")
- } else {
- *ptr = newPkgDot(nn.Pos(), "reflect", "Value")
- }
- fixed = true
- })
-
- // Rewrite v.Set(nil) to v.Set(reflect.MakeZero(v.Type())).
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- if !ok || len(call.Args) != 1 || !isTopName(call.Args[0], "nil") {
- return
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok || !isReflectValue[typeof[sel.X]] || sel.Sel.Name != "Set" {
- return
- }
- call.Args[0] = &ast.CallExpr{
- Fun: newPkgDot(call.Args[0].Pos(), "reflect", "Zero"),
- Args: []ast.Expr{
- &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: sel.X,
- Sel: &ast.Ident{Name: "Type"},
- },
- },
- },
- }
- fixed = true
- })
-
- // Rewrite v != nil to v.IsValid().
- // Rewrite nil used as reflect.Value (in function argument or return) to reflect.Value{}.
- walk(f, func(n interface{}) {
- ptr, ok := n.(*ast.Expr)
- if !ok {
- return
- }
- if isTopName(*ptr, "nil") && isReflectValue[typeof[*ptr]] {
- *ptr = ast.NewIdent("reflect.Value{}")
- fixed = true
- return
- }
- nn, ok := (*ptr).(*ast.BinaryExpr)
- if !ok || (nn.Op != token.EQL && nn.Op != token.NEQ) || !isTopName(nn.Y, "nil") || !isReflectValue[typeof[nn.X]] {
- return
- }
- var call ast.Expr = &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: nn.X,
- Sel: &ast.Ident{Name: "IsValid"},
- },
- }
- if nn.Op == token.EQL {
- call = &ast.UnaryExpr{Op: token.NOT, X: call}
- }
- *ptr = call
- fixed = true
- })
-
- // Rewrite
- // reflect.Typeof -> reflect.TypeOf,
- walk(f, func(n interface{}) {
- sel, ok := n.(*ast.SelectorExpr)
- if !ok {
- return
- }
- if isTopName(sel.X, "reflect") && sel.Sel.Name == "Typeof" {
- sel.Sel.Name = "TypeOf"
- fixed = true
- }
- if isTopName(sel.X, "reflect") && sel.Sel.Name == "NewValue" {
- sel.Sel.Name = "ValueOf"
- fixed = true
- }
- })
-
- return fixed
-}
-
-// reflectFixSwitch rewrites *n (if n is an *ast.Stmt) corresponding
-// to a type switch.
-func reflectFixSwitch(n interface{}) bool {
- ptr, ok := n.(*ast.Stmt)
- if !ok {
- return false
- }
- n = *ptr
-
- ts, ok := n.(*ast.TypeSwitchStmt)
- if !ok {
- return false
- }
-
- // Are any switch cases referring to reflect types?
- // (That is, is this an old reflect type switch?)
- for _, cas := range ts.Body.List {
- for _, typ := range cas.(*ast.CaseClause).List {
- if reflectType(typ) != "" {
- goto haveReflect
- }
- }
- }
- return false
-
-haveReflect:
- // Now we know it's an old reflect type switch. Prepare the new version,
- // but don't replace or edit the original until we're sure of success.
-
- // Figure out the initializer statement, if any, and the receiver for the Kind call.
- var init ast.Stmt
- var rcvr ast.Expr
-
- init = ts.Init
- switch n := ts.Assign.(type) {
- default:
- warn(ts.Pos(), "unexpected form in type switch")
- return false
-
- case *ast.AssignStmt:
- as := n
- ta := as.Rhs[0].(*ast.TypeAssertExpr)
- x := isIdent(as.Lhs[0])
- z := isIdent(ta.X)
-
- if isBlank(x) || x != nil && z != nil && x.Name == z.Name && !assignsTo(x, ts.Body.List) {
- // Can drop the variable creation.
- rcvr = ta.X
- } else {
- // Need to use initialization statement.
- if init != nil {
- warn(ts.Pos(), "cannot rewrite reflect type switch with initializing statement")
- return false
- }
- init = &ast.AssignStmt{
- Lhs: []ast.Expr{as.Lhs[0]},
- TokPos: as.TokPos,
- Tok: token.DEFINE,
- Rhs: []ast.Expr{ta.X},
- }
- rcvr = as.Lhs[0]
- }
-
- case *ast.ExprStmt:
- rcvr = n.X.(*ast.TypeAssertExpr).X
- }
-
- // Prepare rewritten type switch (see large comment above for form).
- sw := &ast.SwitchStmt{
- Switch: ts.Switch,
- Init: init,
- Tag: &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: rcvr,
- Sel: &ast.Ident{
- NamePos: rcvr.End(),
- Name: "Kind",
- Obj: nil,
- },
- },
- Lparen: rcvr.End(),
- Rparen: rcvr.End(),
- },
- Body: &ast.BlockStmt{
- Lbrace: ts.Body.Lbrace,
- List: nil, // to be filled in
- Rbrace: ts.Body.Rbrace,
- },
- }
-
- // Translate cases.
- for _, tcas := range ts.Body.List {
- tcas := tcas.(*ast.CaseClause)
- cas := &ast.CaseClause{
- Case: tcas.Case,
- Colon: tcas.Colon,
- Body: tcas.Body,
- }
- for _, t := range tcas.List {
- if isTopName(t, "nil") {
- cas.List = append(cas.List, newPkgDot(t.Pos(), "reflect", "Invalid"))
- continue
- }
-
- typ := reflectType(t)
- if typ == "" {
- warn(t.Pos(), "cannot rewrite reflect type switch case with non-reflect type %s", gofmt(t))
- cas.List = append(cas.List, t)
- continue
- }
-
- for _, k := range reflectKind[typ] {
- cas.List = append(cas.List, newPkgDot(t.Pos(), "reflect", k))
- }
- }
- sw.Body.List = append(sw.Body.List, cas)
- }
-
- // Everything worked. Rewrite AST.
- *ptr = sw
- return true
-}
-
-// Rewrite x, y = z.(T) into
-// x = z
-// y = x.Kind() == K
-// as described in the long comment above.
-//
-// If insert != nil, it can be called to insert a statement after *ptr in its block.
-// If insert == nil, insertion is not possible.
-// At most one call to insert is allowed.
-//
-// Scope gives the statements for which a declaration
-// in *ptr would be in scope.
-//
-// The result is true of the statement was rewritten.
-//
-func reflectFixTypecheck(ptr *ast.Stmt, insert func(ast.Stmt), scope []ast.Stmt) bool {
- st := *ptr
- as, ok := st.(*ast.AssignStmt)
- if !ok || len(as.Lhs) != 2 || len(as.Rhs) != 1 {
- return false
- }
-
- ta, ok := as.Rhs[0].(*ast.TypeAssertExpr)
- if !ok {
- return false
- }
- typ := reflectType(ta.Type)
- if typ == "" {
- return false
- }
-
- // Have x, y := z.(t).
- x := isIdent(as.Lhs[0])
- y := isIdent(as.Lhs[1])
- z := isIdent(ta.X)
-
- // First step is x := z, unless it's x := x and the resulting x is never reassigned.
- // rcvr is the x in x.Kind().
- var rcvr ast.Expr
- if isBlank(x) ||
- as.Tok == token.DEFINE && x != nil && z != nil && x.Name == z.Name && !assignsTo(x, scope) {
- // Can drop the statement.
- // If we need to insert a statement later, now we have a slot.
- *ptr = &ast.EmptyStmt{}
- insert = func(x ast.Stmt) { *ptr = x }
- rcvr = ta.X
- } else {
- *ptr = &ast.AssignStmt{
- Lhs: []ast.Expr{as.Lhs[0]},
- TokPos: as.TokPos,
- Tok: as.Tok,
- Rhs: []ast.Expr{ta.X},
- }
- rcvr = as.Lhs[0]
- }
-
- // Prepare x.Kind() == T expression appropriate to t.
- // If x is not a simple identifier, warn that we might be
- // reevaluating x.
- if x == nil {
- warn(as.Pos(), "rewrite reevaluates expr with possible side effects: %s", gofmt(as.Lhs[0]))
- }
- yExpr, yNotExpr := reflectKindEq(rcvr, reflectKind[typ])
-
- // Second step is y := x.Kind() == T, unless it's only used once
- // or we have no way to insert that statement.
- var yStmt *ast.AssignStmt
- if as.Tok == token.DEFINE && countUses(y, scope) <= 1 || insert == nil {
- // Can drop the statement and use the expression directly.
- rewriteUses(y,
- func(token.Pos) ast.Expr { return yExpr },
- func(token.Pos) ast.Expr { return yNotExpr },
- scope)
- } else {
- yStmt = &ast.AssignStmt{
- Lhs: []ast.Expr{as.Lhs[1]},
- TokPos: as.End(),
- Tok: as.Tok,
- Rhs: []ast.Expr{yExpr},
- }
- insert(yStmt)
- }
- return true
-}
-
-// reflectKindEq returns the expression z.Kind() == kinds[0] || z.Kind() == kinds[1] || ...
-// and its negation.
-// The qualifier "reflect." is inserted before each kinds[i] expression.
-func reflectKindEq(z ast.Expr, kinds []string) (ast.Expr, ast.Expr) {
- n := len(kinds)
- if n == 1 {
- y := &ast.BinaryExpr{
- X: &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: z,
- Sel: ast.NewIdent("Kind"),
- },
- },
- Op: token.EQL,
- Y: newPkgDot(token.NoPos, "reflect", kinds[0]),
- }
- ynot := &ast.BinaryExpr{
- X: &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: z,
- Sel: ast.NewIdent("Kind"),
- },
- },
- Op: token.NEQ,
- Y: newPkgDot(token.NoPos, "reflect", kinds[0]),
- }
- return y, ynot
- }
-
- x, xnot := reflectKindEq(z, kinds[0:n-1])
- y, ynot := reflectKindEq(z, kinds[n-1:])
-
- or := &ast.BinaryExpr{
- X: x,
- Op: token.LOR,
- Y: y,
- }
- andnot := &ast.BinaryExpr{
- X: xnot,
- Op: token.LAND,
- Y: ynot,
- }
- return or, andnot
-}
-
-// if x represents a known old reflect type/value like *reflect.PtrType or reflect.ArrayOrSliceValue,
-// reflectType returns the string form of that type.
-func reflectType(x ast.Expr) string {
- ptr, ok := x.(*ast.StarExpr)
- if ok {
- x = ptr.X
- }
-
- sel, ok := x.(*ast.SelectorExpr)
- if !ok || !isName(sel.X, "reflect") {
- return ""
- }
-
- var s = "reflect."
- if ptr != nil {
- s = "*reflect."
- }
- s += sel.Sel.Name
-
- if reflectKind[s] != nil {
- return s
- }
- return ""
-}
-
-// reflectWarnTypecheckStmt warns about statements
-// of the form x, y = z.(T) for any old reflect type T.
-// The last pass should have gotten them all, and if it didn't,
-// the next pass is going to turn them into x, y = z.
-func reflectWarnTypecheckStmt(n interface{}) {
- as, ok := n.(*ast.AssignStmt)
- if !ok || len(as.Lhs) != 2 || len(as.Rhs) != 1 {
- return
- }
- ta, ok := as.Rhs[0].(*ast.TypeAssertExpr)
- if !ok || reflectType(ta.Type) == "" {
- return
- }
- warn(n.(ast.Node).Pos(), "unfixed reflect type check")
-}
-
-// reflectFixAssert rewrites x.(T) to x for any old reflect type T.
-func reflectFixAssert(n interface{}) bool {
- ptr, ok := n.(*ast.Expr)
- if ok {
- ta, ok := (*ptr).(*ast.TypeAssertExpr)
- if ok && reflectType(ta.Type) != "" {
- *ptr = ta.X
- return true
- }
- }
- return false
-}
-
-// Tables describing the transformations.
-
-// Description of old reflect API for partial type checking.
-// We pretend the Elem method is on Type and Value instead
-// of enumerating all the types it is actually on.
-// Also, we pretend that ArrayType etc embeds Type for the
-// purposes of describing the API. (In fact they embed commonType,
-// which implements Type.)
-var reflectTypeConfig = &TypeConfig{
- Type: map[string]*Type{
- "reflect.ArrayOrSliceType": {Embed: []string{"reflect.Type"}},
- "reflect.ArrayOrSliceValue": {Embed: []string{"reflect.Value"}},
- "reflect.ArrayType": {Embed: []string{"reflect.Type"}},
- "reflect.ArrayValue": {Embed: []string{"reflect.Value"}},
- "reflect.BoolType": {Embed: []string{"reflect.Type"}},
- "reflect.BoolValue": {Embed: []string{"reflect.Value"}},
- "reflect.ChanType": {Embed: []string{"reflect.Type"}},
- "reflect.ChanValue": {
- Method: map[string]string{
- "Recv": "func() (reflect.Value, bool)",
- "TryRecv": "func() (reflect.Value, bool)",
- },
- Embed: []string{"reflect.Value"},
- },
- "reflect.ComplexType": {Embed: []string{"reflect.Type"}},
- "reflect.ComplexValue": {Embed: []string{"reflect.Value"}},
- "reflect.FloatType": {Embed: []string{"reflect.Type"}},
- "reflect.FloatValue": {Embed: []string{"reflect.Value"}},
- "reflect.FuncType": {
- Method: map[string]string{
- "In": "func(int) reflect.Type",
- "Out": "func(int) reflect.Type",
- },
- Embed: []string{"reflect.Type"},
- },
- "reflect.FuncValue": {
- Method: map[string]string{
- "Call": "func([]reflect.Value) []reflect.Value",
- },
- },
- "reflect.IntType": {Embed: []string{"reflect.Type"}},
- "reflect.IntValue": {Embed: []string{"reflect.Value"}},
- "reflect.InterfaceType": {Embed: []string{"reflect.Type"}},
- "reflect.InterfaceValue": {Embed: []string{"reflect.Value"}},
- "reflect.MapType": {
- Method: map[string]string{
- "Key": "func() reflect.Type",
- },
- Embed: []string{"reflect.Type"},
- },
- "reflect.MapValue": {
- Method: map[string]string{
- "Keys": "func() []reflect.Value",
- },
- Embed: []string{"reflect.Value"},
- },
- "reflect.Method": {
- Field: map[string]string{
- "Type": "*reflect.FuncType",
- "Func": "*reflect.FuncValue",
- },
- },
- "reflect.PtrType": {Embed: []string{"reflect.Type"}},
- "reflect.PtrValue": {Embed: []string{"reflect.Value"}},
- "reflect.SliceType": {Embed: []string{"reflect.Type"}},
- "reflect.SliceValue": {
- Method: map[string]string{
- "Slice": "func(int, int) *reflect.SliceValue",
- },
- Embed: []string{"reflect.Value"},
- },
- "reflect.StringType": {Embed: []string{"reflect.Type"}},
- "reflect.StringValue": {Embed: []string{"reflect.Value"}},
- "reflect.StructField": {
- Field: map[string]string{
- "Type": "reflect.Type",
- },
- },
- "reflect.StructType": {
- Method: map[string]string{
- "Field": "func() reflect.StructField",
- "FieldByIndex": "func() reflect.StructField",
- "FieldByName": "func() reflect.StructField,bool",
- "FieldByNameFunc": "func() reflect.StructField,bool",
- },
- Embed: []string{"reflect.Type"},
- },
- "reflect.StructValue": {
- Method: map[string]string{
- "Field": "func() reflect.Value",
- "FieldByIndex": "func() reflect.Value",
- "FieldByName": "func() reflect.Value",
- "FieldByNameFunc": "func() reflect.Value",
- },
- Embed: []string{"reflect.Value"},
- },
- "reflect.Type": {
- Method: map[string]string{
- "Elem": "func() reflect.Type",
- "Method": "func() reflect.Method",
- },
- },
- "reflect.UintType": {Embed: []string{"reflect.Type"}},
- "reflect.UintValue": {Embed: []string{"reflect.Value"}},
- "reflect.UnsafePointerType": {Embed: []string{"reflect.Type"}},
- "reflect.UnsafePointerValue": {Embed: []string{"reflect.Value"}},
- "reflect.Value": {
- Method: map[string]string{
- "Addr": "func() *reflect.PtrValue",
- "Elem": "func() reflect.Value",
- "Method": "func() *reflect.FuncValue",
- "SetValue": "func(reflect.Value)",
- },
- },
- },
- Func: map[string]string{
- "reflect.Append": "*reflect.SliceValue",
- "reflect.AppendSlice": "*reflect.SliceValue",
- "reflect.Indirect": "reflect.Value",
- "reflect.MakeSlice": "*reflect.SliceValue",
- "reflect.MakeChan": "*reflect.ChanValue",
- "reflect.MakeMap": "*reflect.MapValue",
- "reflect.MakeZero": "reflect.Value",
- "reflect.NewValue": "reflect.Value",
- "reflect.PtrTo": "*reflect.PtrType",
- "reflect.Typeof": "reflect.Type",
- },
-}
-
-var reflectRewriteMethod = map[string]map[string]string{
- // The type API didn't change much.
- "*reflect.ChanType": {"Dir": "ChanDir"},
- "*reflect.FuncType": {"DotDotDot": "IsVariadic"},
-
- // The value API has longer names to disambiguate
- // methods with different signatures.
- "reflect.ArrayOrSliceValue": { // interface, not pointer
- "Elem": "Index",
- },
- "*reflect.ArrayValue": {
- "Elem": "Index",
- },
- "*reflect.BoolValue": {
- "Get": "Bool",
- "Set": "SetBool",
- },
- "*reflect.ChanValue": {
- "Get": "Pointer",
- },
- "*reflect.ComplexValue": {
- "Get": "Complex",
- "Set": "SetComplex",
- "Overflow": "OverflowComplex",
- },
- "*reflect.FloatValue": {
- "Get": "Float",
- "Set": "SetFloat",
- "Overflow": "OverflowFloat",
- },
- "*reflect.FuncValue": {
- "Get": "Pointer",
- },
- "*reflect.IntValue": {
- "Get": "Int",
- "Set": "SetInt",
- "Overflow": "OverflowInt",
- },
- "*reflect.InterfaceValue": {
- "Get": "InterfaceData",
- },
- "*reflect.MapValue": {
- "Elem": "MapIndex",
- "Get": "Pointer",
- "Keys": "MapKeys",
- "SetElem": "SetMapIndex",
- },
- "*reflect.PtrValue": {
- "Get": "Pointer",
- },
- "*reflect.SliceValue": {
- "Elem": "Index",
- "Get": "Pointer",
- },
- "*reflect.StringValue": {
- "Get": "String",
- "Set": "SetString",
- },
- "*reflect.UintValue": {
- "Get": "Uint",
- "Set": "SetUint",
- "Overflow": "OverflowUint",
- },
- "*reflect.UnsafePointerValue": {
- "Get": "Pointer",
- "Set": "SetPointer",
- },
-}
-
-var reflectKind = map[string][]string{
- "reflect.ArrayOrSliceType": {"Array", "Slice"}, // interface, not pointer
- "*reflect.ArrayType": {"Array"},
- "*reflect.BoolType": {"Bool"},
- "*reflect.ChanType": {"Chan"},
- "*reflect.ComplexType": {"Complex64", "Complex128"},
- "*reflect.FloatType": {"Float32", "Float64"},
- "*reflect.FuncType": {"Func"},
- "*reflect.IntType": {"Int", "Int8", "Int16", "Int32", "Int64"},
- "*reflect.InterfaceType": {"Interface"},
- "*reflect.MapType": {"Map"},
- "*reflect.PtrType": {"Ptr"},
- "*reflect.SliceType": {"Slice"},
- "*reflect.StringType": {"String"},
- "*reflect.StructType": {"Struct"},
- "*reflect.UintType": {"Uint", "Uint8", "Uint16", "Uint32", "Uint64", "Uintptr"},
- "*reflect.UnsafePointerType": {"UnsafePointer"},
-
- "reflect.ArrayOrSliceValue": {"Array", "Slice"}, // interface, not pointer
- "*reflect.ArrayValue": {"Array"},
- "*reflect.BoolValue": {"Bool"},
- "*reflect.ChanValue": {"Chan"},
- "*reflect.ComplexValue": {"Complex64", "Complex128"},
- "*reflect.FloatValue": {"Float32", "Float64"},
- "*reflect.FuncValue": {"Func"},
- "*reflect.IntValue": {"Int", "Int8", "Int16", "Int32", "Int64"},
- "*reflect.InterfaceValue": {"Interface"},
- "*reflect.MapValue": {"Map"},
- "*reflect.PtrValue": {"Ptr"},
- "*reflect.SliceValue": {"Slice"},
- "*reflect.StringValue": {"String"},
- "*reflect.StructValue": {"Struct"},
- "*reflect.UintValue": {"Uint", "Uint8", "Uint16", "Uint32", "Uint64", "Uintptr"},
- "*reflect.UnsafePointerValue": {"UnsafePointer"},
-}
-
-var isReflectValue = map[string]bool{
- "reflect.ArrayOrSliceValue": true, // interface, not pointer
- "*reflect.ArrayValue": true,
- "*reflect.BoolValue": true,
- "*reflect.ChanValue": true,
- "*reflect.ComplexValue": true,
- "*reflect.FloatValue": true,
- "*reflect.FuncValue": true,
- "*reflect.IntValue": true,
- "*reflect.InterfaceValue": true,
- "*reflect.MapValue": true,
- "*reflect.PtrValue": true,
- "*reflect.SliceValue": true,
- "*reflect.StringValue": true,
- "*reflect.StructValue": true,
- "*reflect.UintValue": true,
- "*reflect.UnsafePointerValue": true,
- "reflect.Value": true, // interface, not pointer
-}
diff --git a/src/cmd/fix/reflect_test.go b/src/cmd/fix/reflect_test.go
deleted file mode 100644
index a62027eb4b..0000000000
--- a/src/cmd/fix/reflect_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file
-
-// Too slow under race detector.
-// +build !race
-
-package main
-
-import (
- "io/ioutil"
- "log"
- "path/filepath"
-)
-
-func init() {
- addTestCases(reflectTests(), reflectFn)
-}
-
-func reflectTests() []testCase {
- var tests []testCase
-
- names, _ := filepath.Glob("testdata/reflect.*.in")
- for _, in := range names {
- out := in[:len(in)-len(".in")] + ".out"
- inb, err := ioutil.ReadFile(in)
- if err != nil {
- log.Fatal(err)
- }
- outb, err := ioutil.ReadFile(out)
- if err != nil {
- log.Fatal(err)
- }
- tests = append(tests, testCase{Name: in, In: string(inb), Out: string(outb)})
- }
-
- return tests
-}
diff --git a/src/cmd/fix/signal.go b/src/cmd/fix/signal.go
deleted file mode 100644
index 5a583d41e9..0000000000
--- a/src/cmd/fix/signal.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "strings"
-)
-
-func init() {
- register(signalFix)
-}
-
-var signalFix = fix{
- "signal",
- "2011-06-29",
- signal,
- `Adapt code to types moved from os/signal to signal.
-
-http://codereview.appspot.com/4437091
-`,
-}
-
-func signal(f *ast.File) (fixed bool) {
- if !imports(f, "os/signal") {
- return
- }
-
- walk(f, func(n interface{}) {
- s, ok := n.(*ast.SelectorExpr)
-
- if !ok || !isTopName(s.X, "signal") {
- return
- }
-
- sel := s.Sel.String()
- if sel == "Signal" || sel == "UnixSignal" || strings.HasPrefix(sel, "SIG") {
- addImport(f, "os")
- s.X = &ast.Ident{Name: "os"}
- fixed = true
- }
- })
-
- if fixed && !usesImport(f, "os/signal") {
- deleteImport(f, "os/signal")
- }
- return
-}
diff --git a/src/cmd/fix/signal_test.go b/src/cmd/fix/signal_test.go
deleted file mode 100644
index 7bca7d5c4d..0000000000
--- a/src/cmd/fix/signal_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(signalTests, signal)
-}
-
-var signalTests = []testCase{
- {
- Name: "signal.0",
- In: `package main
-
-import (
- _ "a"
- "os/signal"
- _ "z"
-)
-
-type T1 signal.UnixSignal
-type T2 signal.Signal
-
-func f() {
- _ = signal.SIGHUP
- _ = signal.Incoming
-}
-`,
- Out: `package main
-
-import (
- _ "a"
- "os"
- "os/signal"
- _ "z"
-)
-
-type T1 os.UnixSignal
-type T2 os.Signal
-
-func f() {
- _ = os.SIGHUP
- _ = signal.Incoming
-}
-`,
- },
- {
- Name: "signal.1",
- In: `package main
-
-import (
- "os"
- "os/signal"
-)
-
-func f() {
- var _ os.Error
- _ = signal.SIGHUP
-}
-`,
- Out: `package main
-
-import "os"
-
-func f() {
- var _ os.Error
- _ = os.SIGHUP
-}
-`,
- },
- {
- Name: "signal.2",
- In: `package main
-
-import "os"
-import "os/signal"
-
-func f() {
- var _ os.Error
- _ = signal.SIGHUP
-}
-`,
- Out: `package main
-
-import "os"
-
-func f() {
- var _ os.Error
- _ = os.SIGHUP
-}
-`,
- },
-}
diff --git a/src/cmd/fix/sorthelpers.go b/src/cmd/fix/sorthelpers.go
deleted file mode 100644
index fa549313eb..0000000000
--- a/src/cmd/fix/sorthelpers.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(sorthelpersFix)
-}
-
-var sorthelpersFix = fix{
- "sorthelpers",
- "2011-07-08",
- sorthelpers,
- `Adapt code from sort.Sort[Ints|Float64s|Strings] to sort.[Ints|Float64s|Strings].
-`,
-}
-
-func sorthelpers(f *ast.File) (fixed bool) {
- if !imports(f, "sort") {
- return
- }
-
- walk(f, func(n interface{}) {
- s, ok := n.(*ast.SelectorExpr)
- if !ok || !isTopName(s.X, "sort") {
- return
- }
-
- switch s.Sel.String() {
- case "SortFloat64s":
- s.Sel.Name = "Float64s"
- case "SortInts":
- s.Sel.Name = "Ints"
- case "SortStrings":
- s.Sel.Name = "Strings"
- default:
- return
- }
-
- fixed = true
- })
-
- return
-}
diff --git a/src/cmd/fix/sorthelpers_test.go b/src/cmd/fix/sorthelpers_test.go
deleted file mode 100644
index dd6b58e033..0000000000
--- a/src/cmd/fix/sorthelpers_test.go
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(sorthelpersTests, sorthelpers)
-}
-
-var sorthelpersTests = []testCase{
- {
- Name: "sortslice.0",
- In: `package main
-
-import (
- "sort"
-)
-
-func main() {
- var s []string
- sort.SortStrings(s)
- var i []ints
- sort.SortInts(i)
- var f []float64
- sort.SortFloat64s(f)
-}
-`,
- Out: `package main
-
-import (
- "sort"
-)
-
-func main() {
- var s []string
- sort.Strings(s)
- var i []ints
- sort.Ints(i)
- var f []float64
- sort.Float64s(f)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/sortslice.go b/src/cmd/fix/sortslice.go
deleted file mode 100644
index 89267b847e..0000000000
--- a/src/cmd/fix/sortslice.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(sortsliceFix)
-}
-
-var sortsliceFix = fix{
- "sortslice",
- "2011-06-26",
- sortslice,
- `Adapt code from sort.[Float64|Int|String]Array to sort.[Float64|Int|String]Slice.
-
-http://codereview.appspot.com/4602054
-http://codereview.appspot.com/4639041
-`,
-}
-
-func sortslice(f *ast.File) (fixed bool) {
- if !imports(f, "sort") {
- return
- }
-
- walk(f, func(n interface{}) {
- s, ok := n.(*ast.SelectorExpr)
- if !ok || !isTopName(s.X, "sort") {
- return
- }
-
- switch s.Sel.String() {
- case "Float64Array":
- s.Sel.Name = "Float64Slice"
- case "IntArray":
- s.Sel.Name = "IntSlice"
- case "StringArray":
- s.Sel.Name = "StringSlice"
- default:
- return
- }
-
- fixed = true
- })
-
- return
-}
diff --git a/src/cmd/fix/sortslice_test.go b/src/cmd/fix/sortslice_test.go
deleted file mode 100644
index 7b745a2320..0000000000
--- a/src/cmd/fix/sortslice_test.go
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(sortsliceTests, sortslice)
-}
-
-var sortsliceTests = []testCase{
- {
- Name: "sortslice.0",
- In: `package main
-
-import (
- "sort"
-)
-
-var _ = sort.Float64Array
-var _ = sort.IntArray
-var _ = sort.StringArray
-`,
- Out: `package main
-
-import (
- "sort"
-)
-
-var _ = sort.Float64Slice
-var _ = sort.IntSlice
-var _ = sort.StringSlice
-`,
- },
-}
diff --git a/src/cmd/fix/strconv.go b/src/cmd/fix/strconv.go
deleted file mode 100644
index 6cd69020b2..0000000000
--- a/src/cmd/fix/strconv.go
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "go/ast"
-
-func init() {
- register(strconvFix)
-}
-
-var strconvFix = fix{
- "strconv",
- "2011-12-01",
- strconvFn,
- `Convert to new strconv API.
-
-http://codereview.appspot.com/5434095
-http://codereview.appspot.com/5434069
-`,
-}
-
-func strconvFn(f *ast.File) bool {
- if !imports(f, "strconv") {
- return false
- }
-
- fixed := false
-
- walk(f, func(n interface{}) {
- // Rename functions.
- call, ok := n.(*ast.CallExpr)
- if !ok || len(call.Args) < 1 {
- return
- }
- sel, ok := call.Fun.(*ast.SelectorExpr)
- if !ok || !isTopName(sel.X, "strconv") {
- return
- }
- change := func(name string) {
- fixed = true
- sel.Sel.Name = name
- }
- add := func(s string) {
- call.Args = append(call.Args, expr(s))
- }
- switch sel.Sel.Name {
- case "Atob":
- change("ParseBool")
- case "Atof32":
- change("ParseFloat")
- add("32") // bitSize
- warn(call.Pos(), "rewrote strconv.Atof32(_) to strconv.ParseFloat(_, 32) but return value must be converted to float32")
- case "Atof64":
- change("ParseFloat")
- add("64") // bitSize
- case "AtofN":
- change("ParseFloat")
- case "Atoi":
- // Atoi stayed as a convenience wrapper.
- case "Atoi64":
- change("ParseInt")
- add("10") // base
- add("64") // bitSize
- case "Atoui":
- change("ParseUint")
- add("10") // base
- add("0") // bitSize
- warn(call.Pos(), "rewrote strconv.Atoui(_) to strconv.ParseUint(_, 10, 0) but return value must be converted to uint")
- case "Atoui64":
- change("ParseUint")
- add("10") // base
- add("64") // bitSize
- case "Btoa":
- change("FormatBool")
- case "Btoi64":
- change("ParseInt")
- add("64") // bitSize
- case "Btoui64":
- change("ParseUint")
- add("64") // bitSize
- case "Ftoa32":
- change("FormatFloat")
- call.Args[0] = strconvRewrite("float32", "float64", call.Args[0])
- add("32") // bitSize
- case "Ftoa64":
- change("FormatFloat")
- add("64") // bitSize
- case "FtoaN":
- change("FormatFloat")
- case "Itoa":
- // Itoa stayed as a convenience wrapper.
- case "Itoa64":
- change("FormatInt")
- add("10") // base
- case "Itob":
- change("FormatInt")
- call.Args[0] = strconvRewrite("int", "int64", call.Args[0])
- case "Itob64":
- change("FormatInt")
- case "Uitoa":
- change("FormatUint")
- call.Args[0] = strconvRewrite("uint", "uint64", call.Args[0])
- add("10") // base
- case "Uitoa64":
- change("FormatUint")
- add("10") // base
- case "Uitob":
- change("FormatUint")
- call.Args[0] = strconvRewrite("uint", "uint64", call.Args[0])
- case "Uitob64":
- change("FormatUint")
- }
- })
- return fixed
-}
-
-// rewrite from type t1 to type t2
-// If the expression x is of the form t1(_), use t2(_). Otherwise use t2(x).
-func strconvRewrite(t1, t2 string, x ast.Expr) ast.Expr {
- if call, ok := x.(*ast.CallExpr); ok && isTopName(call.Fun, t1) {
- call.Fun.(*ast.Ident).Name = t2
- return x
- }
- return &ast.CallExpr{Fun: ast.NewIdent(t2), Args: []ast.Expr{x}}
-}
diff --git a/src/cmd/fix/strconv_test.go b/src/cmd/fix/strconv_test.go
deleted file mode 100644
index 7fbd4e42eb..0000000000
--- a/src/cmd/fix/strconv_test.go
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(strconvTests, strconvFn)
-}
-
-var strconvTests = []testCase{
- {
- Name: "strconv.0",
- In: `package main
-
-import "strconv"
-
-func f() {
- foo.Atob("abc")
-
- strconv.Atob("true")
- strconv.Btoa(false)
-
- strconv.Atof32("1.2")
- strconv.Atof64("1.2")
- strconv.AtofN("1.2", 64)
- strconv.Ftoa32(1.2, 'g', 17)
- strconv.Ftoa64(1.2, 'g', 17)
- strconv.FtoaN(1.2, 'g', 17, 64)
-
- strconv.Atoi("3")
- strconv.Atoi64("3")
- strconv.Btoi64("1234", 5)
-
- strconv.Atoui("3")
- strconv.Atoui64("3")
- strconv.Btoui64("1234", 5)
-
- strconv.Itoa(123)
- strconv.Itoa64(1234)
- strconv.Itob(123, 5)
- strconv.Itob64(1234, 5)
-
- strconv.Uitoa(123)
- strconv.Uitoa64(1234)
- strconv.Uitob(123, 5)
- strconv.Uitob64(1234, 5)
-
- strconv.Uitoa(uint(x))
- strconv.Uitoa(f(x))
-}
-`,
- Out: `package main
-
-import "strconv"
-
-func f() {
- foo.Atob("abc")
-
- strconv.ParseBool("true")
- strconv.FormatBool(false)
-
- strconv.ParseFloat("1.2", 32)
- strconv.ParseFloat("1.2", 64)
- strconv.ParseFloat("1.2", 64)
- strconv.FormatFloat(float64(1.2), 'g', 17, 32)
- strconv.FormatFloat(1.2, 'g', 17, 64)
- strconv.FormatFloat(1.2, 'g', 17, 64)
-
- strconv.Atoi("3")
- strconv.ParseInt("3", 10, 64)
- strconv.ParseInt("1234", 5, 64)
-
- strconv.ParseUint("3", 10, 0)
- strconv.ParseUint("3", 10, 64)
- strconv.ParseUint("1234", 5, 64)
-
- strconv.Itoa(123)
- strconv.FormatInt(1234, 10)
- strconv.FormatInt(int64(123), 5)
- strconv.FormatInt(1234, 5)
-
- strconv.FormatUint(uint64(123), 10)
- strconv.FormatUint(1234, 10)
- strconv.FormatUint(uint64(123), 5)
- strconv.FormatUint(1234, 5)
-
- strconv.FormatUint(uint64(x), 10)
- strconv.FormatUint(uint64(f(x)), 10)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/stringssplit.go b/src/cmd/fix/stringssplit.go
deleted file mode 100644
index d89ecf039c..0000000000
--- a/src/cmd/fix/stringssplit.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "go/token"
-)
-
-func init() {
- register(stringssplitFix)
-}
-
-var stringssplitFix = fix{
- "stringssplit",
- "2011-06-28",
- stringssplit,
- `Restore strings.Split to its original meaning and add strings.SplitN. Bytes too.
-
-http://codereview.appspot.com/4661051
-`,
-}
-
-func stringssplit(f *ast.File) bool {
- if !imports(f, "bytes") && !imports(f, "strings") {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- call, ok := n.(*ast.CallExpr)
- // func Split(s, sep string, n int) []string
- // func SplitAfter(s, sep string, n int) []string
- if !ok || len(call.Args) != 3 {
- return
- }
- // Is this our function?
- switch {
- case isPkgDot(call.Fun, "bytes", "Split"):
- case isPkgDot(call.Fun, "bytes", "SplitAfter"):
- case isPkgDot(call.Fun, "strings", "Split"):
- case isPkgDot(call.Fun, "strings", "SplitAfter"):
- default:
- return
- }
-
- sel := call.Fun.(*ast.SelectorExpr)
- args := call.Args
- fixed = true // We're committed.
-
- // Is the last argument -1? If so, drop the arg.
- // (Actually we just look for a negative integer literal.)
- // Otherwise, Split->SplitN and keep the arg.
- final := args[2]
- if unary, ok := final.(*ast.UnaryExpr); ok && unary.Op == token.SUB {
- if lit, ok := unary.X.(*ast.BasicLit); ok {
- // Is it an integer? If so, it's a negative integer and that's what we're after.
- if lit.Kind == token.INT {
- // drop the last arg.
- call.Args = args[0:2]
- return
- }
- }
- }
-
- // If not, rename and keep the argument list.
- sel.Sel.Name += "N"
- })
- return fixed
-}
diff --git a/src/cmd/fix/stringssplit_test.go b/src/cmd/fix/stringssplit_test.go
deleted file mode 100644
index fa42b1bea9..0000000000
--- a/src/cmd/fix/stringssplit_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(stringssplitTests, stringssplit)
-}
-
-var stringssplitTests = []testCase{
- {
- Name: "stringssplit.0",
- In: `package main
-
-import (
- "bytes"
- "strings"
-)
-
-func f() {
- bytes.Split(a, b, c)
- bytes.Split(a, b, -1)
- bytes.SplitAfter(a, b, c)
- bytes.SplitAfter(a, b, -1)
- strings.Split(a, b, c)
- strings.Split(a, b, -1)
- strings.SplitAfter(a, b, c)
- strings.SplitAfter(a, b, -1)
-}
-`,
- Out: `package main
-
-import (
- "bytes"
- "strings"
-)
-
-func f() {
- bytes.SplitN(a, b, c)
- bytes.Split(a, b)
- bytes.SplitAfterN(a, b, c)
- bytes.SplitAfter(a, b)
- strings.SplitN(a, b, c)
- strings.Split(a, b)
- strings.SplitAfterN(a, b, c)
- strings.SplitAfter(a, b)
-}
-`,
- },
-}
diff --git a/src/cmd/fix/template.go b/src/cmd/fix/template.go
deleted file mode 100644
index a3dd1440bc..0000000000
--- a/src/cmd/fix/template.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(templateFix)
-}
-
-var templateFix = fix{
- "template",
- "2011-11-22",
- template,
- `Rewrite calls to template.ParseFile to template.ParseFiles
-
-http://codereview.appspot.com/5433048
-`,
-}
-
-var templateSetGlobals = []string{
- "ParseSetFiles",
- "ParseSetGlob",
- "ParseTemplateFiles",
- "ParseTemplateGlob",
- "Set",
- "SetMust",
-}
-
-var templateSetMethods = []string{
- "ParseSetFiles",
- "ParseSetGlob",
- "ParseTemplateFiles",
- "ParseTemplateGlob",
-}
-
-var templateTypeConfig = &TypeConfig{
- Type: map[string]*Type{
- "template.Template": {
- Method: map[string]string{
- "Funcs": "func() *template.Template",
- "Delims": "func() *template.Template",
- "Parse": "func() (*template.Template, error)",
- "ParseFile": "func() (*template.Template, error)",
- "ParseInSet": "func() (*template.Template, error)",
- },
- },
- "template.Set": {
- Method: map[string]string{
- "ParseSetFiles": "func() (*template.Set, error)",
- "ParseSetGlob": "func() (*template.Set, error)",
- "ParseTemplateFiles": "func() (*template.Set, error)",
- "ParseTemplateGlob": "func() (*template.Set, error)",
- },
- },
- },
-
- Func: map[string]string{
- "template.New": "*template.Template",
- "template.Must": "(*template.Template, error)",
- "template.SetMust": "(*template.Set, error)",
- },
-}
-
-func template(f *ast.File) bool {
- if !imports(f, "text/template") && !imports(f, "html/template") {
- return false
- }
-
- fixed := false
-
- typeof, _ := typecheck(templateTypeConfig, f)
-
- // Now update the names used by importers.
- walk(f, func(n interface{}) {
- if sel, ok := n.(*ast.SelectorExpr); ok {
- // Reference to top-level function ParseFile.
- if isPkgDot(sel, "template", "ParseFile") {
- sel.Sel.Name = "ParseFiles"
- fixed = true
- return
- }
- // Reference to ParseFiles method.
- if typeof[sel.X] == "*template.Template" && sel.Sel.Name == "ParseFile" {
- sel.Sel.Name = "ParseFiles"
- fixed = true
- return
- }
- // The Set type and its functions are now gone.
- for _, name := range templateSetGlobals {
- if isPkgDot(sel, "template", name) {
- warn(sel.Pos(), "reference to template.%s must be fixed manually", name)
- return
- }
- }
- // The methods of Set are now gone.
- for _, name := range templateSetMethods {
- if typeof[sel.X] == "*template.Set" && sel.Sel.Name == name {
- warn(sel.Pos(), "reference to template.*Set.%s must be fixed manually", name)
- return
- }
- }
- }
- })
-
- return fixed
-}
diff --git a/src/cmd/fix/template_test.go b/src/cmd/fix/template_test.go
deleted file mode 100644
index f713a2901e..0000000000
--- a/src/cmd/fix/template_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(templateTests, template)
-}
-
-var templateTests = []testCase{
- {
- Name: "template.0",
- In: `package main
-
-import (
- "text/template"
-)
-
-func f() {
- template.ParseFile(a)
- var t template.Template
- x, y := template.ParseFile()
- template.New("x").Funcs(m).ParseFile(a) // chained method
- // Output should complain about these as functions or methods.
- var s *template.Set
- s.ParseSetFiles(a)
- template.ParseSetGlob(a)
- s.ParseTemplateFiles(a)
- template.ParseTemplateGlob(a)
- x := template.SetMust(a())
-}
-`,
- Out: `package main
-
-import (
- "text/template"
-)
-
-func f() {
- template.ParseFiles(a)
- var t template.Template
- x, y := template.ParseFiles()
- template.New("x").Funcs(m).ParseFiles(a) // chained method
- // Output should complain about these as functions or methods.
- var s *template.Set
- s.ParseSetFiles(a)
- template.ParseSetGlob(a)
- s.ParseTemplateFiles(a)
- template.ParseTemplateGlob(a)
- x := template.SetMust(a())
-}
-`,
- },
-}
diff --git a/src/cmd/fix/timefileinfo.go b/src/cmd/fix/timefileinfo.go
deleted file mode 100644
index b2ea23d8f9..0000000000
--- a/src/cmd/fix/timefileinfo.go
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
- "go/token"
- "strings"
-)
-
-func init() {
- register(timefileinfoFix)
-}
-
-var timefileinfoFix = fix{
- "time+fileinfo",
- "2011-11-29",
- timefileinfo,
- `Rewrite for new time and os.FileInfo APIs.
-
-This fix applies some of the more mechanical changes,
-but most code will still need manual cleanup.
-
-http://codereview.appspot.com/5392041
-http://codereview.appspot.com/5416060
-`,
-}
-
-var timefileinfoTypeConfig = &TypeConfig{
- Type: map[string]*Type{
- "os.File": {
- Method: map[string]string{
- "Readdir": "func() []*os.FileInfo",
- "Stat": "func() (*os.FileInfo, error)",
- },
- },
- "time.Time": {
- Method: map[string]string{
- "Seconds": "time.raw",
- "Nanoseconds": "time.raw",
- },
- },
- },
- Func: map[string]string{
- "ioutil.ReadDir": "([]*os.FileInfo, error)",
- "os.Stat": "(*os.FileInfo, error)",
- "os.Lstat": "(*os.FileInfo, error)",
- "time.LocalTime": "*time.Time",
- "time.UTC": "*time.Time",
- "time.SecondsToLocalTime": "*time.Time",
- "time.SecondsToUTC": "*time.Time",
- "time.NanosecondsToLocalTime": "*time.Time",
- "time.NanosecondsToUTC": "*time.Time",
- "time.Parse": "(*time.Time, error)",
- "time.Nanoseconds": "time.raw",
- "time.Seconds": "time.raw",
- },
-}
-
-// timefileinfoIsOld reports whether f has evidence of being
-// "old code", from before the API changes. Evidence means:
-//
-// a mention of *os.FileInfo (the pointer)
-// a mention of *time.Time (the pointer)
-// a mention of old functions from package time
-// an attempt to call time.UTC
-//
-func timefileinfoIsOld(f *ast.File, typeof map[interface{}]string) bool {
- old := false
-
- // called records the expressions that appear as
- // the function part of a function call, so that
- // we can distinguish a ref to the possibly new time.UTC
- // from the definitely old time.UTC() function call.
- called := make(map[interface{}]bool)
-
- before := func(n interface{}) {
- if old {
- return
- }
- if star, ok := n.(*ast.StarExpr); ok {
- if isPkgDot(star.X, "os", "FileInfo") || isPkgDot(star.X, "time", "Time") {
- old = true
- return
- }
- }
- if sel, ok := n.(*ast.SelectorExpr); ok {
- if isTopName(sel.X, "time") {
- if timefileinfoOldTimeFunc[sel.Sel.Name] {
- old = true
- return
- }
- }
- if typeof[sel.X] == "os.FileInfo" || typeof[sel.X] == "*os.FileInfo" {
- switch sel.Sel.Name {
- case "Mtime_ns", "IsDirectory", "IsRegular":
- old = true
- return
- case "Name", "Mode", "Size":
- if !called[sel] {
- old = true
- return
- }
- }
- }
- }
- call, ok := n.(*ast.CallExpr)
- if ok && isPkgDot(call.Fun, "time", "UTC") {
- old = true
- return
- }
- if ok {
- called[call.Fun] = true
- }
- }
- walkBeforeAfter(f, before, nop)
- return old
-}
-
-var timefileinfoOldTimeFunc = map[string]bool{
- "LocalTime": true,
- "SecondsToLocalTime": true,
- "SecondsToUTC": true,
- "NanosecondsToLocalTime": true,
- "NanosecondsToUTC": true,
- "Seconds": true,
- "Nanoseconds": true,
-}
-
-var isTimeNow = map[string]bool{
- "LocalTime": true,
- "UTC": true,
- "Seconds": true,
- "Nanoseconds": true,
-}
-
-func timefileinfo(f *ast.File) bool {
- if !imports(f, "os") && !imports(f, "time") && !imports(f, "io/ioutil") {
- return false
- }
-
- typeof, _ := typecheck(timefileinfoTypeConfig, f)
-
- if !timefileinfoIsOld(f, typeof) {
- return false
- }
-
- fixed := false
- walk(f, func(n interface{}) {
- p, ok := n.(*ast.Expr)
- if !ok {
- return
- }
- nn := *p
-
- // Rewrite *os.FileInfo and *time.Time to drop the pointer.
- if star, ok := nn.(*ast.StarExpr); ok {
- if isPkgDot(star.X, "os", "FileInfo") || isPkgDot(star.X, "time", "Time") {
- fixed = true
- *p = star.X
- return
- }
- }
-
- // Rewrite old time API calls to new calls.
- // The code will still not compile after this edit,
- // but the compiler will catch that, and the replacement
- // code will be the correct functions to use in the new API.
- if sel, ok := nn.(*ast.SelectorExpr); ok && isTopName(sel.X, "time") {
- fn := sel.Sel.Name
- if fn == "LocalTime" || fn == "Seconds" || fn == "Nanoseconds" {
- fixed = true
- sel.Sel.Name = "Now"
- return
- }
- }
-
- if call, ok := nn.(*ast.CallExpr); ok {
- if sel, ok := call.Fun.(*ast.SelectorExpr); ok {
- // Rewrite time.UTC but only when called (there's a new time.UTC var now).
- if isPkgDot(sel, "time", "UTC") {
- fixed = true
- sel.Sel.Name = "Now"
- // rewrite time.Now() into time.Now().UTC()
- *p = &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: call,
- Sel: ast.NewIdent("UTC"),
- },
- }
- return
- }
-
- // Rewrite conversions.
- if ok && isTopName(sel.X, "time") && len(call.Args) == 1 {
- fn := sel.Sel.Name
- switch fn {
- case "SecondsToLocalTime", "SecondsToUTC",
- "NanosecondsToLocalTime", "NanosecondsToUTC":
- fixed = true
- sel.Sel.Name = "Unix"
- call.Args = append(call.Args, nil)
- if strings.HasPrefix(fn, "Seconds") {
- // Unix(sec, 0)
- call.Args[1] = ast.NewIdent("0")
- } else {
- // Unix(0, nsec)
- call.Args[1] = call.Args[0]
- call.Args[0] = ast.NewIdent("0")
- }
- if strings.HasSuffix(fn, "ToUTC") {
- // rewrite call into call.UTC()
- *p = &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: call,
- Sel: ast.NewIdent("UTC"),
- },
- }
- }
- return
- }
- }
-
- // Rewrite method calls.
- switch typeof[sel.X] {
- case "*time.Time", "time.Time":
- switch sel.Sel.Name {
- case "Seconds":
- fixed = true
- sel.Sel.Name = "Unix"
- return
- case "Nanoseconds":
- fixed = true
- sel.Sel.Name = "UnixNano"
- return
- }
-
- case "*os.FileInfo", "os.FileInfo":
- switch sel.Sel.Name {
- case "IsDirectory":
- fixed = true
- sel.Sel.Name = "IsDir"
- return
- case "IsRegular":
- fixed = true
- sel.Sel.Name = "IsDir"
- *p = &ast.UnaryExpr{
- Op: token.NOT,
- X: call,
- }
- return
- }
- }
- }
- }
-
- // Rewrite subtraction of two times.
- // Cannot handle +=/-=.
- if bin, ok := nn.(*ast.BinaryExpr); ok &&
- bin.Op == token.SUB &&
- (typeof[bin.X] == "time.raw" || typeof[bin.Y] == "time.raw") {
- fixed = true
- *p = &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: bin.X,
- Sel: ast.NewIdent("Sub"),
- },
- Args: []ast.Expr{bin.Y},
- }
- }
-
- // Rewrite field references for os.FileInfo.
- if sel, ok := nn.(*ast.SelectorExpr); ok {
- if typ := typeof[sel.X]; typ == "*os.FileInfo" || typ == "os.FileInfo" {
- addCall := false
- switch sel.Sel.Name {
- case "Name", "Size", "Mode":
- fixed = true
- addCall = true
- case "Mtime_ns":
- fixed = true
- sel.Sel.Name = "ModTime"
- addCall = true
- }
- if addCall {
- *p = &ast.CallExpr{
- Fun: sel,
- }
- return
- }
- }
- }
- })
-
- return true
-}
diff --git a/src/cmd/fix/timefileinfo_test.go b/src/cmd/fix/timefileinfo_test.go
deleted file mode 100644
index 6573b85456..0000000000
--- a/src/cmd/fix/timefileinfo_test.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(timefileinfoTests, timefileinfo)
-}
-
-var timefileinfoTests = []testCase{
- {
- Name: "timefileinfo.0",
- In: `package main
-
-import "os"
-
-func main() {
- st, _ := os.Stat("/etc/passwd")
- _ = st.Name
-}
-`,
- Out: `package main
-
-import "os"
-
-func main() {
- st, _ := os.Stat("/etc/passwd")
- _ = st.Name()
-}
-`,
- },
- {
- Name: "timefileinfo.1",
- In: `package main
-
-import "os"
-
-func main() {
- st, _ := os.Stat("/etc/passwd")
- _ = st.Size
- _ = st.Mode
- _ = st.Mtime_ns
- _ = st.IsDirectory()
- _ = st.IsRegular()
-}
-`,
- Out: `package main
-
-import "os"
-
-func main() {
- st, _ := os.Stat("/etc/passwd")
- _ = st.Size()
- _ = st.Mode()
- _ = st.ModTime()
- _ = st.IsDir()
- _ = !st.IsDir()
-}
-`,
- },
- {
- Name: "timefileinfo.2",
- In: `package main
-
-import "os"
-
-func f(st *os.FileInfo) {
- _ = st.Name
- _ = st.Size
- _ = st.Mode
- _ = st.Mtime_ns
- _ = st.IsDirectory()
- _ = st.IsRegular()
-}
-`,
- Out: `package main
-
-import "os"
-
-func f(st os.FileInfo) {
- _ = st.Name()
- _ = st.Size()
- _ = st.Mode()
- _ = st.ModTime()
- _ = st.IsDir()
- _ = !st.IsDir()
-}
-`,
- },
- {
- Name: "timefileinfo.3",
- In: `package main
-
-import "time"
-
-func main() {
- _ = time.Seconds()
- _ = time.Nanoseconds()
- _ = time.LocalTime()
- _ = time.UTC()
- _ = time.SecondsToLocalTime(sec)
- _ = time.SecondsToUTC(sec)
- _ = time.NanosecondsToLocalTime(nsec)
- _ = time.NanosecondsToUTC(nsec)
-}
-`,
- Out: `package main
-
-import "time"
-
-func main() {
- _ = time.Now()
- _ = time.Now()
- _ = time.Now()
- _ = time.Now().UTC()
- _ = time.Unix(sec, 0)
- _ = time.Unix(sec, 0).UTC()
- _ = time.Unix(0, nsec)
- _ = time.Unix(0, nsec).UTC()
-}
-`,
- },
- {
- Name: "timefileinfo.4",
- In: `package main
-
-import "time"
-
-func f(*time.Time)
-
-func main() {
- t := time.LocalTime()
- _ = t.Seconds()
- _ = t.Nanoseconds()
-
- t1 := time.Nanoseconds()
- f(nil)
- t2 := time.Nanoseconds()
- dt := t2 - t1
-}
-`,
- Out: `package main
-
-import "time"
-
-func f(time.Time)
-
-func main() {
- t := time.Now()
- _ = t.Unix()
- _ = t.UnixNano()
-
- t1 := time.Now()
- f(nil)
- t2 := time.Now()
- dt := t2.Sub(t1)
-}
-`,
- },
- {
- Name: "timefileinfo.5", // test for issues 1505, 2636
- In: `package main
-
-import (
- "fmt"
- "time"
-)
-
-func main() {
- fmt.Println(time.SecondsToUTC(now)) // this comment must not introduce an illegal linebreak
-}
-`,
- Out: `package main
-
-import (
- "fmt"
- "time"
-)
-
-func main() {
- fmt.Println(time.Unix(now, 0).UTC( // this comment must not introduce an illegal linebreak
- ))
-}
-`,
- },
-}
diff --git a/src/cmd/fix/url.go b/src/cmd/fix/url.go
deleted file mode 100644
index 49aac739b3..0000000000
--- a/src/cmd/fix/url.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "go/ast"
-
-func init() {
- register(urlFix)
-}
-
-var urlFix = fix{
- "url",
- "2011-08-17",
- url,
- `Move the URL pieces of package http into a new package, url.
-
-http://codereview.appspot.com/4893043
-`,
-}
-
-var urlRenames = []struct{ in, out string }{
- {"URL", "URL"},
- {"ParseURL", "Parse"},
- {"ParseURLReference", "ParseWithReference"},
- {"ParseQuery", "ParseQuery"},
- {"Values", "Values"},
- {"URLEscape", "QueryEscape"},
- {"URLUnescape", "QueryUnescape"},
- {"URLError", "Error"},
- {"URLEscapeError", "EscapeError"},
-}
-
-func url(f *ast.File) bool {
- if imports(f, "url") || !imports(f, "http") {
- return false
- }
-
- fixed := false
-
- // Update URL code.
- urlWalk := func(n interface{}) {
- // Is it an identifier?
- if ident, ok := n.(*ast.Ident); ok && ident.Name == "url" {
- ident.Name = "url_"
- return
- }
- // Parameter and result names.
- if fn, ok := n.(*ast.FuncType); ok {
- fixed = urlDoFields(fn.Params) || fixed
- fixed = urlDoFields(fn.Results) || fixed
- }
- }
-
- // Fix up URL code and add import, at most once.
- fix := func() {
- if fixed {
- return
- }
- addImport(f, "url")
- walkBeforeAfter(f, urlWalk, nop)
- fixed = true
- }
-
- walk(f, func(n interface{}) {
- // Rename functions and methods.
- if expr, ok := n.(ast.Expr); ok {
- for _, s := range urlRenames {
- if isPkgDot(expr, "http", s.in) {
- fix()
- expr.(*ast.SelectorExpr).X.(*ast.Ident).Name = "url"
- expr.(*ast.SelectorExpr).Sel.Name = s.out
- return
- }
- }
- }
- })
-
- // Remove the http import if no longer needed.
- if fixed && !usesImport(f, "http") {
- deleteImport(f, "http")
- }
-
- return fixed
-}
-
-func urlDoFields(list *ast.FieldList) (fixed bool) {
- if list == nil {
- return
- }
- for _, field := range list.List {
- for _, ident := range field.Names {
- if ident.Name == "url" {
- fixed = true
- ident.Name = "url_"
- }
- }
- }
- return
-}
diff --git a/src/cmd/fix/url2.go b/src/cmd/fix/url2.go
deleted file mode 100644
index 5fd05ad2a7..0000000000
--- a/src/cmd/fix/url2.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import "go/ast"
-
-func init() {
- register(url2Fix)
-}
-
-var url2Fix = fix{
- "url2",
- "2012-02-16",
- url2,
- `Rename some functions in net/url.
-
-http://codereview.appspot.com/5671061
-`,
-}
-
-func url2(f *ast.File) bool {
- if !imports(f, "net/url") {
- return false
- }
-
- fixed := false
-
- walk(f, func(n interface{}) {
- // Rename functions and methods.
- sel, ok := n.(*ast.SelectorExpr)
- if !ok {
- return
- }
- if !isTopName(sel.X, "url") {
- return
- }
- if sel.Sel.Name == "ParseWithReference" {
- sel.Sel.Name = "ParseWithFragment"
- fixed = true
- }
- })
-
- return fixed
-}
diff --git a/src/cmd/fix/url2_test.go b/src/cmd/fix/url2_test.go
deleted file mode 100644
index c68dd88f18..0000000000
--- a/src/cmd/fix/url2_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(url2Tests, url2)
-}
-
-var url2Tests = []testCase{
- {
- Name: "url2.0",
- In: `package main
-
-import "net/url"
-
-func f() {
- url.ParseWithReference("foo")
-}
-`,
- Out: `package main
-
-import "net/url"
-
-func f() {
- url.ParseWithFragment("foo")
-}
-`,
- },
-}
diff --git a/src/cmd/fix/url_test.go b/src/cmd/fix/url_test.go
deleted file mode 100644
index 39827f780e..0000000000
--- a/src/cmd/fix/url_test.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2011 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(urlTests, url)
-}
-
-var urlTests = []testCase{
- {
- Name: "url.0",
- In: `package main
-
-import (
- "http"
-)
-
-func f() {
- var _ http.URL
- http.ParseURL(a)
- http.ParseURLReference(a)
- http.ParseQuery(a)
- m := http.Values{a: b}
- http.URLEscape(a)
- http.URLUnescape(a)
- var x http.URLError
- var y http.URLEscapeError
-}
-`,
- Out: `package main
-
-import "url"
-
-func f() {
- var _ url.URL
- url.Parse(a)
- url.ParseWithReference(a)
- url.ParseQuery(a)
- m := url.Values{a: b}
- url.QueryEscape(a)
- url.QueryUnescape(a)
- var x url.Error
- var y url.EscapeError
-}
-`,
- },
- {
- Name: "url.1",
- In: `package main
-
-import (
- "http"
-)
-
-func f() {
- http.ParseURL(a)
- var x http.Request
-}
-`,
- Out: `package main
-
-import (
- "http"
- "url"
-)
-
-func f() {
- url.Parse(a)
- var x http.Request
-}
-`,
- },
- {
- Name: "url.2",
- In: `package main
-
-import (
- "http"
-)
-
-type U struct{ url int }
-type M map[int]int
-
-func f() {
- http.ParseURL(a)
- var url = 23
- url, x := 45, y
- _ = U{url: url}
- _ = M{url + 1: url}
-}
-
-func g(url string) string {
- return url
-}
-
-func h() (url string) {
- return url
-}
-`,
- Out: `package main
-
-import "url"
-
-type U struct{ url_ int }
-type M map[int]int
-
-func f() {
- url.Parse(a)
- var url_ = 23
- url_, x := 45, y
- _ = U{url_: url_}
- _ = M{url_ + 1: url_}
-}
-
-func g(url_ string) string {
- return url_
-}
-
-func h() (url_ string) {
- return url_
-}
-`,
- },
- {
- Name: "url.3",
- In: `package main
-
-import "http"
-
-type U struct{ url string }
-
-func f() {
- var u U
- u.url = "x"
-}
-
-func (url *T) m() string {
- return url
-}
-`,
- Out: `package main
-
-import "http"
-
-type U struct{ url string }
-
-func f() {
- var u U
- u.url = "x"
-}
-
-func (url *T) m() string {
- return url
-}
-`,
- },
-}
diff --git a/src/cmd/fix/xmlapi.go b/src/cmd/fix/xmlapi.go
deleted file mode 100644
index e74425914d..0000000000
--- a/src/cmd/fix/xmlapi.go
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "go/ast"
-)
-
-func init() {
- register(xmlapiFix)
-}
-
-var xmlapiFix = fix{
- "xmlapi",
- "2012-01-23",
- xmlapi,
- `
- Make encoding/xml's API look more like the rest of the encoding packages.
-
-http://codereview.appspot.com/5574053
-`,
-}
-
-var xmlapiTypeConfig = &TypeConfig{
- Func: map[string]string{
- "xml.NewParser": "*xml.Parser",
- "os.Open": "*os.File",
- "os.OpenFile": "*os.File",
- "bytes.NewBuffer": "*bytes.Buffer",
- "bytes.NewBufferString": "*bytes.Buffer",
- "bufio.NewReader": "*bufio.Reader",
- "bufio.NewReadWriter": "*bufio.ReadWriter",
- },
-}
-
-var isReader = map[string]bool{
- "*os.File": true,
- "*bytes.Buffer": true,
- "*bufio.Reader": true,
- "*bufio.ReadWriter": true,
- "io.Reader": true,
-}
-
-func xmlapi(f *ast.File) bool {
- if !imports(f, "encoding/xml") {
- return false
- }
-
- typeof, _ := typecheck(xmlapiTypeConfig, f)
-
- fixed := false
- walk(f, func(n interface{}) {
- s, ok := n.(*ast.SelectorExpr)
- if ok && typeof[s.X] == "*xml.Parser" && s.Sel.Name == "Unmarshal" {
- s.Sel.Name = "DecodeElement"
- fixed = true
- return
- }
- if ok && isPkgDot(s, "xml", "Parser") {
- s.Sel.Name = "Decoder"
- fixed = true
- return
- }
-
- call, ok := n.(*ast.CallExpr)
- if !ok {
- return
- }
- switch {
- case len(call.Args) == 2 && isPkgDot(call.Fun, "xml", "Marshal"):
- *call = xmlMarshal(call.Args)
- fixed = true
- case len(call.Args) == 2 && isPkgDot(call.Fun, "xml", "Unmarshal"):
- if isReader[typeof[call.Args[0]]] {
- *call = xmlUnmarshal(call.Args)
- fixed = true
- }
- case len(call.Args) == 1 && isPkgDot(call.Fun, "xml", "NewParser"):
- sel := call.Fun.(*ast.SelectorExpr).Sel
- sel.Name = "NewDecoder"
- fixed = true
- }
- })
- return fixed
-}
-
-func xmlMarshal(args []ast.Expr) ast.CallExpr {
- return xmlCallChain("NewEncoder", "Encode", args)
-}
-
-func xmlUnmarshal(args []ast.Expr) ast.CallExpr {
- return xmlCallChain("NewDecoder", "Decode", args)
-}
-
-func xmlCallChain(first, second string, args []ast.Expr) ast.CallExpr {
- return ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: &ast.CallExpr{
- Fun: &ast.SelectorExpr{
- X: ast.NewIdent("xml"),
- Sel: ast.NewIdent(first),
- },
- Args: args[:1],
- },
- Sel: ast.NewIdent(second),
- },
- Args: args[1:2],
- }
-}
diff --git a/src/cmd/fix/xmlapi_test.go b/src/cmd/fix/xmlapi_test.go
deleted file mode 100644
index 6486c81248..0000000000
--- a/src/cmd/fix/xmlapi_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2012 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-func init() {
- addTestCases(xmlapiTests, xmlapi)
-}
-
-var xmlapiTests = []testCase{
- {
- Name: "xmlapi.0",
- In: `package main
-
-import "encoding/xml"
-
-func f() {
- xml.Marshal(a, b)
- xml.Unmarshal(a, b)
-
- var buf1 bytes.Buffer
- buf2 := &bytes.Buffer{}
- buf3 := bytes.NewBuffer(data)
- buf4 := bytes.NewBufferString(data)
- buf5 := bufio.NewReader(r)
- xml.Unmarshal(&buf1, v)
- xml.Unmarshal(buf2, v)
- xml.Unmarshal(buf3, v)
- xml.Unmarshal(buf4, v)
- xml.Unmarshal(buf5, v)
-
- f := os.Open("foo.xml")
- xml.Unmarshal(f, v)
-
- p1 := xml.NewParser(stream)
- p1.Unmarshal(v, start)
-
- var p2 *xml.Parser
- p2.Unmarshal(v, start)
-}
-
-func g(r io.Reader, f *os.File, b []byte) {
- xml.Unmarshal(r, v)
- xml.Unmarshal(f, v)
- xml.Unmarshal(b, v)
-}
-`,
- Out: `package main
-
-import "encoding/xml"
-
-func f() {
- xml.NewEncoder(a).Encode(b)
- xml.Unmarshal(a, b)
-
- var buf1 bytes.Buffer
- buf2 := &bytes.Buffer{}
- buf3 := bytes.NewBuffer(data)
- buf4 := bytes.NewBufferString(data)
- buf5 := bufio.NewReader(r)
- xml.NewDecoder(&buf1).Decode(v)
- xml.NewDecoder(buf2).Decode(v)
- xml.NewDecoder(buf3).Decode(v)
- xml.NewDecoder(buf4).Decode(v)
- xml.NewDecoder(buf5).Decode(v)
-
- f := os.Open("foo.xml")
- xml.NewDecoder(f).Decode(v)
-
- p1 := xml.NewDecoder(stream)
- p1.DecodeElement(v, start)
-
- var p2 *xml.Decoder
- p2.DecodeElement(v, start)
-}
-
-func g(r io.Reader, f *os.File, b []byte) {
- xml.NewDecoder(r).Decode(v)
- xml.NewDecoder(f).Decode(v)
- xml.Unmarshal(b, v)
-}
-`,
- },
-}