 6a979fb40d
			
		
	
	
		6a979fb40d
		
			
		
	
	
	
	
		
			
			* update staticcheck Don't fork staticcheck: use the upstream version. Remove unneeded SSA loading. * Cache go/analysis facts Don't load unneeded packages for go/analysis. Repeated run of go/analysis linters now 10x faster (2s vs 20s on this repo) than before.
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package functions
 | |
| 
 | |
| import (
 | |
| 	"honnef.co/go/tools/ssa"
 | |
| )
 | |
| 
 | |
| func filterDebug(instr []ssa.Instruction) []ssa.Instruction {
 | |
| 	var out []ssa.Instruction
 | |
| 	for _, ins := range instr {
 | |
| 		if _, ok := ins.(*ssa.DebugRef); !ok {
 | |
| 			out = append(out, ins)
 | |
| 		}
 | |
| 	}
 | |
| 	return out
 | |
| }
 | |
| 
 | |
| // IsStub reports whether a function is a stub. A function is
 | |
| // considered a stub if it has no instructions or exactly one
 | |
| // instruction, which must be either returning only constant values or
 | |
| // a panic.
 | |
| func IsStub(fn *ssa.Function) bool {
 | |
| 	if len(fn.Blocks) == 0 {
 | |
| 		return true
 | |
| 	}
 | |
| 	if len(fn.Blocks) > 1 {
 | |
| 		return false
 | |
| 	}
 | |
| 	instrs := filterDebug(fn.Blocks[0].Instrs)
 | |
| 	if len(instrs) != 1 {
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	switch instrs[0].(type) {
 | |
| 	case *ssa.Return:
 | |
| 		// Since this is the only instruction, the return value must
 | |
| 		// be a constant. We consider all constants as stubs, not just
 | |
| 		// the zero value. This does not, unfortunately, cover zero
 | |
| 		// initialised structs, as these cause additional
 | |
| 		// instructions.
 | |
| 		return true
 | |
| 	case *ssa.Panic:
 | |
| 		return true
 | |
| 	default:
 | |
| 		return false
 | |
| 	}
 | |
| }
 |