mirror of
https://github.com/golang/go
synced 2024-11-24 23:57:57 -07:00
fix: add fix for bufio, gzip, zlib NewWriterXxx changes.
Fixes #2979. R=rsc, r CC=golang-dev https://golang.org/cl/5664046
This commit is contained in:
parent
6fae34db94
commit
da8f037b57
22
doc/go1.html
22
doc/go1.html
@ -578,7 +578,7 @@ If they are installed, they now reside in <code>$GOROOT/bin/tool</code>.
|
||||
<em>Updating</em>:
|
||||
Code that uses packages in <code>exp</code> will need to be updated by hand,
|
||||
or else compiled from an installation that has <code>exp</code> available.
|
||||
The go fix tool or the compiler will complain about such uses.
|
||||
The <code>go fix</code> tool or the compiler will complain about such uses.
|
||||
</p>
|
||||
|
||||
<h3 id="old">The package tree old</h3>
|
||||
@ -603,7 +603,7 @@ The packages in their new locations are:
|
||||
<em>Updating</em>:
|
||||
Code that uses packages now in <code>old</code> will need to be updated by hand,
|
||||
or else compiled from an installation that has <code>old</code> available.
|
||||
The go fix tool will warn about such uses.
|
||||
The <code>go fix</code> tool will warn about such uses.
|
||||
</p>
|
||||
|
||||
<h3 id="deleted">Deleted packages</h3>
|
||||
@ -863,8 +863,8 @@ longer has a <code>Write</code> method. Its presence was a mistake.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<i>Updating:</i> What little code is affected will be caught by the compiler
|
||||
and must be updated by hand. Such code is almost certainly incorrect.
|
||||
<em>Updating</em>:
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h3 id="bufio">The bufio package</h3>
|
||||
@ -879,7 +879,8 @@ If the argument size is too small or invalid, it is adjusted.
|
||||
|
||||
<p>
|
||||
<em>Updating</em>:
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
Running <code>go fix</code> will update calls that assign the error to _.
|
||||
Calls that aren't fixed will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h3 id="bufio">The compress/flate, compress/gzip and compress/zlib packages</h3>
|
||||
@ -898,7 +899,8 @@ to <code>Writer</code> and <code>Reader</code>. Package <code>flate</code>'s
|
||||
|
||||
<p>
|
||||
<em>Updating</em>
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
Running <code>go fix</code> will update old names and calls that assign the error to _.
|
||||
Calls that aren't fixed will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h3 id="crypto_aes_des">The crypto/aes and crypto/des packages</h3>
|
||||
@ -1425,8 +1427,10 @@ now takes a <code>uintptr</code> fd, instead of an <code>int</code>.
|
||||
The <a href="/pkg/os/#File.Fd"><code>Fd</code></a> method on files now
|
||||
also returns a <code>uintptr</code>.</p>
|
||||
|
||||
<p><em>Updating</em>: Code will fail to compile and must be updated
|
||||
by hand. </p>
|
||||
<p>
|
||||
<em>Updating</em>:
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h4 id="os_fileinfo">The os.FileInfo type</h4>
|
||||
|
||||
@ -1669,7 +1673,7 @@ Running <code>go fix</code> will update almost all code affected by the change.
|
||||
<br>
|
||||
§ <code>Atoi</code> persists but <code>Atoui</code> and <code>Atof32</code> do not, so
|
||||
they may require
|
||||
a cast that must be added by hand; the go fix tool will warn about it.
|
||||
a cast that must be added by hand; the <code>go fix</code> tool will warn about it.
|
||||
</p>
|
||||
|
||||
|
||||
|
22
doc/go1.tmpl
22
doc/go1.tmpl
@ -502,7 +502,7 @@ If they are installed, they now reside in <code>$GOROOT/bin/tool</code>.
|
||||
<em>Updating</em>:
|
||||
Code that uses packages in <code>exp</code> will need to be updated by hand,
|
||||
or else compiled from an installation that has <code>exp</code> available.
|
||||
The go fix tool or the compiler will complain about such uses.
|
||||
The <code>go fix</code> tool or the compiler will complain about such uses.
|
||||
</p>
|
||||
|
||||
<h3 id="old">The package tree old</h3>
|
||||
@ -527,7 +527,7 @@ The packages in their new locations are:
|
||||
<em>Updating</em>:
|
||||
Code that uses packages now in <code>old</code> will need to be updated by hand,
|
||||
or else compiled from an installation that has <code>old</code> available.
|
||||
The go fix tool will warn about such uses.
|
||||
The <code>go fix</code> tool will warn about such uses.
|
||||
</p>
|
||||
|
||||
<h3 id="deleted">Deleted packages</h3>
|
||||
@ -767,8 +767,8 @@ longer has a <code>Write</code> method. Its presence was a mistake.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<i>Updating:</i> What little code is affected will be caught by the compiler
|
||||
and must be updated by hand. Such code is almost certainly incorrect.
|
||||
<em>Updating</em>:
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h3 id="bufio">The bufio package</h3>
|
||||
@ -783,7 +783,8 @@ If the argument size is too small or invalid, it is adjusted.
|
||||
|
||||
<p>
|
||||
<em>Updating</em>:
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
Running <code>go fix</code> will update calls that assign the error to _.
|
||||
Calls that aren't fixed will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h3 id="bufio">The compress/flate, compress/gzip and compress/zlib packages</h3>
|
||||
@ -802,7 +803,8 @@ to <code>Writer</code> and <code>Reader</code>. Package <code>flate</code>'s
|
||||
|
||||
<p>
|
||||
<em>Updating</em>
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
Running <code>go fix</code> will update old names and calls that assign the error to _.
|
||||
Calls that aren't fixed will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h3 id="crypto_aes_des">The crypto/aes and crypto/des packages</h3>
|
||||
@ -1328,8 +1330,10 @@ now takes a <code>uintptr</code> fd, instead of an <code>int</code>.
|
||||
The <a href="/pkg/os/#File.Fd"><code>Fd</code></a> method on files now
|
||||
also returns a <code>uintptr</code>.</p>
|
||||
|
||||
<p><em>Updating</em>: Code will fail to compile and must be updated
|
||||
by hand. </p>
|
||||
<p>
|
||||
<em>Updating</em>:
|
||||
What little code is affected will be caught by the compiler and must be updated by hand.
|
||||
</p>
|
||||
|
||||
<h4 id="os_fileinfo">The os.FileInfo type</h4>
|
||||
|
||||
@ -1572,7 +1576,7 @@ Running <code>go fix</code> will update almost all code affected by the change.
|
||||
<br>
|
||||
§ <code>Atoi</code> persists but <code>Atoui</code> and <code>Atof32</code> do not, so
|
||||
they may require
|
||||
a cast that must be added by hand; the go fix tool will warn about it.
|
||||
a cast that must be added by hand; the <code>go fix</code> tool will warn about it.
|
||||
</p>
|
||||
|
||||
|
||||
|
90
src/cmd/fix/newwriter.go
Normal file
90
src/cmd/fix/newwriter.go
Normal file
@ -0,0 +1,90 @@
|
||||
// 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
|
||||
}
|
83
src/cmd/fix/newwriter_test.go
Normal file
83
src/cmd/fix/newwriter_test.go
Normal file
@ -0,0 +1,83 @@
|
||||
// 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
|
||||
}
|
||||
`,
|
||||
},
|
||||
}
|
Loading…
Reference in New Issue
Block a user