// 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 }