OXC.Lint.Rule behaviour (OXC v0.10.0)

Copy Markdown View Source

Behaviour for custom lint rules in Elixir.

Rules receive the parsed ESTree AST (from OXC.parse/2) and return diagnostics. Use OXC.walk/2, OXC.collect/2, or OXC.postwalk/3 for traversal.

Example

defmodule MyApp.NoConsoleLog do
  @behaviour OXC.Lint.Rule

  @impl true
  def meta do
    %{
      name: "my-app/no-console-log",
      description: "Disallow console.log in production code",
      category: :restriction,
      fixable: false
    }
  end

  @impl true
  def run(ast, _context) do
    OXC.collect(ast, fn
      %{
        type: :call_expression,
        callee: %{
          type: :member_expression,
          object: %{type: :identifier, name: "console"},
          property: %{type: :identifier, name: "log"}
        },
        start: start,
        end: stop
      } ->
        {:keep, %{span: {start, stop}, message: "Unexpected console.log"}}

      _ ->
        :skip
    end)
  end
end

Summary

Types

context()

@type context() :: %{source: String.t(), filename: String.t(), settings: map()}

diagnostic()

@type diagnostic() :: %{
  :span => {non_neg_integer(), non_neg_integer()},
  :message => String.t(),
  optional(:help) => String.t() | nil,
  optional(:labels) => [{non_neg_integer(), non_neg_integer()}],
  optional(:fix) => String.t() | nil
}

meta()

@type meta() :: %{
  name: String.t(),
  description: String.t(),
  category:
    :correctness
    | :suspicious
    | :pedantic
    | :perf
    | :style
    | :restriction
    | :nursery,
  fixable: boolean()
}

Callbacks

meta()

@callback meta() :: meta()

run(ast, context)

@callback run(ast :: map(), context :: context()) :: [diagnostic()]