aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/moricho/tparallel/pkg/ssainstr
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/ssainstr
parent8f23c528ad5a943b9ffec5dcaf332fd0f614006e (diff)
go.mod: update golangci-lint to v1.37
Diffstat (limited to 'vendor/github.com/moricho/tparallel/pkg/ssainstr')
-rw-r--r--vendor/github.com/moricho/tparallel/pkg/ssainstr/ssainstr.go63
1 files changed, 63 insertions, 0 deletions
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
+}