func checkForFunctionExpr()

in hack/tools/logcheck/main.go [75:122]


func checkForFunctionExpr(fexpr *ast.CallExpr, pass *analysis.Pass, c *config) {

	fun := fexpr.Fun
	args := fexpr.Args

	/* we are extracting external package function calls e.g. klog.Infof fmt.Printf
	   and eliminating calls like setLocalHost()
	   basically function calls that has selector expression like .
	*/
	if selExpr, ok := fun.(*ast.SelectorExpr); ok {
		// extracting function Name like Infof
		fName := selExpr.Sel.Name

		// for nested function cases klog.V(1).Infof scenerios
		// if selExpr.X contains one more caller expression which is selector expression
		// we are extracting klog and discarding V(1)
		if n, ok := selExpr.X.(*ast.CallExpr); ok {
			if _, ok = n.Fun.(*ast.SelectorExpr); ok {
				selExpr = n.Fun.(*ast.SelectorExpr)
			}
		}

		// extracting package name
		pName, ok := selExpr.X.(*ast.Ident)

		if ok && pName.Name == "klog" {
			// Matching if any unstructured logging function is used.
			if !isUnstructured((fName)) {
				// if format specifier is used, check for arg length will most probably fail
				// so check for format specifier first and skip if found
				if checkForFormatSpecifier(fexpr, pass) {
					return
				}
				if fName == "InfoS" {
					isKeysValid(args[1:], fun, pass, fName)
				} else if fName == "ErrorS" {
					isKeysValid(args[2:], fun, pass, fName)
				}
			} else if !c.allowUnstructured {
				msg := fmt.Sprintf("unstructured logging function %q should not be used", fName)
				pass.Report(analysis.Diagnostic{
					Pos:     fun.Pos(),
					Message: msg,
				})
			}
		}
	}
}