Current section
Files
Jump to
Current section
Files
lib/syntax.ex
defmodule Credence.Syntax do
@moduledoc """
Syntax phase — fixes code that won't parse.
Only runs when `Code.string_to_quoted/1` fails. Delegates to rules
implementing `Credence.Syntax.Rule` behaviour.
"""
alias Credence.RuleHelpers
@spec analyze(String.t(), keyword()) :: [Credence.Issue.t()]
def analyze(source, _opts \\ []) do
case Code.string_to_quoted(source) do
{:ok, _ast} -> []
{:error, _} -> Enum.flat_map(rules(), & &1.analyze(source))
end
end
@spec fix(String.t(), keyword()) :: String.t()
def fix(source, _opts \\ []) do
case Code.string_to_quoted(source) do
{:ok, _ast} ->
source
{:error, _} ->
fixed = Enum.reduce(rules(), source, fn rule, src -> rule.fix(src) end)
# Verify fix actually helped — don't return mangled code
case Code.string_to_quoted(fixed) do
{:ok, _} -> fixed
{:error, _} -> fixed
end
end
end
defp rules do
RuleHelpers.discover_rules(Credence.Syntax.Rule)
end
end