aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/gostaticanalysis
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/gostaticanalysis')
-rw-r--r--vendor/github.com/gostaticanalysis/analysisutil/file.go12
-rw-r--r--vendor/github.com/gostaticanalysis/analysisutil/go.mod8
-rw-r--r--vendor/github.com/gostaticanalysis/analysisutil/go.sum62
-rw-r--r--vendor/github.com/gostaticanalysis/analysisutil/ssa.go14
-rw-r--r--vendor/github.com/gostaticanalysis/analysisutil/ssainspect.go10
-rw-r--r--vendor/github.com/gostaticanalysis/analysisutil/types.go32
-rw-r--r--vendor/github.com/gostaticanalysis/comment/comment.go35
-rw-r--r--vendor/github.com/gostaticanalysis/comment/go.mod7
-rw-r--r--vendor/github.com/gostaticanalysis/comment/go.sum46
-rw-r--r--vendor/github.com/gostaticanalysis/comment/passes/commentmap/commentmap.go3
-rw-r--r--vendor/github.com/gostaticanalysis/forcetypeassert/.reviewdog.yml8
-rw-r--r--vendor/github.com/gostaticanalysis/forcetypeassert/LICENSE21
-rw-r--r--vendor/github.com/gostaticanalysis/forcetypeassert/README.md28
-rw-r--r--vendor/github.com/gostaticanalysis/forcetypeassert/forcetypeassert.go143
-rw-r--r--vendor/github.com/gostaticanalysis/forcetypeassert/go.mod5
-rw-r--r--vendor/github.com/gostaticanalysis/forcetypeassert/go.sum6
-rw-r--r--vendor/github.com/gostaticanalysis/nilerr/LICENSE21
-rw-r--r--vendor/github.com/gostaticanalysis/nilerr/README.md41
-rw-r--r--vendor/github.com/gostaticanalysis/nilerr/go.mod8
-rw-r--r--vendor/github.com/gostaticanalysis/nilerr/go.sum34
-rw-r--r--vendor/github.com/gostaticanalysis/nilerr/nilerr.go291
21 files changed, 768 insertions, 67 deletions
diff --git a/vendor/github.com/gostaticanalysis/analysisutil/file.go b/vendor/github.com/gostaticanalysis/analysisutil/file.go
index 2aeca1d9e..b9b295530 100644
--- a/vendor/github.com/gostaticanalysis/analysisutil/file.go
+++ b/vendor/github.com/gostaticanalysis/analysisutil/file.go
@@ -3,6 +3,7 @@ package analysisutil
import (
"go/ast"
"go/token"
+ "regexp"
"golang.org/x/tools/go/analysis"
)
@@ -16,3 +17,14 @@ func File(pass *analysis.Pass, pos token.Pos) *ast.File {
}
return nil
}
+
+var genCommentRegexp = regexp.MustCompile(`^// Code generated .* DO NOT EDIT\.$`)
+
+// IsGeneratedFile reports whether the file has been generated automatically.
+// If file is nil, IsGeneratedFile will return false.
+func IsGeneratedFile(file *ast.File) bool {
+ if file == nil || len(file.Comments) == 0 {
+ return false
+ }
+ return genCommentRegexp.MatchString(file.Comments[0].List[0].Text)
+}
diff --git a/vendor/github.com/gostaticanalysis/analysisutil/go.mod b/vendor/github.com/gostaticanalysis/analysisutil/go.mod
index 5ca7c62b8..94016146b 100644
--- a/vendor/github.com/gostaticanalysis/analysisutil/go.mod
+++ b/vendor/github.com/gostaticanalysis/analysisutil/go.mod
@@ -1,8 +1,10 @@
module github.com/gostaticanalysis/analysisutil
-go 1.12
+go 1.16
require (
- github.com/gostaticanalysis/comment v1.4.1
- golang.org/x/tools v0.0.0-20200820010801-b793a1359eac
+ github.com/gostaticanalysis/comment v1.4.2
+ golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a
)
+
+retract v0.6.3
diff --git a/vendor/github.com/gostaticanalysis/analysisutil/go.sum b/vendor/github.com/gostaticanalysis/analysisutil/go.sum
index 134e67dbd..ebc32d29f 100644
--- a/vendor/github.com/gostaticanalysis/analysisutil/go.sum
+++ b/vendor/github.com/gostaticanalysis/analysisutil/go.sum
@@ -1,37 +1,51 @@
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/gostaticanalysis/comment v1.3.0 h1:wTVgynbFu8/nz6SGgywA0TcyIoAVsYc7ai/Zp5xNGlw=
-github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI=
-github.com/gostaticanalysis/comment v1.4.1 h1:xHopR5L2lRz6OsjH4R2HG5wRhW9ySl3FsHIvi5pcXwc=
-github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q=
+github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM=
+github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4 h1:d2/eIbH9XjD1fFwD5SHv8x168fjbQ9PB8hvs8DSEC08=
+github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=
+github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
+github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=
+github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
+github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
+github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI=
+github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
+github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
+github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc=
+github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
+github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA=
+github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
+github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag=
+github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/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 h1:2oZsfYnKfYzL4I57uYiRFsUf0bqlLkiuw8nnj3+voUA=
-golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff h1:foic6oVZ4MKltJC6MXzuFZFswE7NCjjtc0Hxbyblawc=
-golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200820010801-b793a1359eac h1:DugppSxw0LSF8lcjaODPJZoDzq0ElTGskTst3ZaBkHI=
-golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
+golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a h1:wcmQQeIPy0fYbQMsfxwcnzKbuBLMGaHcN0nbzHbIjdo=
+golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/vendor/github.com/gostaticanalysis/analysisutil/ssa.go b/vendor/github.com/gostaticanalysis/analysisutil/ssa.go
index 517f6b9b4..2e22bbe79 100644
--- a/vendor/github.com/gostaticanalysis/analysisutil/ssa.go
+++ b/vendor/github.com/gostaticanalysis/analysisutil/ssa.go
@@ -20,7 +20,8 @@ func IfInstr(b *ssa.BasicBlock) *ssa.If {
}
// Phi returns phi values which are contained in the block b.
-func Phi(b *ssa.BasicBlock) (phis []*ssa.Phi) {
+func Phi(b *ssa.BasicBlock) []*ssa.Phi {
+ var phis []*ssa.Phi
for _, instr := range b.Instrs {
if phi, ok := instr.(*ssa.Phi); ok {
phis = append(phis, phi)
@@ -29,7 +30,7 @@ func Phi(b *ssa.BasicBlock) (phis []*ssa.Phi) {
break
}
}
- return
+ return phis
}
// Returns returns a slice of *ssa.Return in the function.
@@ -54,10 +55,14 @@ func Returns(v ssa.Value) []*ssa.Return {
func returnsInBlock(b *ssa.BasicBlock, done map[*ssa.BasicBlock]bool) (rets []*ssa.Return) {
if done[b] {
- return
+ return nil
}
done[b] = true
+ if b.Index != 0 && len(b.Preds) == 0 {
+ return nil
+ }
+
if len(b.Instrs) != 0 {
switch instr := b.Instrs[len(b.Instrs)-1].(type) {
case *ssa.Return:
@@ -68,7 +73,8 @@ func returnsInBlock(b *ssa.BasicBlock, done map[*ssa.BasicBlock]bool) (rets []*s
for _, s := range b.Succs {
rets = append(rets, returnsInBlock(s, done)...)
}
- return
+
+ return rets
}
// BinOp returns binary operator values which are contained in the block b.
diff --git a/vendor/github.com/gostaticanalysis/analysisutil/ssainspect.go b/vendor/github.com/gostaticanalysis/analysisutil/ssainspect.go
index 2f8a16576..b2ae75f24 100644
--- a/vendor/github.com/gostaticanalysis/analysisutil/ssainspect.go
+++ b/vendor/github.com/gostaticanalysis/analysisutil/ssainspect.go
@@ -2,6 +2,16 @@ package analysisutil
import "golang.org/x/tools/go/ssa"
+// InspectFuncs inspects functions.
+func InspectFuncs(funcs []*ssa.Function, f func(i int, instr ssa.Instruction) bool) {
+ for _, fun := range funcs {
+ if len(fun.Blocks) == 0 {
+ continue
+ }
+ new(instrInspector).block(fun.Blocks[0], 0, f)
+ }
+}
+
// InspectInstr inspects from i-th instruction of start block to succsessor blocks.
func InspectInstr(start *ssa.BasicBlock, i int, f func(i int, instr ssa.Instruction) bool) {
new(instrInspector).block(start, i, f)
diff --git a/vendor/github.com/gostaticanalysis/analysisutil/types.go b/vendor/github.com/gostaticanalysis/analysisutil/types.go
index 46b970621..8265efc8e 100644
--- a/vendor/github.com/gostaticanalysis/analysisutil/types.go
+++ b/vendor/github.com/gostaticanalysis/analysisutil/types.go
@@ -131,6 +131,30 @@ func HasField(s *types.Struct, f *types.Var) bool {
return false
}
+// Field returns field of the struct type.
+// If the type is not struct or has not the field,
+// Field returns -1, nil.
+// If the type is a named type or a pointer type,
+// Field calls itself recursively with
+// an underlying type or an element type of pointer.
+func Field(t types.Type, name string) (int, *types.Var) {
+ switch t := t.(type) {
+ case *types.Pointer:
+ return Field(t.Elem(), name)
+ case *types.Named:
+ return Field(t.Underlying(), name)
+ case *types.Struct:
+ for i := 0; i < t.NumFields(); i++ {
+ f := t.Field(i)
+ if f.Name() == name {
+ return i, f
+ }
+ }
+ }
+
+ return -1, nil
+}
+
func TypesInfo(info ...*types.Info) *types.Info {
if len(info) == 0 {
return nil
@@ -198,11 +222,7 @@ func mergeTypesInfo(i1, i2 *types.Info) {
}
// Under returns the most bottom underlying type.
+// Deprecated: (types.Type).Underlying returns same value of it.
func Under(t types.Type) types.Type {
- switch t := t.(type) {
- case *types.Named:
- return Under(t.Underlying())
- default:
- return t
- }
+ return t.Underlying()
}
diff --git a/vendor/github.com/gostaticanalysis/comment/comment.go b/vendor/github.com/gostaticanalysis/comment/comment.go
index 2fe67fa96..79cb09382 100644
--- a/vendor/github.com/gostaticanalysis/comment/comment.go
+++ b/vendor/github.com/gostaticanalysis/comment/comment.go
@@ -123,25 +123,30 @@ func (maps Maps) IgnoreLine(fset *token.FileSet, line int, check string) bool {
// hasIgnoreCheck returns true if the provided CommentGroup starts with a comment
// of the form "//lint:ignore Check1[,Check2,...,CheckN] reason" and one of the
-// checks matches the provided check. The *ast.CommentGroup is checked directly
-// rather than using "cg.Text()" because, starting in Go 1.15, the "cg.Text()" call
-// no longer returns directive-style comments (see https://github.com/golang/go/issues/37974).
+// checks matches the provided check.
+//
+// The *ast.CommentGroup is checked directly rather than using "cg.Text()" because,
+// starting in Go 1.15, the "cg.Text()" call no longer returns directive-style
+// comments (see https://github.com/golang/go/issues/37974).
func hasIgnoreCheck(cg *ast.CommentGroup, check string) bool {
- if !strings.HasPrefix(cg.List[0].Text, "//") {
- return false
- }
+ for _, list := range cg.List {
+ if !strings.HasPrefix(list.Text, "//") {
+ continue
+ }
- s := strings.TrimSpace(cg.List[0].Text[2:])
- txt := strings.Split(s, " ")
- if len(txt) < 3 || txt[0] != "lint:ignore" {
- return false
- }
+ s := strings.TrimSpace(list.Text[2:]) // list.Text[2:]: trim "//"
+ txt := strings.Split(s, " ")
+ if len(txt) < 3 || txt[0] != "lint:ignore" {
+ continue
+ }
- checks := strings.Split(txt[1], ",")
- for i := range checks {
- if check == checks[i] {
- return true
+ checks := strings.Split(txt[1], ",") // txt[1]: trim "lint:ignore"
+ for i := range checks {
+ if check == checks[i] {
+ return true
+ }
}
}
+
return false
}
diff --git a/vendor/github.com/gostaticanalysis/comment/go.mod b/vendor/github.com/gostaticanalysis/comment/go.mod
index 275568113..501f786a5 100644
--- a/vendor/github.com/gostaticanalysis/comment/go.mod
+++ b/vendor/github.com/gostaticanalysis/comment/go.mod
@@ -1,8 +1,9 @@
module github.com/gostaticanalysis/comment
-go 1.12
+go 1.15
require (
- github.com/google/go-cmp v0.5.1
- golang.org/x/tools v0.0.0-20200820010801-b793a1359eac
+ github.com/google/go-cmp v0.5.4
+ github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4
+ golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d
)
diff --git a/vendor/github.com/gostaticanalysis/comment/go.sum b/vendor/github.com/gostaticanalysis/comment/go.sum
index 425807ce1..b0670acd6 100644
--- a/vendor/github.com/gostaticanalysis/comment/go.sum
+++ b/vendor/github.com/gostaticanalysis/comment/go.sum
@@ -1,24 +1,48 @@
-github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
-github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4 h1:d2/eIbH9XjD1fFwD5SHv8x168fjbQ9PB8hvs8DSEC08=
+github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=
+github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
+github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=
+github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
+github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
+github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI=
+github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
+github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
+github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc=
+github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
+github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA=
+github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
+github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag=
+github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20200820010801-b793a1359eac h1:DugppSxw0LSF8lcjaODPJZoDzq0ElTGskTst3ZaBkHI=
-golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d h1:TWciQgVQK3rhquuBn8vdgrXzMaeTaRd/DVJyTONxE7I=
+golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/vendor/github.com/gostaticanalysis/comment/passes/commentmap/commentmap.go b/vendor/github.com/gostaticanalysis/comment/passes/commentmap/commentmap.go
index 9266d9895..1b60a160c 100644
--- a/vendor/github.com/gostaticanalysis/comment/passes/commentmap/commentmap.go
+++ b/vendor/github.com/gostaticanalysis/comment/passes/commentmap/commentmap.go
@@ -3,8 +3,9 @@ package commentmap
import (
"reflect"
- "github.com/gostaticanalysis/comment"
"golang.org/x/tools/go/analysis"
+
+ "github.com/gostaticanalysis/comment"
)
var Analyzer = &analysis.Analyzer{
diff --git a/vendor/github.com/gostaticanalysis/forcetypeassert/.reviewdog.yml b/vendor/github.com/gostaticanalysis/forcetypeassert/.reviewdog.yml
new file mode 100644
index 000000000..2e243ff73
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/forcetypeassert/.reviewdog.yml
@@ -0,0 +1,8 @@
+runner:
+ golint:
+ cmd: golint ./...
+ errorformat:
+ - "%f:%l:%c: %m"
+ level: warning
+ govet:
+ cmd: go vet -all .
diff --git a/vendor/github.com/gostaticanalysis/forcetypeassert/LICENSE b/vendor/github.com/gostaticanalysis/forcetypeassert/LICENSE
new file mode 100644
index 000000000..bf7e33db8
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/forcetypeassert/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 GoStaticAnalysis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/gostaticanalysis/forcetypeassert/README.md b/vendor/github.com/gostaticanalysis/forcetypeassert/README.md
new file mode 100644
index 000000000..36a47594e
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/forcetypeassert/README.md
@@ -0,0 +1,28 @@
+# forcetypeassert
+
+[![godoc.org][godoc-badge]][godoc]
+
+`forcetypeassert` finds type assertions which did forcely such as below.
+
+```go
+func f() {
+ var a interface{}
+ _ = a.(int) // type assertion must be checked
+}
+```
+
+You need to check if the assertion failed like so:
+```go
+func f() {
+ var a interface{}
+ _, ok := a.(int)
+ if !ok { // type assertion failed
+ // handle error
+ }
+}
+```
+
+<!-- links -->
+[godoc]: https://godoc.org/github.com/gostaticanalysis/forcetypeassert
+[godoc-badge]: https://img.shields.io/badge/godoc-reference-4F73B3.svg?style=flat-square&label=%20godoc.org
+
diff --git a/vendor/github.com/gostaticanalysis/forcetypeassert/forcetypeassert.go b/vendor/github.com/gostaticanalysis/forcetypeassert/forcetypeassert.go
new file mode 100644
index 000000000..bb48485d9
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/forcetypeassert/forcetypeassert.go
@@ -0,0 +1,143 @@
+package forcetypeassert
+
+import (
+ "go/ast"
+ "reflect"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+ "golang.org/x/tools/go/ast/inspector"
+)
+
+var Analyzer = &analysis.Analyzer{
+ Name: "forcetypeassert",
+ Doc: Doc,
+ Run: run,
+ Requires: []*analysis.Analyzer{
+ inspect.Analyzer,
+ },
+ ResultType: reflect.TypeOf((*Panicable)(nil)),
+}
+
+// Panicable stores panicable type assertions.
+type Panicable struct {
+ m map[ast.Node]bool
+ nodes []ast.Node
+}
+
+// Check checks whether the node may occur panic or not.
+func (p *Panicable) Check(n ast.Node) bool {
+ return p.m[n]
+}
+
+// Len is number of panicable nodes.
+func (p *Panicable) Len() int {
+ return len(p.nodes)
+}
+
+// At returns the i-th panicable node.
+func (p *Panicable) At(i int) ast.Node {
+ return p.nodes[i]
+}
+
+const Doc = "forcetypeassert is finds type assertions which did forcely"
+
+func run(pass *analysis.Pass) (interface{}, error) {
+ inspect, _ := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ result := &Panicable{m: make(map[ast.Node]bool)}
+
+ nodeFilter := []ast.Node{
+ (*ast.AssignStmt)(nil),
+ (*ast.ValueSpec)(nil),
+ (*ast.TypeAssertExpr)(nil),
+ }
+
+ inspect.Nodes(nodeFilter, func(n ast.Node, push bool) bool {
+ if !push {
+ return false
+ }
+ switch n := n.(type) {
+ case *ast.AssignStmt:
+ return checkAssignStmt(pass, result, n)
+ case *ast.ValueSpec:
+ return checkValueSpec(pass, result, n)
+ case *ast.TypeAssertExpr:
+ if n.Type != nil {
+ result.m[n] = true
+ result.nodes = append(result.nodes, n)
+ pass.Reportf(n.Pos(), "type assertion must be checked")
+ }
+ return false
+ }
+
+ return true
+ })
+
+ return result, nil
+}
+
+func checkAssignStmt(pass *analysis.Pass, result *Panicable, n *ast.AssignStmt) bool {
+ tae := findTypeAssertion(n.Rhs)
+ if tae == nil {
+ return true
+ }
+
+ switch {
+ // if right hand has 2 or more values, assign statement can't assert boolean value which describes type assertion is succeeded
+ case len(n.Rhs) > 1:
+ pass.Reportf(n.Pos(), "right hand must be only type assertion")
+ return false
+ case len(n.Lhs) != 2 && tae.Type != nil:
+ result.m[n] = true
+ result.nodes = append(result.nodes, n)
+ pass.Reportf(n.Pos(), "type assertion must be checked")
+ return false
+ case len(n.Lhs) == 2:
+ return false
+ }
+
+ return true
+}
+
+func checkValueSpec(pass *analysis.Pass, result *Panicable, n *ast.ValueSpec) bool {
+ tae := findTypeAssertion(n.Values)
+ if tae == nil {
+ return true
+ }
+
+ switch {
+ // if right hand has 2 or more values, assign statement can't assert boolean value which describes type assertion is succeeded
+ case len(n.Values) > 1:
+ pass.Reportf(n.Pos(), "right hand must be only type assertion")
+ return false
+ case len(n.Names) != 2 && tae.Type != nil:
+ result.m[n] = true
+ result.nodes = append(result.nodes, n)
+ pass.Reportf(n.Pos(), "type assertion must be checked")
+ return false
+ case len(n.Names) == 2:
+ return false
+ }
+
+ return true
+}
+
+func findTypeAssertion(exprs []ast.Expr) *ast.TypeAssertExpr {
+ for _, expr := range exprs {
+ var typeAssertExpr *ast.TypeAssertExpr
+ ast.Inspect(expr, func(n ast.Node) bool {
+ switch n := n.(type) {
+ case *ast.FuncLit:
+ return false
+ case *ast.TypeAssertExpr:
+ typeAssertExpr = n
+ return false
+ }
+ return true
+ })
+ if typeAssertExpr != nil {
+ return typeAssertExpr
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/gostaticanalysis/forcetypeassert/go.mod b/vendor/github.com/gostaticanalysis/forcetypeassert/go.mod
new file mode 100644
index 000000000..32b9c14a8
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/forcetypeassert/go.mod
@@ -0,0 +1,5 @@
+module github.com/gostaticanalysis/forcetypeassert
+
+go 1.12
+
+require golang.org/x/tools v0.0.0-20190321232350-e250d351ecad
diff --git a/vendor/github.com/gostaticanalysis/forcetypeassert/go.sum b/vendor/github.com/gostaticanalysis/forcetypeassert/go.sum
new file mode 100644
index 000000000..7a25fbce3
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/forcetypeassert/go.sum
@@ -0,0 +1,6 @@
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190321232350-e250d351ecad h1:tYrC3aF7wTeS1noni7wCGu94xeMVu0dxOdFufzx/VM8=
+golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
diff --git a/vendor/github.com/gostaticanalysis/nilerr/LICENSE b/vendor/github.com/gostaticanalysis/nilerr/LICENSE
new file mode 100644
index 000000000..bf7e33db8
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/nilerr/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 GoStaticAnalysis
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/gostaticanalysis/nilerr/README.md b/vendor/github.com/gostaticanalysis/nilerr/README.md
new file mode 100644
index 000000000..d6b4acf8b
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/nilerr/README.md
@@ -0,0 +1,41 @@
+# nilerr
+
+[![pkg.go.dev][gopkg-badge]][gopkg]
+
+`nilerr` finds code which returns nil even though it checks that error is not nil.
+
+```go
+func f() error {
+ err := do()
+ if err != nil {
+ return nil // miss
+ }
+}
+```
+
+`nilerr` also finds code which returns error even though it checks that error is nil.
+
+```go
+func f() error {
+ err := do()
+ if err == nil {
+ return err // miss
+ }
+}
+```
+
+`nilerr` ignores code which has a miss with ignore comment.
+
+```go
+func f() error {
+ err := do()
+ if err != nil {
+ //lint:ignore nilerr reason
+ return nil // ignore
+ }
+}
+```
+
+<!-- links -->
+[gopkg]: https://pkg.go.dev/github.com/gostaticanalysis/nilerr
+[gopkg-badge]: https://pkg.go.dev/badge/github.com/gostaticanalysis/nilerr?status.svg
diff --git a/vendor/github.com/gostaticanalysis/nilerr/go.mod b/vendor/github.com/gostaticanalysis/nilerr/go.mod
new file mode 100644
index 000000000..d4ed85c98
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/nilerr/go.mod
@@ -0,0 +1,8 @@
+module github.com/gostaticanalysis/nilerr
+
+go 1.15
+
+require (
+ github.com/gostaticanalysis/comment v1.4.1
+ golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6
+)
diff --git a/vendor/github.com/gostaticanalysis/nilerr/go.sum b/vendor/github.com/gostaticanalysis/nilerr/go.sum
new file mode 100644
index 000000000..93690fa9e
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/nilerr/go.sum
@@ -0,0 +1,34 @@
+github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/gostaticanalysis/comment v1.4.1 h1:xHopR5L2lRz6OsjH4R2HG5wRhW9ySl3FsHIvi5pcXwc=
+github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6 h1:rbvTkL9AkFts1cgI78+gG6Yu1pwaqX6hjSJAatB78E4=
+golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/vendor/github.com/gostaticanalysis/nilerr/nilerr.go b/vendor/github.com/gostaticanalysis/nilerr/nilerr.go
new file mode 100644
index 000000000..787a9e1e9
--- /dev/null
+++ b/vendor/github.com/gostaticanalysis/nilerr/nilerr.go
@@ -0,0 +1,291 @@
+package nilerr
+
+import (
+ "fmt"
+ "go/token"
+ "go/types"
+
+ "github.com/gostaticanalysis/comment"
+ "github.com/gostaticanalysis/comment/passes/commentmap"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/buildssa"
+ "golang.org/x/tools/go/ssa"
+)
+
+var Analyzer = &analysis.Analyzer{
+ Name: "nilerr",
+ Doc: Doc,
+ Run: run,
+ Requires: []*analysis.Analyzer{
+ buildssa.Analyzer,
+ commentmap.Analyzer,
+ },
+}
+
+const Doc = "nilerr checks returning nil when err is not nil"
+
+func run(pass *analysis.Pass) (interface{}, error) {
+ funcs := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs
+ cmaps := pass.ResultOf[commentmap.Analyzer].(comment.Maps)
+
+ reportFail := func(v ssa.Value, ret *ssa.Return, format string) {
+ pos := ret.Pos()
+ line := getNodeLineNumber(pass, ret)
+ errLines := getValueLineNumbers(pass, v)
+ if !cmaps.IgnoreLine(pass.Fset, line, "nilerr") {
+ var errLineText string
+ if len(errLines) == 1 {
+ errLineText = fmt.Sprintf("line %d", errLines[0])
+ } else {
+ errLineText = fmt.Sprintf("lines %v", errLines)
+ }
+ pass.Reportf(pos, format, errLineText)
+ }
+ }
+
+ for i := range funcs {
+ for _, b := range funcs[i].Blocks {
+ if v := binOpErrNil(b, token.NEQ); v != nil {
+ if ret := isReturnNil(b.Succs[0]); ret != nil {
+ if !usesErrorValue(b.Succs[0], v) {
+ reportFail(v, ret, "error is not nil (%s) but it returns nil")
+ }
+ }
+ } else if v := binOpErrNil(b, token.EQL); v != nil {
+ if len(b.Succs[0].Preds) == 1 { // if there are multiple conditions, this may be false positive
+ if ret := isReturnError(b.Succs[0], v); ret != nil {
+ reportFail(v, ret, "error is nil (%s) but it returns error")
+ }
+ }
+ }
+
+ }
+ }
+
+ return nil, nil
+}
+
+func getValueLineNumbers(pass *analysis.Pass, v ssa.Value) []int {
+ if phi, ok := v.(*ssa.Phi); ok {
+ result := make([]int, 0, len(phi.Edges))
+ for _, edge := range phi.Edges {
+ result = append(result, getValueLineNumbers(pass, edge)...)
+ }
+ return result
+ }
+
+ value := v
+ if extract, ok := value.(*ssa.Extract); ok {
+ value = extract.Tuple
+ }
+
+ pos := value.Pos()
+ return []int{pass.Fset.File(pos).Line(pos)}
+}
+
+func getNodeLineNumber(pass *analysis.Pass, node ssa.Node) int {
+ pos := node.Pos()
+ return pass.Fset.File(pos).Line(pos)
+}
+
+var errType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
+
+func binOpErrNil(b *ssa.BasicBlock, op token.Token) ssa.Value {
+ if len(b.Instrs) == 0 {
+ return nil
+ }
+
+ ifinst, ok := b.Instrs[len(b.Instrs)-1].(*ssa.If)
+ if !ok {
+ return nil
+ }
+
+ binop, ok := ifinst.Cond.(*ssa.BinOp)
+ if !ok {
+ return nil
+ }
+
+ if binop.Op != op {
+ return nil
+ }
+
+ if !types.Implements(binop.X.Type(), errType) {
+ return nil
+ }
+
+ if !types.Implements(binop.Y.Type(), errType) {
+ return nil
+ }
+
+ xIsConst, yIsConst := isConst(binop.X), isConst(binop.Y)
+ switch {
+ case !xIsConst && yIsConst: // err != nil or err == nil
+ return binop.X
+ case xIsConst && !yIsConst: // nil != err or nil == err
+ return binop.Y
+ }
+
+ return nil
+}
+
+func isConst(v ssa.Value) bool {
+ _, ok := v.(*ssa.Const)
+ return ok
+}
+
+func isReturnNil(b *ssa.BasicBlock) *ssa.Return {
+ if len(b.Instrs) == 0 {
+ return nil
+ }
+
+ ret, ok := b.Instrs[len(b.Instrs)-1].(*ssa.Return)
+ if !ok {
+ return nil
+ }
+
+ errorReturnValues := 0
+ for _, res := range ret.Results {
+ if !types.Implements(res.Type(), errType) {
+ continue
+ }
+
+ errorReturnValues++
+ v, ok := res.(*ssa.Const)
+ if !ok {
+ return nil
+ }
+
+ if !v.IsNil() {
+ return nil
+ }
+ }
+
+ if errorReturnValues == 0 {
+ return nil
+ }
+
+ return ret
+}
+
+func isReturnError(b *ssa.BasicBlock, errVal ssa.Value) *ssa.Return {
+ if len(b.Instrs) == 0 {
+ return nil
+ }
+
+ ret, ok := b.Instrs[len(b.Instrs)-1].(*ssa.Return)
+ if !ok {
+ return nil
+ }
+
+ for _, v := range ret.Results {
+ if v == errVal {
+ return ret
+ }
+ }
+
+ return nil
+}
+
+func usesErrorValue(b *ssa.BasicBlock, errVal ssa.Value) bool {
+ for _, instr := range b.Instrs {
+ if callInstr, ok := instr.(*ssa.Call); ok {
+ for _, arg := range callInstr.Call.Args {
+ if isUsedInValue(arg, errVal) {
+ return true
+ }
+
+ sliceArg, ok := arg.(*ssa.Slice)
+ if ok {
+ if isUsedInSlice(sliceArg, errVal) {
+ return true
+ }
+ }
+ }
+ }
+ }
+ return false
+}
+
+type ReferrersHolder interface {
+ Referrers() *[]ssa.Instruction
+}
+
+var _ ReferrersHolder = (ssa.Node)(nil)
+var _ ReferrersHolder = (ssa.Value)(nil)
+
+func isUsedInSlice(sliceArg *ssa.Slice, errVal ssa.Value) bool {
+ var valueBuf [10]*ssa.Value
+ operands := sliceArg.Operands(valueBuf[:0])
+
+ var valuesToInspect []ssa.Value
+ addValueForInspection := func(value ssa.Value) {
+ if value != nil {
+ valuesToInspect = append(valuesToInspect, value)
+ }
+ }
+
+ var nodesToInspect []ssa.Node
+ visitedNodes := map[ssa.Node]bool{}
+ addNodeForInspection := func(node ssa.Node) {
+ if !visitedNodes[node] {
+ visitedNodes[node] = true
+ nodesToInspect = append(nodesToInspect, node)
+ }
+ }
+ addReferrersForInspection := func(h ReferrersHolder) {
+ if h == nil {
+ return
+ }
+
+ referrers := h.Referrers()
+ if referrers == nil {
+ return
+ }
+
+ for _, r := range *referrers {
+ if node, ok := r.(ssa.Node); ok {
+ addNodeForInspection(node)
+ }
+ }
+ }
+
+ for _, operand := range operands {
+ addReferrersForInspection(*operand)
+ addValueForInspection(*operand)
+ }
+
+ for i := 0; i < len(nodesToInspect); i++ {
+ switch node := nodesToInspect[i].(type) {
+ case *ssa.IndexAddr:
+ addReferrersForInspection(node)
+ case *ssa.Store:
+ addValueForInspection(node.Val)
+ }
+ }
+
+ for _, value := range valuesToInspect {
+ if isUsedInValue(value, errVal) {
+ return true
+ }
+ }
+ return false
+}
+
+func isUsedInValue(value, lookedFor ssa.Value) bool {
+ if value == lookedFor {
+ return true
+ }
+
+ switch value := value.(type) {
+ case *ssa.ChangeInterface:
+ return isUsedInValue(value.X, lookedFor)
+ case *ssa.MakeInterface:
+ return isUsedInValue(value.X, lookedFor)
+ case *ssa.Call:
+ if value.Call.IsInvoke() {
+ return isUsedInValue(value.Call.Value, lookedFor)
+ }
+ }
+
+ return false
+}