diff --git a/go.mod b/go.mod index e86d752..995b2dd 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.12 require ( github.com/gostaticanalysis/analysisutil v0.0.0-20190329151158-56bca42c7635 - github.com/gostaticanalysis/comment v1.2.0 + github.com/gostaticanalysis/comment v1.3.0 golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c // indirect golang.org/x/net v0.0.0-20190328230028-74de082e2cca // indirect golang.org/x/sys v0.0.0-20190329044733-9eb1bfa1ce65 // indirect diff --git a/go.sum b/go.sum index 1982d0a..c217602 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/gostaticanalysis/analysisutil v0.0.0-20190329151158-56bca42c7635 h1:I github.com/gostaticanalysis/analysisutil v0.0.0-20190329151158-56bca42c7635/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= +github.com/gostaticanalysis/comment v1.3.0 h1:wTVgynbFu8/nz6SGgywA0TcyIoAVsYc7ai/Zp5xNGlw= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/passes/unclosetx/testdata/src/a/a.go b/passes/unclosetx/testdata/src/a/a.go index c69ba46..448c631 100644 --- a/passes/unclosetx/testdata/src/a/a.go +++ b/passes/unclosetx/testdata/src/a/a.go @@ -12,6 +12,8 @@ func f1(ctx context.Context, client *spanner.Client) { tx := client.ReadOnlyTransaction() // OK tx.Close() client.Single() // OK + client.ReadOnlyTransaction() //lint:ignore zagane OK + client.ReadOnlyTransaction() //lint:ignore unclosetx OK } func f2(ctx context.Context, client *spanner.Client) { diff --git a/passes/unclosetx/unclosetx.go b/passes/unclosetx/unclosetx.go index fb3c458..e8bd51e 100644 --- a/passes/unclosetx/unclosetx.go +++ b/passes/unclosetx/unclosetx.go @@ -62,10 +62,11 @@ func run(pass *analysis.Pass) (interface{}, error) { for _, b := range f.Blocks { for i := range b.Instrs { pos := b.Instrs[i].Pos() + line := pass.Fset.File(pos).Line(pos) // skip - if cmaps.IgnorePos(pos, "zagane") || - cmaps.IgnorePos(pos, "unclosetx") || + if cmaps.IgnoreLine(pass.Fset, line, "zagane") || + cmaps.IgnoreLine(pass.Fset, line, "unclosetx") || isSingle(b.Instrs[i], single) { continue } diff --git a/passes/unstopiter/testdata/src/a/a.go b/passes/unstopiter/testdata/src/a/a.go index 0ad4cf5..7a0e386 100644 --- a/passes/unstopiter/testdata/src/a/a.go +++ b/passes/unstopiter/testdata/src/a/a.go @@ -11,6 +11,8 @@ func f1(ctx context.Context, client *spanner.Client) { _, _ = client.Single().Query(ctx, stmt).Next() // want "iterator must be stopped" client.Single().Query(ctx, stmt).Stop() // OK defer client.Single().Query(ctx, stmt).Stop() // OK + _, _ = client.Single().Query(ctx, stmt).Next() //lint:ignore zagane OK + _, _ = client.Single().Query(ctx, stmt).Next() //lint:ignore unstopiter OK } func f2(ctx context.Context, client *spanner.Client) { diff --git a/passes/unstopiter/unstopiter.go b/passes/unstopiter/unstopiter.go index 7138815..6fd3067 100644 --- a/passes/unstopiter/unstopiter.go +++ b/passes/unstopiter/unstopiter.go @@ -58,10 +58,11 @@ func run(pass *analysis.Pass) (interface{}, error) { for _, b := range f.Blocks { for i := range b.Instrs { pos := b.Instrs[i].Pos() + line := pass.Fset.File(pos).Line(pos) // skip - if cmaps.IgnorePos(pos, "zagane") || - cmaps.IgnorePos(pos, "unstopiter") { + if cmaps.IgnoreLine(pass.Fset, line, "zagane") || + cmaps.IgnoreLine(pass.Fset, line, "unstopiter") { continue } diff --git a/passes/wraperr/testdata/src/a/a.go b/passes/wraperr/testdata/src/a/a.go index 13f20fb..4ee8387 100644 --- a/passes/wraperr/testdata/src/a/a.go +++ b/passes/wraperr/testdata/src/a/a.go @@ -129,3 +129,27 @@ func f10(ctx context.Context, client *spanner.Client) { return outsideErr }) } + +func f11(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 { + //lint:ignore zagane OK + return wrap(err) + } + return nil + }) +} + +func f12(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 { + //lint:ignore wraperr OK + return wrap(err) + } + return nil + }) +} diff --git a/passes/wraperr/wraperr.go b/passes/wraperr/wraperr.go index f731c9d..287b1f5 100644 --- a/passes/wraperr/wraperr.go +++ b/passes/wraperr/wraperr.go @@ -60,9 +60,10 @@ func (r *runner) run(pass *analysis.Pass) (interface{}, error) { continue } - if pos := r.wrapped(instr); pos != token.NoPos { - if !cmaps.IgnorePos(pos, "zagane") && - !cmaps.IgnorePos(pos, "wraperr") { + if pos := r.wrapped(instr); pos.IsValid() { + l := pass.Fset.File(pos).Line(pos) + if !cmaps.IgnoreLine(pass.Fset, l, "zagane") && + !cmaps.IgnoreLine(pass.Fset, l, "wraperr") { pass.Reportf(pos, "must not be wrapped") } }