1package irutil 2 3import ( 4 "honnef.co/go/tools/go/ir" 5) 6 7// IsStub reports whether a function is a stub. A function is 8// considered a stub if it has no instructions or if all it does is 9// return a constant value. 10func IsStub(fn *ir.Function) bool { 11 for _, b := range fn.Blocks { 12 for _, instr := range b.Instrs { 13 switch instr.(type) { 14 case *ir.Const: 15 // const naturally has no side-effects 16 case *ir.Panic: 17 // panic is a stub if it only uses constants 18 case *ir.Return: 19 // return is a stub if it only uses constants 20 case *ir.DebugRef: 21 case *ir.Jump: 22 // if there are no disallowed instructions, then we're 23 // only jumping to the exit block (or possibly 24 // somewhere else that's stubby?) 25 default: 26 // all other instructions are assumed to do actual work 27 return false 28 } 29 } 30 } 31 return true 32} 33