aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/sanposhiho
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2022-09-05 14:27:54 +0200
committerGitHub <noreply@github.com>2022-09-05 12:27:54 +0000
commitb2f2446b46bf02821d90ebedadae2bf7ae0e880e (patch)
tree923cf42842918d6bebca1d6bbdc08abed54d274d /vendor/github.com/sanposhiho
parente6654faff4bcca4be92e9a8596fd4b77f747c39e (diff)
go.mod, vendor: update (#3358)
* go.mod, vendor: remove unnecessary dependencies Commands: 1. go mod tidy 2. go mod vendor * go.mod, vendor: update cloud.google.com/go Commands: 1. go get -u cloud.google.com/go 2. go mod tidy 3. go mod vendor * go.mod, vendor: update cloud.google.com/* Commands: 1. go get -u cloud.google.com/storage cloud.google.com/logging 2. go mod tidy 3. go mod vendor * go.mod, .golangci.yml, vendor: update *lint* Commands: 1. go get -u golang.org/x/tools github.com/golangci/golangci-lint@v1.47.0 2. go mod tidy 3. go mod vendor 4. edit .golangci.yml to suppress new errors (resolved in the same PR later) * all: fix lint errors hash.go: copy() recommended by gosimple parse.go: ent is never nil verifier.go: signal.Notify() with unbuffered channel is bad. Have no idea why. * .golangci.yml: adjust godot rules check-all is deprecated, but still work if you're hesitating too - I'll remove this commit
Diffstat (limited to 'vendor/github.com/sanposhiho')
-rw-r--r--vendor/github.com/sanposhiho/wastedassign/v2/LICENSE21
-rw-r--r--vendor/github.com/sanposhiho/wastedassign/v2/README.md66
-rw-r--r--vendor/github.com/sanposhiho/wastedassign/v2/go.mod5
-rw-r--r--vendor/github.com/sanposhiho/wastedassign/v2/go.sum26
-rw-r--r--vendor/github.com/sanposhiho/wastedassign/v2/wastedassign.go272
5 files changed, 390 insertions, 0 deletions
diff --git a/vendor/github.com/sanposhiho/wastedassign/v2/LICENSE b/vendor/github.com/sanposhiho/wastedassign/v2/LICENSE
new file mode 100644
index 000000000..4ed7724fe
--- /dev/null
+++ b/vendor/github.com/sanposhiho/wastedassign/v2/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Kensei Nakada
+
+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/sanposhiho/wastedassign/v2/README.md b/vendor/github.com/sanposhiho/wastedassign/v2/README.md
new file mode 100644
index 000000000..cd2deedad
--- /dev/null
+++ b/vendor/github.com/sanposhiho/wastedassign/v2/README.md
@@ -0,0 +1,66 @@
+# wastedassign
+`wastedassign` finds wasted assignment statements
+
+found the value ...
+
+- reassigned, but never used afterward
+- reassigned, but reassigned without using the value
+
+## Example
+
+```go
+package main
+
+import "fmt"
+
+func f() int {
+ a := 0
+ b := 0
+ fmt.Print(a)
+ fmt.Print(b)
+ a = 1 // This reassignment is wasted, because never used afterwards. Wastedassign find this
+
+ b = 1 // This reassignment is wasted, because reassigned without use this value. Wastedassign find this
+ b = 2
+ fmt.Print(b)
+
+ return 1 + 2
+}
+```
+
+
+```bash
+$ go vet -vettool=`which wastedassign` sample.go
+# command-line-arguments
+./sample.go:10:2: assigned to a, but never used afterwards
+./sample.go:12:2: assigned to b, but reassigned without using the value
+```
+
+
+## Installation
+
+```
+go get -u github.com/sanposhiho/wastedassign/v2/cmd/wastedassign
+```
+
+## Usage
+
+```
+# in your project
+
+go vet -vettool=`which wastedassign` ./...
+```
+
+And, you can use wastedassign in [golangci-lint](https://github.com/golangci/golangci-lint).
+
+## Contribution
+
+I am waiting for your contribution :D
+
+Feel free to create an issue or a PR!
+
+### Run test
+
+```
+go test
+```
diff --git a/vendor/github.com/sanposhiho/wastedassign/v2/go.mod b/vendor/github.com/sanposhiho/wastedassign/v2/go.mod
new file mode 100644
index 000000000..32e5685f6
--- /dev/null
+++ b/vendor/github.com/sanposhiho/wastedassign/v2/go.mod
@@ -0,0 +1,5 @@
+module github.com/sanposhiho/wastedassign/v2
+
+go 1.14
+
+require golang.org/x/tools v0.1.0
diff --git a/vendor/github.com/sanposhiho/wastedassign/v2/go.sum b/vendor/github.com/sanposhiho/wastedassign/v2/go.sum
new file mode 100644
index 000000000..21d696a65
--- /dev/null
+++ b/vendor/github.com/sanposhiho/wastedassign/v2/go.sum
@@ -0,0 +1,26 @@
+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-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-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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/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.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+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-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/sanposhiho/wastedassign/v2/wastedassign.go b/vendor/github.com/sanposhiho/wastedassign/v2/wastedassign.go
new file mode 100644
index 000000000..e0c0da616
--- /dev/null
+++ b/vendor/github.com/sanposhiho/wastedassign/v2/wastedassign.go
@@ -0,0 +1,272 @@
+package wastedassign
+
+import (
+ "errors"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+ "golang.org/x/tools/go/ast/inspector"
+ "golang.org/x/tools/go/ssa"
+)
+
+const doc = "wastedassign finds wasted assignment statements."
+
+// Analyzer is the wastedassign analyzer.
+var Analyzer = &analysis.Analyzer{
+ Name: "wastedassign",
+ Doc: doc,
+ Run: run,
+ Requires: []*analysis.Analyzer{
+ inspect.Analyzer,
+ },
+}
+
+type wastedAssignStruct struct {
+ pos token.Pos
+ reason string
+}
+
+func run(pass *analysis.Pass) (interface{}, error) {
+ // Plundered from buildssa.Run.
+ prog := ssa.NewProgram(pass.Fset, ssa.NaiveForm)
+
+ // Create SSA packages for all imports.
+ // Order is not significant.
+ created := make(map[*types.Package]bool)
+ var createAll func(pkgs []*types.Package)
+ createAll = func(pkgs []*types.Package) {
+ for _, p := range pkgs {
+ if !created[p] {
+ created[p] = true
+ prog.CreatePackage(p, nil, nil, true)
+ createAll(p.Imports())
+ }
+ }
+ }
+ createAll(pass.Pkg.Imports())
+
+ // Create and build the primary package.
+ ssapkg := prog.CreatePackage(pass.Pkg, pass.Files, pass.TypesInfo, false)
+ ssapkg.Build()
+
+ var srcFuncs []*ssa.Function
+ for _, f := range pass.Files {
+ for _, decl := range f.Decls {
+ if fdecl, ok := decl.(*ast.FuncDecl); ok {
+
+ // SSA will not build a Function
+ // for a FuncDecl named blank.
+ // That's arguably too strict but
+ // relaxing it would break uniqueness of
+ // names of package members.
+ if fdecl.Name.Name == "_" {
+ continue
+ }
+
+ // (init functions have distinct Func
+ // objects named "init" and distinct
+ // ssa.Functions named "init#1", ...)
+
+ fn := pass.TypesInfo.Defs[fdecl.Name].(*types.Func)
+ if fn == nil {
+ return nil, errors.New("failed to get func's typesinfo")
+ }
+
+ f := ssapkg.Prog.FuncValue(fn)
+ if f == nil {
+ return nil, errors.New("failed to get func's SSA-form intermediate representation")
+ }
+
+ var addAnons func(f *ssa.Function)
+ addAnons = func(f *ssa.Function) {
+ srcFuncs = append(srcFuncs, f)
+ for _, anon := range f.AnonFuncs {
+ addAnons(anon)
+ }
+ }
+ addAnons(f)
+ }
+ }
+ }
+
+ typeSwitchPos := map[int]bool{}
+ inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ inspect.Preorder([]ast.Node{new(ast.TypeSwitchStmt)}, func(n ast.Node) {
+ if _, ok := n.(*ast.TypeSwitchStmt); ok {
+ typeSwitchPos[pass.Fset.Position(n.Pos()).Line] = true
+ }
+ })
+
+ var wastedAssignMap []wastedAssignStruct
+
+ for _, sf := range srcFuncs {
+ for _, bl := range sf.Blocks {
+ blCopy := *bl
+ for _, ist := range bl.Instrs {
+ blCopy.Instrs = rmInstrFromInstrs(blCopy.Instrs, ist)
+ if _, ok := ist.(*ssa.Store); !ok {
+ continue
+ }
+
+ var buf [10]*ssa.Value
+ for _, op := range ist.Operands(buf[:0]) {
+ if (*op) == nil || !opInLocals(sf.Locals, op) {
+ continue
+ }
+
+ reason := isNextOperationToOpIsStore([]*ssa.BasicBlock{&blCopy}, op, nil)
+ if reason == notWasted {
+ continue
+ }
+
+ if ist.Pos() == 0 || typeSwitchPos[pass.Fset.Position(ist.Pos()).Line] {
+ continue
+ }
+
+ v, ok := (*op).(*ssa.Alloc)
+ if !ok {
+ // This block should never have been executed.
+ continue
+ }
+ wastedAssignMap = append(wastedAssignMap, wastedAssignStruct{
+ pos: ist.Pos(),
+ reason: reason.String(v),
+ })
+ }
+ }
+ }
+ }
+
+ for _, was := range wastedAssignMap {
+ pass.Reportf(was.pos, was.reason)
+ }
+
+ return nil, nil
+}
+
+type wastedReason string
+
+const (
+ noUseUntilReturn wastedReason = "assigned, but never used afterwards"
+ reassignedSoon wastedReason = "wasted assignment"
+ notWasted wastedReason = ""
+)
+
+func (wr wastedReason) String(a *ssa.Alloc) string {
+ switch wr {
+ case noUseUntilReturn:
+ return fmt.Sprintf("assigned to %s, but never used afterwards", a.Comment)
+ case reassignedSoon:
+ return fmt.Sprintf("assigned to %s, but reassigned without using the value", a.Comment)
+ case notWasted:
+ return ""
+ default:
+ return ""
+ }
+}
+
+func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap map[int]int) wastedReason {
+ var wastedReasons []wastedReason
+ var wastedReasonsCurrentBls []wastedReason
+
+ if haveCheckedMap == nil {
+ haveCheckedMap = map[int]int{}
+ }
+
+ for _, bl := range bls {
+ if haveCheckedMap[bl.Index] == 2 {
+ continue
+ }
+
+ haveCheckedMap[bl.Index]++
+ breakFlag := false
+ for _, ist := range bl.Instrs {
+ if breakFlag {
+ break
+ }
+
+ switch w := ist.(type) {
+ case *ssa.Store:
+ var buf [10]*ssa.Value
+ for _, op := range ist.Operands(buf[:0]) {
+ if *op == *currentOp {
+ if w.Addr.Name() == (*currentOp).Name() {
+ wastedReasonsCurrentBls = append(wastedReasonsCurrentBls, reassignedSoon)
+ breakFlag = true
+ break
+ } else {
+ return notWasted
+ }
+ }
+ }
+ default:
+ var buf [10]*ssa.Value
+ for _, op := range ist.Operands(buf[:0]) {
+ if *op == *currentOp {
+ // It wasn't a continuous store.
+ return notWasted
+ }
+ }
+ }
+ }
+
+ if len(bl.Succs) != 0 && !breakFlag {
+ wastedReason := isNextOperationToOpIsStore(rmSameBlock(bl.Succs, bl), currentOp, haveCheckedMap)
+ if wastedReason == notWasted {
+ return notWasted
+ }
+ wastedReasons = append(wastedReasons, wastedReason)
+ }
+ }
+
+ wastedReasons = append(wastedReasons, wastedReasonsCurrentBls...)
+
+ if len(wastedReasons) != 0 && containReassignedSoon(wastedReasons) {
+ return reassignedSoon
+ }
+
+ return noUseUntilReturn
+}
+
+func rmSameBlock(bls []*ssa.BasicBlock, currentBl *ssa.BasicBlock) []*ssa.BasicBlock {
+ var rto []*ssa.BasicBlock
+
+ for _, bl := range bls {
+ if bl != currentBl {
+ rto = append(rto, bl)
+ }
+ }
+ return rto
+}
+
+func containReassignedSoon(ws []wastedReason) bool {
+ for _, w := range ws {
+ if w == reassignedSoon {
+ return true
+ }
+ }
+ return false
+}
+
+func rmInstrFromInstrs(instrs []ssa.Instruction, instrToRm ssa.Instruction) []ssa.Instruction {
+ var rto []ssa.Instruction
+ for _, i := range instrs {
+ if i != instrToRm {
+ rto = append(rto, i)
+ }
+ }
+ return rto
+}
+
+func opInLocals(locals []*ssa.Alloc, op *ssa.Value) bool {
+ for _, l := range locals {
+ if *op == ssa.Value(l) {
+ return true
+ }
+ }
+ return false
+}