func AppendTryBlock(block []ast.Stmt, node ast.Node, errBlock []ast.Stmt) []ast.Stmt { var try, call *ast.CallExpr var assign *ast.AssignStmt _err, _nil := ast.NewIdent("err"), ast.NewIdent("nil") // err != nil errNil := &ast.BinaryExpr{_err, 0, token.NEQ, _nil} // if errNil { stmt } ifBlock := &ast.IfStmt{0, nil, errNil, &ast.BlockStmt{0, errBlock, 0}, nil} switch n := node.(type) { case *ast.AssignStmt: assign = n try = n.Rhs[0].(*ast.CallExpr) case *ast.ExprStmt: try = n.X.(*ast.CallExpr) default: log.Fatalf("unhandled try() node type: %T\n", node) } if assign == nil { assign = &ast.AssignStmt{nil, 0, token.ASSIGN, nil} } call = StripTry(try) assign.Rhs = []ast.Expr{call} assign.Lhs = append(assign.Lhs, _err) block = append(block, assign) block = append(block, ifBlock) return block }