Credence.RuleHelpers (credence v0.5.0)

Copy Markdown

Shared utilities used by all three Credence phases (Syntax, Semantic, Pattern).

Provides rule discovery, diff computation, and change logging so the phase modules don't duplicate this plumbing.

Summary

Functions

Computes a line-by-line diff between two strings.

Returns all modules implementing behaviour, sorted by priority (lower first) with module name as tiebreaker for determinism.

Returns true if module declares behaviour in its @behaviour attribute.

Logs a before/after diff under a [credence_fix] prefix.

Returns the short name of a rule module for logging.

Functions

diff_lines(before, after_fix)

@spec diff_lines(String.t(), String.t()) :: [
  {:removed, pos_integer(), String.t()} | {:added, pos_integer(), String.t()}
]

Computes a line-by-line diff between two strings.

Returns a list of {:removed, line_no, text} and {:added, line_no, text} tuples for every line that changed.

discover_rules(behaviour)

@spec discover_rules(module()) :: [module()]

Returns all modules implementing behaviour, sorted by priority (lower first) with module name as tiebreaker for determinism.

iex> Credence.RuleHelpers.discover_rules(Credence.Pattern.Rule)
[Credence.Pattern.SomeRule, ...]

implements?(module, behaviour)

@spec implements?(module(), module()) :: boolean()

Returns true if module declares behaviour in its @behaviour attribute.

log_diff(label, before, after_fix)

@spec log_diff(String.t(), String.t(), String.t()) :: :ok

Logs a before/after diff under a [credence_fix] prefix.

Shows up to 10 changed lines; appends a count of remaining changes if the diff is larger.

rule_name(module)

@spec rule_name(module()) :: String.t()

Returns the short name of a rule module for logging.

iex> Credence.RuleHelpers.rule_name(Credence.Pattern.NoSortThenAt)
"NoSortThenAt"