+
Skip to content

Add wraperr #19

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 28, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
33 changes: 33 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

* `unstopiter`: it finds iterators which did not stop.
* `unclosetx`: it finds transactions which does not close
* `wraperr`: it finds [(*spanner.Client).ReadWriteTransaction](https://godoc.org/cloud.google.com/go/spanner#Client.ReadWriteTransaction) calls which returns wrapped errors

## Install

Expand Down Expand Up @@ -79,6 +80,38 @@ defer tx.Close()

When a transaction is created by [`(*spanner.Client).Single`](https://godoc.org/cloud.google.com/go/spanner#ReadOnlyTransaction), `unclosetx` ignore it.

### wraperr

`wraperr` finds ReadWriteTransaction calls which returns wrapped errors such as the below code.

```go
func f(ctx context.Context, client *spanner.Client) {
client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
stmt := spanner.Statement{SQL: `SELECT 1`}
_, err := client.Single().Query(ctx, stmt).Next()
if err != nil {
return errors.Wrap(err, "wrapped") // want "must not be wrapped"
}
return nil
})
}
```

This code must be fixed as below.

```go
func f(ctx context.Context, client *spanner.Client) {
client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
stmt := spanner.Statement{SQL: `SELECT 1`}
_, err := client.Single().Query(ctx, stmt).Next()
if err != nil {
return err
}
return nil
})
}
```

## Ignore Checks

Analyzers ignore nodes which are annotated by [staticcheck's style comments](https://staticcheck.io/docs/#ignoring-problems) as belows.
Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ module github.com/gcpug/zagane
go 1.12

require (
github.com/gostaticanalysis/analysisutil v0.0.0-20190327092558-d54420a50cbc
github.com/gostaticanalysis/analysisutil v0.0.0-20190328083720-21f599c341e5
github.com/gostaticanalysis/comment v1.2.0
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c // indirect
golang.org/x/net v0.0.0-20190327091125-710a502c58a2 // indirect
golang.org/x/net v0.0.0-20190327214358-63eda1eb0650 // indirect
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc // indirect
golang.org/x/tools v0.0.0-20190327011446-79af862e6737
golang.org/x/tools v0.0.0-20190328030505-8f05a32dce9f
honnef.co/go/tools v0.0.0-20190319011948-d116c56a00f3
)
11 changes: 11 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ github.com/gostaticanalysis/analysisutil v0.0.0-20190327075852-582dfa027f82 h1:I
github.com/gostaticanalysis/analysisutil v0.0.0-20190327075852-582dfa027f82/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
github.com/gostaticanalysis/analysisutil v0.0.0-20190327092558-d54420a50cbc h1:LmXZyOx8qG7hylzrqvQAxiWAsFsZOCRx9Bgy9tZFEEA=
github.com/gostaticanalysis/analysisutil v0.0.0-20190327092558-d54420a50cbc/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328074730-020e90838b78 h1:aB9rzOfq7ivBRF1wFgN/pOuTAY+ltzJDQz8xyNFVidk=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328074730-020e90838b78/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328075621-3e21bd09b446 h1:bsrpBdUtzNaG8nmptFHQATjl5a2GPMNiAGphd1P3CRQ=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328075621-3e21bd09b446/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328082835-6bd5ee303ea8 h1:jzZ4tbk+jUAJtum0mp5+xRqn97jVRYmtoL90MUhkuag=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328082835-6bd5ee303ea8/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328083720-21f599c341e5 h1:CSMOasma7WH8RZMzPu83V40xv/Ux70Wb+93uxWSviag=
github.com/gostaticanalysis/analysisutil v0.0.0-20190328083720-21f599c341e5/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
github.com/gostaticanalysis/comment v1.2.0 h1:z0tFc54SL945O+NO9/8xXs3Ii0uDxj2tEEru58Uwz6E=
github.com/gostaticanalysis/comment v1.2.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand All @@ -15,12 +23,15 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJV
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190327025741-74e053c68e29/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190327214358-63eda1eb0650/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4=
golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190327011446-79af862e6737 h1:aEQSysewJq5X0N9MzIyq6qGRAjsIh/V6MJtYQ1xydJ4=
golang.org/x/tools v0.0.0-20190327011446-79af862e6737/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328030505-8f05a32dce9f h1:MC9ePo9/ITLPbt6QsoTD78Pg07by0QbfGLUQpkJ01QM=
golang.org/x/tools v0.0.0-20190328030505-8f05a32dce9f/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
honnef.co/go/tools v0.0.0-20190319011948-d116c56a00f3 h1:XNmJXNdEHJ6ib8002TXvjYr8cjxBc0mmMoPsNQO4nsM=
honnef.co/go/tools v0.0.0-20190319011948-d116c56a00f3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
1 change: 1 addition & 0 deletions passes/wraperr/testdata/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pkg/
61 changes: 61 additions & 0 deletions passes/wraperr/testdata/src/a/a.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package a

import (
"context"

"cloud.google.com/go/spanner"
)

type wrapErr struct {
error
}

func wrap(err error) error {
return &wrapErr{err}
}

func f1(ctx context.Context, client *spanner.Client) {
client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
stmt := spanner.Statement{SQL: `SELECT 1`}
_, err := client.Single().Query(ctx, stmt).Next()
if err != nil {
return err // OK
}
return nil
})
}

func f2(ctx context.Context, client *spanner.Client) {
client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
stmt := spanner.Statement{SQL: `SELECT 1`}
_, err := client.Single().Query(ctx, stmt).Next()
if err != nil {
return wrap(err) // want "must not be wrapped"
}
return nil
})
}

func f3(ctx context.Context, client *spanner.Client) {
client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
stmt := spanner.Statement{SQL: `SELECT 1`}
_, err := client.Single().Query(ctx, stmt).Next()
if err != nil {
return &wrapErr{err} // want "must not be wrapped"
}
return nil
})
}

func f4(ctx context.Context, client *spanner.Client) {
client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
stmt := spanner.Statement{SQL: `SELECT 1`}
_, err := client.Single().Query(ctx, stmt).Next()
if err != nil {
return func() error {
return &wrapErr{err}
}() // want "must not be wrapped"
}
return nil
})
}
5 changes: 5 additions & 0 deletions passes/wraperr/testdata/src/a/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module a

go 1.12

require cloud.google.com/go v0.37.1
Loading
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载