aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/moricho/tparallel/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2021-02-22 20:37:25 +0100
committerDmitry Vyukov <dvyukov@google.com>2021-02-22 21:02:12 +0100
commitfcc6d71be2c3ce7d9305c04fc2e87af554571bac (patch)
treeb01dbb3d1e2988e28ea158d2d543d603ec0b9569 /vendor/github.com/moricho/tparallel/pkg
parent8f23c528ad5a943b9ffec5dcaf332fd0f614006e (diff)
go.mod: update golangci-lint to v1.37
Diffstat (limited to 'vendor/github.com/moricho/tparallel/pkg')
-rw-r--r--vendor/github.com/moricho/tparallel/pkg/ssafunc/ssafunc.go34
-rw-r--r--vendor/github.com/moricho/tparallel/pkg/ssainstr/ssainstr.go63
2 files changed, 97 insertions, 0 deletions
diff --git a/vendor/github.com/moricho/tparallel/pkg/ssafunc/ssafunc.go b/vendor/github.com/moricho/tparallel/pkg/ssafunc/ssafunc.go
new file mode 100644
index 000000000..5a8e637bd
--- /dev/null
+++ b/vendor/github.com/moricho/tparallel/pkg/ssafunc/ssafunc.go
@@ -0,0 +1,34 @@
+package ssafunc
+
+import (
+ "go/types"
+
+ "github.com/gostaticanalysis/analysisutil"
+ "github.com/moricho/tparallel/pkg/ssainstr"
+ "golang.org/x/tools/go/ssa"
+)
+
+// IsDeferCalled returns whether the given ssa.Function calls `defer`
+func IsDeferCalled(f *ssa.Function) bool {
+ for _, block := range f.Blocks {
+ for _, instr := range block.Instrs {
+ switch instr.(type) {
+ case *ssa.Defer:
+ return true
+ }
+ }
+ }
+ return false
+}
+
+// IsCalled returns whether the given ssa.Function calls `fn` func
+func IsCalled(f *ssa.Function, fn *types.Func) bool {
+ block := f.Blocks[0]
+ for _, instr := range block.Instrs {
+ called := analysisutil.Called(instr, nil, fn)
+ if _, ok := ssainstr.LookupCalled(instr, fn); ok || called {
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/moricho/tparallel/pkg/ssainstr/ssainstr.go b/vendor/github.com/moricho/tparallel/pkg/ssainstr/ssainstr.go
new file mode 100644
index 000000000..374553f5e
--- /dev/null
+++ b/vendor/github.com/moricho/tparallel/pkg/ssainstr/ssainstr.go
@@ -0,0 +1,63 @@
+package ssainstr
+
+import (
+ "go/types"
+
+ "github.com/gostaticanalysis/analysisutil"
+ "golang.org/x/tools/go/ssa"
+)
+
+// LookupCalled looks up ssa.Instruction that call the `fn` func in the given instr
+func LookupCalled(instr ssa.Instruction, fn *types.Func) ([]ssa.Instruction, bool) {
+ instrs := []ssa.Instruction{}
+
+ call, ok := instr.(ssa.CallInstruction)
+ if !ok {
+ return instrs, false
+ }
+
+ ssaCall := call.Value()
+ if ssaCall == nil {
+ return instrs, false
+ }
+ common := ssaCall.Common()
+ if common == nil {
+ return instrs, false
+ }
+ val := common.Value
+
+ called := false
+ switch fnval := val.(type) {
+ case *ssa.Function:
+ for _, block := range fnval.Blocks {
+ for _, instr := range block.Instrs {
+ if analysisutil.Called(instr, nil, fn) {
+ called = true
+ instrs = append(instrs, instr)
+ }
+ }
+ }
+ }
+
+ return instrs, called
+}
+
+// HasArgs returns whether the given ssa.Instruction has `typ` type args
+func HasArgs(instr ssa.Instruction, typ types.Type) bool {
+ call, ok := instr.(ssa.CallInstruction)
+ if !ok {
+ return false
+ }
+
+ ssaCall := call.Value()
+ if ssaCall == nil {
+ return false
+ }
+
+ for _, arg := range ssaCall.Call.Args {
+ if types.Identical(arg.Type(), typ) {
+ return true
+ }
+ }
+ return false
+}