## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----show_default_settings, echo = FALSE--------------------------------------
default_settings <- lintr::default_settings
default_settings$linters <- "`lintr::default_linters`"
default_settings$exclusions <- "(empty)"

make_string <- function(x) {
  if (inherits(x, "regex")) {
    paste0("regex: `", x, "`")
  } else {
    as.character(x)
  }
}

defaults_table <- data.frame(default = vapply(default_settings, make_string, character(1L)))

# avoid conflict when loading lintr in echo=TRUE cell below
rm(default_settings)

knitr::kable(defaults_table)

## ----show_linter_defaults, echo = FALSE---------------------------------------
library(lintr) # needed here for formalArgs

default_linters <- lintr::default_linters
linters_with_args <- lapply(
  setNames(nm = intersect(names(default_linters), lintr::available_linters(tags = "configurable")$linter)),
  formalArgs
)

make_setting_string <- function(linter_name) {
  linter_args <- linters_with_args[[linter_name]]
  if (is.null(linter_args)) {
    return("")
  }

  arglist <- vapply(linter_args, function(arg) {
    env <- environment(default_linters[[linter_name]])
    deparse(env[[arg]])
  }, character(1L))

  paste0(linter_args, " = ", arglist, collapse = ", ")
}

defaults_table <- data.frame(
  row.names = names(default_linters),
  settings = vapply(names(default_linters), make_setting_string, character(1L))
)

knitr::kable(defaults_table)

## ----show_tags----------------------------------------------------------------
lintr::available_tags(packages = "lintr")

## ----show_tag_linters---------------------------------------------------------
linters <- lintr::linters_with_tags(tags = c("package_development", "readability"))
names(linters)

## ----show_all_linter_names----------------------------------------------------
names(lintr::all_linters())

## ----programmatic_lintr-------------------------------------------------------
library(lintr)
linter_name <- "assignment_linter"

show_lint <- function(l) {
  lint_df <- as.data.frame(l)
  print(lint_df[, c("line_number", "message", "linter")])
}
hline <- function() cat(strrep("-", getOption("width") - 5L), "\n", sep = "")

withr::with_tempfile("tmp", {
  writeLines("a = 1", tmp)

  # linter column is just 'get'
  show_lint(lint(tmp, linters = get(linter_name)()))
  hline()

  this_linter <- get(linter_name)()
  attr(this_linter, "name") <- linter_name
  # linter column is 'assignment_linter'
  show_lint(lint(tmp, linters = this_linter))
  hline()

  # more concise alternative for this case: use eval(call(.))
  show_lint(lint(tmp, linters = eval(call(linter_name))))
})

## ----show_long_line_lint, echo = FALSE----------------------------------------
lint("X = 42L # -------------- this comment overflows the default 80 chars line length.\n",
  parse_settings = FALSE
)

## ----show_nolint, echo = FALSE------------------------------------------------
lint("X = 42L # nolint ------ this comment overflows the default 80 chars line length.\n",
  parse_settings = FALSE
)

## ----show_long_line_lint_not_skipped, echo = FALSE----------------------------
lint("X = 42L # nolint: object_name_linter. this comment overflows the default 80 chars line length.\n",
  parse_settings = FALSE
)

## ----show_nolint_multiple, echo = FALSE---------------------------------------
lint(
  paste(
    "X = 42L",
    "# nolint: object_name_linter, line_length_linter. this comment overflows the default 80 chars line length.\n"
  ),
  parse_settings = FALSE
)

## ----show_nolint_abbrev, echo = FALSE-----------------------------------------
lint(
  paste(
    "X = 42L",
    "# nolint: object_name, line_len. this comment still overflows the default 80 chars line length.\n"
  ),
  parse_settings = FALSE
)

## ----show_comment_code_lint, echo = FALSE-------------------------------------
lint("# x <- 42L\n# print(x)\n", parse_settings = FALSE)

## ----show_comment_code_nolint, echo = FALSE-----------------------------------
lint("# nolint start: commented_code_linter.\n# x <- 42L\n# print(x)\n# nolint end\n",
  parse_settings = FALSE
)

