#' Block usage of print() for logging
#'
#' The default print method for character vectors is appropriate for interactively inspecting objects,
#'   not for logging messages. Thus checked-in usage like `print(paste('Data has', nrow(DF), 'rows.'))`
#'   is better served by using [cat()], e.g. `cat(sprintf('Data has %d rows.\n', nrow(DF)))`. Note that
#'   using `cat()` entails supplying your own line returns; [glue::glue()] might be preferable
#'   to [sprintf()] for constructing templated strings. Alternatively, [writeLines()] can be used to
#'   print character vectors with their own line returns. Lastly, note that [message()] differs slightly
#'   from `cat()` in that it prints to `stderr` by default, not `stdout`, but is still a good option
#'   to consider for logging purposes.
#'
#' @examples
#' # will produce lints
#' lint(
#'   text = "print('a')",
#'   linters = print_linter()
#' )
#'
#' lint(
#'   text = "print(paste(x, 'y'))",
#'   linters = print_linter()
#' )
#'
#' # okay
#' lint(
#'   text = "print(x)",
#'   linters = print_linter()
#' )
#'
#' @evalRd rd_tags("print_linter")
#' @seealso [linters] for a complete list of linters available in lintr.
#' @export
print_linter <- make_linter_from_function_xpath(
  function_names = "print",
  xpath = "
    parent::expr[expr[2][
      STR_CONST
      or expr/SYMBOL_FUNCTION_CALL[
        text() = 'paste' or text() = 'paste0' or text() = 'sprintf'
      ]
    ]]
  ",
  lint_message =
    "Use cat() instead of print() logging messages. Use message() in cases calling for a signalled condition."
)
