Opinionated Erlang code formatter. Built with rebar3, runs on OTP 24+.
rebar3 compile # Compile
rebar3 ct # Run all tests (Common Test)
rebar3 ct --suite=test/erlfmt_SUITE --case=<test_name> # Run a single test
rebar3 dialyzer # Static type analysis
make check # Full check: compile, test, dialyzer, format checkThe getopt dependency is only available under the test and release profiles. Running rebar3 ct automatically triggers escriptize as a pre-hook.
make fmt # Self-format the project (builds release escript first)
make checkfmt # Check formatting without writingsrc/erlfmt_parse.erl is auto-generated from erlfmt_parse.yrl and excluded from formatting.
| File | Role |
|---|---|
erlfmt.erl |
Main module: escript entry (main/1), rebar3 plugin entry (init/1), API (format_file/2, format_string/2, read_nodes/1). Orchestrates the scan-parse-format pipeline. Also handles pragma logic and skip path for --require-pragma. |
erlfmt_scan.erl |
Scanner wrapping erl_scan. Detects shebangs, collects comments, enriches token annotations. |
erlfmt_parse.yrl |
Yecc grammar producing the custom AST (compiled to erlfmt_parse.erl). |
erlfmt_recomment.erl |
Re-inserts comments into the AST as pre_comments/post_comments/pre_dot_comments. |
erlfmt_format.erl |
Converts AST nodes to algebra documents via to_algebra/1. All layout rules live here. |
erlfmt_algebra.erl |
Document algebra engine |
erlfmt_cli.erl |
CLI option parsing, file glob expansion, parallel formatting execution. |
rebar3_fmt_prv.erl |
Rebar3 provider plugin for rebar3 fmt. |
Input -> Scanner (erlfmt_scan) -> Parser (erlfmt_parse)
-> Recommenter (erlfmt_recomment) -> Formatter (erlfmt_format)
-> Algebra renderer (erlfmt_algebra) -> Output
Uses Erlang Common Test. Main suite is erlfmt_SUITE.erl with test data in erlfmt_SUITE_data/.
Test patterns:
- Parser tests: parse strings and
?assertMatchon AST structure - Snapshot tests:
snapshot_same/2verifies idempotent formatting;snapshot_formatted/2compares.erlagainst.erl.formatted - Pragma tests: test
--require-pragma,--insert-pragma, and skip behavior - Error tests: verify error handling for invalid directives
- Range tests: test formatting of file subsets