Releases: WhatsApp/erlang-language-platform
2026-02-27
Highlights
- EqWAlizer support for iterators in map generators and list comprehensions
- Fixes to align ELP's scope resolution with that of OTP
- EqWAlizer docs now available on ELP website
- Remove output of successful tests from test suite results run via IDE code lenses
- Various bug fixes and performance improvements
Full Changelog
3a65019 Bump OSS VS Code extension version to 0.50.0 (Katie Ots)
052824b Use .expect() more consistently (Tom Davies)
2440bda Disable jemalloc on Windows in CI by building with --no-default-features (Alan Zimmerman)
d5d2d79 BE: clean up comments from ssr tests (Alan Zimmerman)
ee822f0 BE: ssr: Remove SsrPlaceholder from HIR, detect placeholders from Var at use site (Alan Zimmerman)
2926cbe BE: fix first-line-only test to cater for auto-formated expect files (Alan Zimmerman)
5562dc1 Add W0072 diagnostic: encode_hex_with_case (Brian Suh (WhatsApp))
f2c9349 BE: ssr: Fix receive/after placeholder matching missing timeout expression (Alan Zimmerman)
3805f54 BE: ssr: Fix try/catch placeholder matching missing catch clause bodies (Alan Zimmerman)
8ebaab5 BE: ssr: Extend tests to verify placeholder bindings, not just matched text (Alan Zimmerman)
ca13d84 BE: Migrate missing_separator diagnostic to trait-based Linter approach (Alan Zimmerman)
a711522 17/n ifdef: Make def_map ifdef-aware by breaking the preprocessor–def_map salsa cycle (Alan Zimmerman)
e626789 16/n ifdef: Add is_form_active_with_env for cross-file context (Alan Zimmerman)
fe01aee 15/n ifdef: Fix MacroExpCtx to search past includes (Alan Zimmerman)
46b4ade skip formatting for main::lint_reports_bxl_project_error to fix CI (Alan Zimmerman)
9dc6514 Add W0071 diagnostic: redundant_fun_wrapper (Brian Suh (WhatsApp))
bdae4aa Bump ajv to 6.14.0 in website (Katie Ots)
7d36126 Add inline nested list comprehension diagnostic (Tom Davies)
36eb5fb Fix lambda head binding scoping rules (Tom Davies)
c17d38e Do not fail compilation if eqwalizer docs are not available (Roberto Aloi)
6117b05 14/n ifdef: Populate ConditionEnv.resolved_include (Alan Zimmerman)
de24005 13/n ifdef: Add LSP config setting for new ifdef feature (Alan Zimmerman)
26281af 12/n ifdef: Add --new-ifdef CLI flag and thread it through project loading (Alan Zimmerman)
84168cd 11/n ifdef: Add comprehensive tests for preprocessor condition evaluation (Alan Zimmerman)
6e9c5a0 10/n ifdef: Add W0061/W0062 diagnostics for invalid preprocessor conditions (Alan Zimmerman)
c3a7505 BE: fix formatting (Alan Zimmerman)
2a47b09 BE: fix failing buck test on master (Alan Zimmerman)
b28f366 9/n ifdef: Integrate condition evaluation into macro resolution (Alan Zimmerman)
f3fd62b 8/n ifdef: Add salsa queries and top-level preprocessor analysis driver (Alan Zimmerman)
4aa9406 7/n ifdef: Add AST-to-ConditionExpr lowering (Alan Zimmerman)
a510d4a 6/n ifdef: Add HIR lowering for condition expressions (Alan Zimmerman)
dd14a4c Use should_panic for hierarchical config tests until it's implemented (#167) (Roberto Aloi)
caf810a BE: Add pattern matching support to SnapshotSettings (Alan Zimmerman)
73ad900 BE: Unify simple_snapshot* helpers with SnapshotSettings (Alan Zimmerman)
caf2a56 5/n ifdef: Add ConditionExpr types and evaluation (Alan Zimmerman)
4e948e1 4/n ifdef: Guard ConditionEnv creation behind new_ifdef flag (Alan Zimmerman)
db9d4f5 3/n ifdef: Add FormPPContext/ConditionEnv types and environment tracking (Alan Zimmerman)
36afb39 Fix formatting error (Roberto Aloi)
02a0dbb BE: Introduce SnapshotSettings builder for test helpers (Alan Zimmerman)
c0deb9c Bump ajv from 6.12.6 to 6.14.0 in /editors/code (#165) (dependabot[bot])
93ca7ab Remove unnecessary check for "old bifs" (Roberto Aloi)
b06b608 Update lint_reports_bxl_project_error test to check first line only (Alan Zimmerman)
3e402c9 Remove redundant --in-place flag (Katie Ots)
6aac779 BE: remove ignored dialyzer_cli test (Alan Zimmerman)
098671e BE: remove ignored build_info_json_buck_bxl_generated test (Alan Zimmerman)
94f7838 Add support for lists:map/2 when the functional argument is not a lambda literal (Tom Davies)
eafff63 Introduce no_and_or (W0069) linter (Roberto Aloi)
fc4f4f7 Do not mark the diagnostics.rs file as generated (Roberto Aloi)
0ee671d 8/n scope: Fix comprehension generator scoping to match elp_lint.erl (Alan Zimmerman)
8439cfd 7/n scope: Special-case orelse/andalso for sequential scoping (Alan Zimmerman)
93e4a5b 6/n scope: Fix BinaryOp to use parallel scoping (Alan Zimmerman)
5cddc2d 5/n scope: Fix maybe expression — don't leak condition bindings (Alan Zimmerman)
f3874eb 4/n scope: Pass expr_vt to of-clauses in try expression (Alan Zimmerman)
0691219 3/n scope: Fix receive-after scope structure (Alan Zimmerman)
899a5b8 2/n scope: Remove unnecessary guard scope creation in Closure handler (Alan Zimmerman)
55281bf 1/n scope: Remove unnecessary guard scope creation in compute_clause_scopes (Alan Zimmerman)
7356f10 Fix extract_variable assist scope handling in comprehensions (Alan Zimmerman)
0ae8a9a Update docs for W0065 (Tom Davies)
7f76bca 2/n ifdef: Rename cond to pp_ctx (Alan Zimmerman)
232dbb4 Updating hashes (Open Source Bot)
b5f439d 1/n ifdef: Add MacroEnvironment and PreprocessorState types (Alan Zimmerman)
7107592 Ensure submodules are available when building the website (#164) (Roberto Aloi)
c1e2bcb BE: remove ignore from tests from ide_ssr crate (Alan Zimmerman)
05ea38f Add missing ms_transform include diagnostic (Tom Davies)
d2a82af Add linter for migrating lists:map/2 to list comprehensions (Tom Davies)
6caf25e Re-sync with internal repository (#163) (Facebook Community Bot)
8048772 Expose eqwalizer docs via the ELP website (Roberto Aloi)
4f2d01a BE: remove ignored tests in buck.rs (Alan Zimmerman)
5694690 BE: remove ignore from test in macro_precedence_suprise (Alan Zimmerman)
ae944b7 BE: remove ignore from test in ets_lookup_to_lookup_element (Alan Zimmerman)
94fc31c Updating hashes (Open Source Bot)
92e33e8 Re-sync with internal repository (#162) (Facebook Community Bot)
b022199 Log all fields in BuckQueryError::fmt when no buck_ui_url (Alan Zimmerman)
9dd61fa Support iterators in map generators (Victor Lanvin)
de47776 Snapshot -- iterator in list comprehension (Victor Lanvin)
07fcebb Ensure all Erlang files are correctly formatted (Daniel Gorin)
7205f2b Updating hashes (Open Source Bot)
f959da2 Add doc links for -compile and -dialyzer attributes (Tom Davies)
9767bf5 InefficientListEmptyCheckLinter: detect reversed operand patterns (Tom Davies)
6b1cc54 Remove unused xtask graph functionality (Roberto Aloi)
b9e4cb6 Add BUCK file for elp crate (Roberto Aloi)
b56061e Make jemalloc conditional on build system (Roberto Aloi)
6fcb0da Expose test projects as fixtures (Roberto Aloi)
1a39c1d Migrate map_insertion_to_syntax to SsrLinter (Tom Davies)
171c338 Migrate map_find_to_syntax to SsrLinter (Tom Davies)
2793484 Migrate inefficient_{flatlength|last} to SsrLinter (Tom Davies)
43eb7e4 Migrate inefficient_enumerate to SsrLinter (Tom Davies)
9ca066e Add per-project telemetry details to project_size event (Marc-André Poulin)
7e7a9b2 Migrate equality_check_with_unnecessary_operator to SsrLinter (Tom Davies)
67335d5 Make unspecific_include description more specific (Tom Davies)
8072c5f BE: ssr: Compute SSR patterns once via lazy_static (Alan Zimmerman)
538989b Bump qs from 6.14.1 to 6.14.2 in /website (#161) (dependabot[bot])
7c96232 Replace 'or' with 'orelse' in elp_io_string (Alexander Shturm)
6009936 Tweak elp_development.md LLM rules (Alan Zimmerman)
5d5f9a9 Fix formatting (Tom Davies)
be9df77 Add W0065 diagnostic for inefficient list empty checks (Tom Davies)
064b946 Bump bpaf from 0.7.9 to 0.7.10 (Roberto Aloi)
7da1ff3 yarn upgrade (Roberto Aloi)
3913e72 Factor out is_wildcard (Tom Davies)
695984c Remove 'print passing details' from suite runs (Katie Ots)
ac8a47f Add signal for ets:lookup/2 to ets:lookup_element/4 rewrites (Tom Davies)
2026-02-10
Highlights
- Add support for partially generated files
- Allow passing in an initial command in
elp shell - Add missing built-in type definitions for ranged integers
- Disable
sets_version_2linter for OTP 28 and higher - Upgrade LSP types from
0.93.01 to0.94.1` - Remove
--include-testsoption forelp ssr, and default totrue - Deprecate
--include-ct-diagnosticsoption forlintcommand - Several bug fixes and performance improvements
Full Changelog
f028b38 Bump OSS VS Code extension version to 0.49.0 (Roberto Aloi)
d80b7ac Bump time from 0.3.41 to 0.3.47 (#159) (dependabot[bot])
912ab9d Deprecate --include-ct-diagnostics option for lint command (Roberto Aloi)
4a40779 Improve test for custom function match inclusion (Roberto Aloi)
2215441 Create BUCK file for the ide crate (Roberto Aloi)
72e4df0 Add support for partially generated files (Roberto Aloi)
ec4b71f Fix filter_next clippy lint in test (David Tolnay)
dcdfeb4 Update lsp-types from 0.93.0 to 0.94.1 (Roberto Aloi)
963b5e2 Create BUCK file for the eqwalizer crate (Roberto Aloi)
e39e3eb Add support for guards and strictness on UnnecessaryMapFromListAroundComprehensionLinter (Tom Davies)
e751cb2 Add support for guards and strictness on UnnecessaryMapToListInComprehensionLinter (Tom Davies)
192b33c Create BUCK file for the ide_db crate (Roberto Aloi)
5b3171b Create BUCK file for erlang_service crate (Roberto Aloi)
3b0f13f Fix false positive in bound_variable diagnostic (Roberto Aloi)
3565f72 BE: remove slow-tests buck_tests.rs (Alan Zimmerman)
3e6570b Refactor rebar3 parts of build.rs into a separate function (Roberto Aloi)
d0ed52b Fix dependabot alert for eslint (#156) (Alan Zimmerman)
7475149 Remove unnecessary syntax -> ide_db dependency (Roberto Aloi)
fe04379 BE: Update elp_development.md to prefer names from 'known(Alan Zimmerman) 6601c6a621 Update elp_diagnostic.md for trait-based Linters (Alan Zimmerman) 733e52f67c update Cargo.lock to match master (Alan Zimmerman) 4cf5f4835c Remove unused dependencies from base_db crate (Roberto Aloi) e70c173ee7 Create BUCK file for project_model crate (Roberto Aloi) 5e2ce50d61 convert W0037 unspecific_include to be a trait-based linter (Alan Zimmerman) 0850846af1 Add W0063 diagnostic for mixed strict/relaxed generators in zip (Katie Ots) f96281d5b1 Update elp_development.md to try prevent code duplication (Alan Zimmerman) 763554e404 Add guidance on combining multiple catch expressions (Roberto Aloi) c8414b11df Refactor URL fields to generic TaggedUrl struct (Katie Ots) af3cefdf97 BE: Add an error index entry for L0000 error in included file (Alan Zimmerman) 1308c5b466 Fix vulnerability due to lodash (Daniel Gorin) 865a785c7c Remove unused syntax dependencies (Roberto Aloi) ff289b5f39 Add missing built-in type definitions for ranged integers (Roberto Aloi) 6eb43acd1f tweak LLM rules around CLI arg deprecation (Alan Zimmerman) 74b0fe6e73 elp ssr: do not report matches not from the current file (Alan Zimmerman) acefad796c restore--include-testsargument toelp ssras a warning only (Alan Zimmerman) 4158d9b3de Restore deprecated --in-place flag with warning (Katie Ots) 168fa557da Fix lodash-es security vulnerability CVE-2025-13465 (Daniel Gorin) 56af3e26b7 BE: instruct LLM to warn when removing a CLI argument (Alan Zimmerman) 4c6e0b228a Create BUCK file for the erlang_service application/escript (Roberto Aloi) 061f5d4298 Bump toml crate to 0.9.11 (Roberto Aloi) 4ba877f205 Remove--include-testsoption forelp ssr`, and default true (Alan Zimmerman)
05944c4 manage HIR BodyDiagnostics (Alan Zimmerman)
d7967ea BE: Improve failing test result presentation (Alan Zimmerman)
3a5107c Disable sets_version_2 linter for OTP 28 and higher (Roberto Aloi)
aab8029 Bump diff from 5.2.0 to 5.2.2 in /editors/code (#152) (dependabot[bot])
bc4d8fc Improve the unspecific_include (W0037) error index entry (Alan Zimmerman)
08f31e7 fix unspecific_include in same app (Alan Zimmerman)
c53b8dd BE: Tweak elp_development to prefer expect! in tests (Alan Zimmerman)
335ac63 BE: improve failure reporting in diagnostic fixtures (Alan Zimmerman)
5a57f99 Remove FallBackToAll enum (Roberto Aloi)
d791468 shell: allow passing in an initial command (Michał Muskała)
38233e2 Bump jar stack size (Michał Muskała)
fdc5789 Ensure diff >=8.0.3 to address vulnerability (Roberto Aloi)
2026-01-15
Highlights
- Add ability to rename modules 🚀
- Remove redundant
--in-placeparameter fromelp lint --apply-fixcommand (thanks @katiejots) - Improve
eglotdocs (thanks @kbujari) - Add ability to exclude entire applications via the linting configuration file
- Fix folding over named funs
- Fix compatibility issue with latest version of rebar3
- Enable buck2 tests in CI
- Various bug fixes, stability and performance improvements
Full Changelog
da5ec8d Bump OSS VS Code extension version to 0.48.0 (Roberto Aloi)
a5a699a simplify ELP setup docs for eglot (Kleidi Bujari)
839cc4f Upgrade profile crate to latest available version (2026-01-12) (Roberto Aloi)
ec41a65 Upgrade paths, profile, stdx, vfs and vfs-notify crates to latest available RA version (2026-01-12) (Roberto Aloi)
788676b BE: fold: process Term::MacroCall arguments too (Alan Zimmerman)
a64b911 BE: fold: process closure name too (Alan Zimmerman)
dddd8aa Remove redundant --in-place flag (Katie Ots)
ca3cafe ][BE] Enable old EDoc syntax linter for tests by default (Roberto Aloi)
d37264c disable tests that fail on GH (#149) (Alan Zimmerman)
42663dd rebar3: also accept new macro format for version 3.26 (#148) (Alan Zimmerman)
903ab07 fix: eqwalizer.enable(d)_all typo (#147) (Marko Mindek)
e274b97 Use la-arena from crates.io (Roberto Aloi)
0a19c84 Make --in-place the default for elp lint --apply-fix (Katie Ots)
ca9b4f3 Re-sync with internal repository (#146) (Facebook Community Bot)
6f6b433 Vendor salsa-0.17.0-pre.2 third-party dependency (Roberto Aloi)
cf9f425 Vendor bpaf-0.7.10 third-party dependency (Roberto Aloi)
615c1c3 Vendor triple_accel-0.4.0 third-party dependency (Roberto Aloi)
5ae7bcd Vendor rowan-0.15.16 third-party dependency (Roberto Aloi)
598a69c Vendor eetf-0.9.0 third-party dependency (Roberto Aloi)
6f2792f Address dependabot alert for qs (Alan Zimmerman)
2a18e7e Convert unused_record_field to use trait (Roberto Aloi)
7a4eccf Add support for linter-specific excluded_apps (Roberto Aloi)
4bba415 Fix diagnostic name (Roberto Aloi)
6456f32 Ignore buck-out in test_projects (Roberto Aloi)
5c7cfae Only enable Buck2 project model tests if feature is enabled (Roberto Aloi)
220acfd Back out "Allow project discovery for OTP" (Alan Zimmerman)
fc09ff9 Enable buck2 tests on GitHub (Roberto Aloi)
8e82f1c Fix codegen_test test project for new buck root (Alan Zimmerman)
8cb6ac7 Re-sync with internal repository (#144) (Facebook Community Bot)
8b4c533 Convert EDoc syntax to plain comments in codegen_test_SUITE (Roberto Aloi)
b12cf72 Standalone Buck2 setup for test_projects (Roberto Aloi)
ce0125d 1/n: bound var in match: detect problem (Alan Zimmerman)
d7b1c56 Fix GH CI for OTP 26 (Alan Zimmerman)
3804bd1 Enable undefined_function linter in CI (prod only) (Roberto Aloi)
439ebad Rename edoc linter into old_edoc_syntax (Roberto Aloi)
54dd108 Do not run the old_edoc_syntax linter against test files by default (Roberto Aloi)
fa05043 Allow project discovery for OTP (#141) (Alan Zimmerman)
79c3348 Support for OTP version specific tests (Victor Lanvin)
7057624 elp lint: print diagnostics in the case we are not streaming and not applying a fix (Alan Zimmerman)
4a051d1 10/n: rename module: in defines RHS (Alan Zimmerman)
91a0d96 9/n: rename module: remote calls in original module (Alan Zimmerman)
cc0a9c2 8/n: rename module: well known function arguments (Alan Zimmerman)
83d5b4d 7/n: rename module: check module name in a call (Alan Zimmerman)
9015d80 6/n: rename module: external fun reference (Alan Zimmerman)
8997372 5/n: rename module: move original file (Alan Zimmerman)
bef3dd1 4/n: rename module: exported type references (Alan Zimmerman)
56e66e2 3/n: rename module: renaming function references (Alan Zimmerman)
a0e076c 2/n: rename module: simple rename works (Alan Zimmerman)
8ff602f 1/n rename module, basics (Alan Zimmerman)
4a83d0e BE: extract bound_vars_by_function as a method for sema (Alan Zimmerman)
271065d BE: for a fold, track the macro definition for ctx.in_macro (Alan Zimmerman)
37b7c5e Introduce top-level test directory (Roberto Aloi)
d4e1463 Do not run selected linters on tests by default (Roberto Aloi)
b2ea905 Updating hashes (Open Source Bot)
858b8e6 Re-sync with internal repository (#143) (Facebook Community Bot)
271a52c honour --include-generated for elp ssr (Alan Zimmerman)
ba4505e Do not run application_env linter on test suites (Roberto Aloi)
d2da476 Add test project for code gen (Alan Zimmerman)
166770c Remove logic for --include-tests, opt-in tests (Victor Lanvin)
b525eac Pass range to fixes callback (Roberto Aloi)
2bd3d57 Clean-up old error messages (Victor Lanvin)
eb5e0ab Install Buck2 in OSS CI workflow (Roberto Aloi)
887d287 tweak elp parse-elp --severity output (Alan Zimmerman)
2025-12-12
Highlights
Maintenance release to solve an incorrect publishing of the previous release, due to transient infra errors.
Full Changelog
553c90d Bump OSS VS Code extension to 0.47.0 (Roberto Aloi)
a16af7e Update emacs eglot instructions (Alan Zimmerman)
0085fba Add --severity argument to elp parse-elp to limit output (Alan Zimmerman)
babf612 Bad occurrence typing with maps:foreach -- repro (Victor Lanvin)
2025-12-11
Highlights
Maintenance release, mostly to address some CI issues that caused 0.45.0 not to be fully published to the Microsoft marketplace.
Full Changelog
7b0b29a Temporarily ignore hierarchical_config tests (Roberto Aloi)
4bfedae BE: validate all test fixtures (Alan Zimmerman)
290b931 BE: validate test fixture (Alan Zimmerman)
0930edd BE: report malformed test fixture (Alan Zimmerman)
2d693f3 BE: restore expected test result to generate a panic (Alan Zimmerman)
0aef1f4 Update fixtures for OTP 26/28 (Victor Lanvin)
29c017c Polish extension README, improve package.json for discoverability (Roberto Aloi)
ed8820b Update Intel runners to mac-15-interl (Roberto Aloi)
a239a32 Manually bump eqwalizer to the latest available version (#139) (Roberto Aloi)
a4ded31 Bump OSS VS Code extension to 0.46.0 (Roberto Aloi)
2025-12-10
Highlights
✨ New Features
📝 Renaming support for types and macros
⚡ Streaming results - elp lint now streams results for faster feedback
🎯 New unavailable_type diagnostic for Buck2 projects
📋 New lists_reverse_append linter
🔍 elp search is now a synonym for elp ssr
🎨 New --color argument to control ANSI color codes in CLI output
📊 Related diagnostic information now shown in non-JSON lint output
🐛 Bug Fixes and Stability Improvements
- Better IDE support for rebar3 projects
- Better include handling - Now reports
W0057andW0058for unresolved include files --diagnostic-filternow ensures specified linters run even if disabled by default- Fixed false positives for
undefined_functionlinter - Fixed off-by-one error in
elp lintdiagnostic output - Correctly report diagnostics from header files
- Fixed related information tracking in declarative tests
- Better file watch logging for project switch decisions
🤸 Community
🍺 Homebrew installation - Mac users can now install via Homebrew!
🌐 OpenVSX marketplace - VS Code extension now available on OpenVSX!
🌈 Improved Emacs eglot configuration for semantic tokens
🏗️ Internal Improvements
- Multiple linters converted to use trait-based architecture
- Fixed clippy warnings across the codebase
Full Changelog
6dbefe9 Add Homebrew installation instructions for Mac users (Roberto Aloi)
4df5a7a Bump OSS VS Code extension version to 0.45.0 (Roberto Aloi)
f6b5483 Convert malformed_include linter to use a trait (Roberto Aloi)
1a086de BE: args.color (Alan Zimmerman)
77e0ff9 Remove pre_parse_for_speed from elp eqwalize-all (Alan Zimmerman)
debed39 streaming results for elp lint (Alan Zimmerman)
c404d94 Update emacs eglot instructions for semantic tokens (#138) (Alan Zimmerman)
0f7069d Deprecate old error messages (Victor Lanvin)
e1296c5 Convert boolean_precedence linter to use a trait (Roberto Aloi)
4e6851c Convert misspelled_attribute linter to use a trait (Roberto Aloi)
61512bf Convert unused_include linter to use trait (Roberto Aloi)
4726f81 Convert missing_module linter to use a trait (Roberto Aloi)
016e0d7 Fix false positive for undefined_function linter (Roberto Aloi)
fd8fb4a Replace Duration::from_secs(240) to Duration::from_mins(4) (Eddie Shen)
c9cba57 Replace Duration::from_secs(60) to Duration::from_mins(1) (Eddie Shen)
796f015 Make it possible to run buck tests in isolation (Roberto Aloi)
d42e431 Add merge logic for linters configuration (Roberto Aloi)
9ef2fec Add test for hierarchical config support (Roberto Aloi)
3461b85 Improve emacs eglot config (Alan Zimmerman)
1fc2f63 Correctly report diagnostics from header file (Alan Zimmerman)
8bd2c5e Include related information in elp lint non-json output (Alan Zimmerman)
8558c9d Add tree_print for a whole module (Alan Zimmerman)
cbe9a05 update dependencies for dependabot (Alan Zimmerman)
e4b89eb BE: fix clippy warnings (Alan Zimmerman)
f80d503 remove --prefix command line argument (Alan Zimmerman)
eafb494 Convert edoc linter to use a trait (Roberto Aloi)
270b8f4 Fix support for rebar3 projects in IDE (Roberto Aloi)
89c0c87 Do not check for eqwalizer disappearing if we did not unpack it (Alan Zimmerman)
3e873e6 Make labels to denote test applications configurable (Roberto Aloi)
87bc60c Remove support for obsolete test_utils and elp_enabled Buck2 labels (Roberto Aloi)
38c84d3 Remove unclear bits of W0050 docs (Daniel Gorin)
7b124c7 Server: Impose a priority on next task selection (Alan Zimmerman)
06892be Add server telemetry for workspace statistics (Alan Zimmerman)
0da6ec3 Introduce elp --color argument to control ANSI color codes (Alan Zimmerman)
8997d5e Implement support for renaming types (Roberto Aloi)
4fa7b6c add internal rustfmt bin to elp cargo script (Cj Longoria)
8dbbd1f Back out "Fix failing test" (Alan Zimmerman)
fe49f6b Implement support for renaming macros (Roberto Aloi)
be0cb21 Make elp search a synonym for elp ssr (Alan Zimmerman)
0de5132 ssr: stream command line match results (Alan Zimmerman)
473c0f1 Fix failing test (Alan Zimmerman)
bc2c3f0 Require glob >=10.5.0 (Roberto Aloi)
0c2b43e ssr: add test explicitly using colour output (Alan Zimmerman)
fbdb3e1 ssr: Improve rendering of result (Alan Zimmerman)
5470044 Bump js-yaml from 4.1.0 to 4.1.1 and glob from 10.4.5 to 10.5.0 (Roberto Aloi)
9860cc8 Publish OSS extension to OpenVSX marketplace (Roberto Aloi)
5820634 Allow severity method to receive &Semantic and FileId as arguments (Roberto Aloi)
9950181 Remove text_edit crate (Roberto Aloi)
b25b590 Move tree-diff functionality from syntax to ide_db crate (Roberto Aloi)
1788ac7 Move Emacs configuration under editors (Roberto Aloi)
44409a4 Remove bench runner draft (Roberto Aloi)
7571e57 BE: fix off-by-one in elp lint diagnostic output (Alan Zimmerman)
77ff228 Convert macro_precedence_surprise linter to use a trait (Roberto Aloi)
e9a9035 Convert no_warn_suppressions linter to use a trait (Roberto Aloi)
5187bf3 Convert duplicate_module linter to use a trait (Roberto Aloi)
74ed6b2 Convert no_dialyzer_attribute linter to use a trait (Roberto Aloi)
cac1c95 Extend unavailable_type diagnostic to also scan record definitions (Roberto Aloi)
89ca280 Ensure that linters specified via --diagnostic-filter run, even if disabled by default (Roberto Aloi)
479c76c Add unavailable_type diagnostic (Roberto Aloi)
65de999 Updating hashes (Open Source Bot)
9a91229 Rollback submodule to enable syncing (Jon Janzen)
8efb4fe BE: track related info in declarative tests (Alan Zimmerman)
dcf4e3a add file_id to diagnostic RelatedInformation (Alan Zimmerman)
8394c84 Bump docusaurus to 3.9.2 (Daniel Gorin)
717422e Convert the no_catch linter to use a trait (Roberto Aloi)
30a9926 Convert the undocumented_function linter to use trait (Roberto Aloi)
20b8d99 Convert undocumented_module linter to use trait (Roberto Aloi)
aca24c8 Convert missing_compile_warn_missing_spec linter to use trait (Roberto Aloi)
276297e 6/n: include: do not report W0058 if is is already reported by the erlang service (Alan Zimmerman)
a8bb2de 5/n: include: report HIR unresolved include files W0058 (Alan Zimmerman)
ed67311 4/n: include: do not report W0057 if it is already reported by the erlang service (Alan Zimmerman)
42ef1d1 3/n: includes: convert HIR diagnostics into ide Diagnostic W0057 (Alan Zimmerman)
6fe7f10 2/n: includes: record macro expansion failures when lowering to HIR (Alan Zimmerman)
59ec8ab 1/n: includes: add not-yet-failing test case for nested include buck targets (Alan Zimmerman)
f050c6c Support calls to lists:nth/2 (Tom Davies)
395db3d Add lists_reverse_append linter (Roberto Aloi)
4486d66 Clarify tool usage for building and testing the project in elp_development.md (Alan Zimmerman)
f4b93ec Improve file watch logging destination (Alan Zimmerman)
c5263ed Re-sync with internal repository (#131) (Facebook Community Bot)
e0c5e94 Add file watch logging for project switch decisions (Alan Zimmerman)
b01a09f elp ssr: set info priority when --dump-config is set (Alan Zimmerman)
49fb231 BE: remove workspace reference to non-existent erl_ast crate (Alan Zimmerman)
412ccca Update elp_development.md to improve declarative test example (Alan Zimmerman)
85c1586 Add initial CLAUDE.md (Alan Zimmerman)
6f2ee22 buck2: Improve pop-up when the buck project is malformed (Alan Zimmerman)
4227771 CLI ssr: Add --dump-config for .elp_lint.toml config snippet (Alan Zimmerman)
2025-11-04
Highlights
- SSR (Semantic Search and Replace) improvements
- Allow specifying macros and parens stategies
- Allow multiple SSR patterns
- Improve performance
- Add quick start option for Buck2 projects
- Allow filtering of OTP apps during indexing
- Properly process changes to open configuration files
- Don't flag
infinitytimeouts in theno_sleeplinter - Fix duplicate ignore annotations for multiple violations on same line
- Newer eqWAlizer version
- Various bug fixes and performance improvements
Full Changelog
9e99f96 Update eqWAlizer submodule (#130) (Victor Lanvin)
5574029 Bump OSS VS Code extension to 0.44.0 (Roberto Aloi)
0bd94b6 BE: include diagnostic code in test fixtures (Alan Zimmerman)
5fd76eb Update elp_development.md to include declarative test fixtures (Alan Zimmerman)
d52138b Fix duplicate ignore annotations for multiple violations on same line (Rahul Jain)
1cc3af7 codemod_helper: save on some allocations (Michał Muskała)
8d1c120 no_sleep: don't flag infinity timeout (Michał Muskała)
ff680df Properly process changes to open configuration files (Alan Zimmerman)
90530e3 HIR: record parens for types (Rahul Jain)
a614445 CLI ssr: allow specifying macro and parens strategy (Alan Zimmerman)
0e9a488 Better support for maps:map (Victor Lanvin)
f37f27c Snapshot tests -- better maps:map/2 (Victor Lanvin)
52857fb Fix error message heuristic on unions of maps (Victor Lanvin)
37e8492 Useless error messages -- repro (Victor Lanvin)
88bb35f CLI ssr: allow specifying multiple SSR patterns (Alan Zimmerman)
4ba56bc fix BodySourceMap entries for lowering Expr::Paren/Pat::Paren (Alan Zimmerman)
77657ba BE: tree print with ranges (Alan Zimmerman)
bcde92c Add eglot to emacs docs (Kleidi Bujari)
217fa9a Fix occurrence typing for record/tuple unions (Victor Lanvin)
67416c1 Occurrence typing fails with tuple/record mix -- repro (Victor Lanvin)
1c125de use jar version for unoptimised builds (Michał Muskała)
71e2caa Remove opaque type tests (Victor Lanvin)
2d8eb17 Flatten remote unions too (Michał Muskała)
4fe43a6 tests for flattening remote unions (Michał Muskała)
c3c68c0 BE: Improve order of elp --help output (Alan Zimmerman)
9d86159 Improve the performance of elp ssr (Alan Zimmerman)
1c886bd buck: improve target classification for prelude vs third-party (Alan Zimmerman)
aa9a4fc Add timing telemetry to elp lint too (Alan Zimmerman)
87391f5 Fix OTP 28 CI (Victor Lanvin)
7be8ee4 do not discover projects in buck-out (Alan Zimmerman)
ed59eb5 buck: Applicable files for includes (Alan Zimmerman)
a269e11 Fix CI for OTP 28 (Victor Lanvin)
fec1192 Add elp ssr command (Alan Zimmerman)
46477ee Tweak telemetry manager test to not be flaky (Alan Zimmerman)
dfa958a 9/n: buck targets: report ELP restarts too in telemetry (Alan Zimmerman)
93317ca 8/n: buck targets: Integrate into server mode (Alan Zimmerman)
de65b59 7/n: buck targets: Add buck quick query to config options (Alan Zimmerman)
1f3885f 6/n: buck targets: dump target list for comparison (Alan Zimmerman)
f99edec 5/n: buck targets: propagate generated label (Alan Zimmerman)
8e2d255 4/n: buck targets: explicitly check for the prelude as a target, for origin (Alan Zimmerman)
2036282 3/n: buck targets; Improve CLI project-info output (Alan Zimmerman)
3bde45d 2/n: buck targets; initial struct for buck targets, and serde for it (Alan Zimmerman)
05c8cb0 1/n: buck targets; Add --buck-quick-start CLI argument (Alan Zimmerman)
efcfe7f Update eqWAlizer submodule (Victor Lanvin)
4aa19d3 Add @OTPVersionDependent tag support for tests (Victor Lanvin)
719f5e2 CLI: log timing, meta-only (Alan Zimmerman)
90281d7 Specify SSR match as Ad-Hoc diagnostic (Alan Zimmerman)
b39d8f0 Allow meta-only dynamic call patterns (Roberto Aloi)
61af236 Have the create_dynamic_call_patterns function take patterns as an input (Roberto Aloi)
41b9e1a Clean up unions with none() (Michał Muskała)
dd36ea1 Fix incorrect project load on go to def in thrift file (Alan Zimmerman)
ea25281 Fix OTP 26/28 fixtures (Victor Lanvin)
0b0dfa5 Fix occurrence typing for is_function/2 (Victor Lanvin)
379bfd6 Occurrence with is_function/2 -- snapshot tests (Victor Lanvin)
e8bd4fd Fix failing test (Alan Zimmerman)
0c723ff rustfmt update (Cj Longoria)
f2a95d7 Recommend release-thin profile for development (Roberto Aloi)
5fe7e93 Update docs to take into account eqwalizer as a submodule (Roberto Aloi)
6d8c160 check if a file is in a project when it opens (Alan Zimmerman)
f417b8a Tweak devmate rules to give a crate name to directory mapping (Alan Zimmerman)
fdbb4bf Allow filtering of OTP apps in indexing (Roberto Aloi)
86d61bd update rustfmt.toml for projects (Cj Longoria)
2025-10-21
Highlights
- Documentation for types on hover
- Do not report an
undefined_functionwarning if the module/function name is a variable - Do not mark the
deprecated_functiondiagnostics as experimental - Only cover the function name in the
deprecation_functionlinter - New eqWAlizer version
Full Changelog
d6f2636 Bump OSS VS Code extension version to 0.43.0 (Roberto Aloi)
d811a4f Add eqwalizer as submodule (#120) (Roberto Aloi)
621a3fd Introduce no_persistent_term linter (Roberto Aloi)
ff9791f Introduce helper to rename module from a call target (Roberto Aloi)
6bef355 Introduce method to extract module name range from a call expression (Roberto Aloi)
cfb0cc7 Skip -doc related tests in OTP 26 (Roberto Aloi)
5412625 Allow overriding is_enabled property via config for trait linters (Roberto Aloi)
dab22ff Re-add logic to report diagnostics as Severity::Disabled (Victor Lanvin)
4bde327 Fix CI for OTP 26,28 (Victor Lanvin)
c882b95 Improve typing of Pat = Var = Expr (Victor Lanvin)
562d30e Snapshots Pat = Var = Expr (Victor Lanvin)
07fe4f7 Define is_in_otp as a File method (Roberto Aloi)
bca196c Do not report an undefined function warning if the function name is a variable (Roberto Aloi)
7cf2eaf Do not mark deprecated functions diagnostics as experimental (Roberto Aloi)
7172056 Only cover the function name in the deprecation_function linter (Roberto Aloi)
2987704 Do not report an undefined function warning if the module name is a variable (Roberto Aloi)
80cbfe7 Enable documentation for types (Roberto Aloi)
a893656 BE:prioritise extract variable over extract function in UI (Alan Zimmerman)
2025-10-13
Highlights
Include dynamic calls when finding references
When using features such as find references, rename or call hierarchy, now common dynamic calls such as rpc:call/X or erlang:spawn/Xare also included. The list of supported dynamic calls is specified here.
Allow extract variable inside a macro call
You can now use the variable extraction function inside macro calls.
Reload project if a buck2 generated input changes
When using buck2 as a build tool, certain files could be dynamically generated. If an input used to generate files is modified, the project is reloaded, ensuring more accurate go to definition and other IDE features.
Allow excluding exclusion list for undefined_function linter via config
In certain cases (e.g. in presence of parse transformation) certain functions may incorrectly be recognized as *undefined& by the language server. It's now possible to exclude functions from the check via config. This allows keeping the signal enabled, while avoiding unnecessary noise. You can exclude entire modules or sets of functions by specifying in the .elp_lint.toml file:
[linters.undefined_function]
exclude = [
# All functions from the module
{type = "M", module = "my_module"},
# All functions named `my_function` in module `my_module`, independently from arity
{type = "MF", module = "my_module", function = "my_function"},
# The `my_module:my_function/3` function only
{type = "MFA", mfa = "my_module:my_function/3"},
]
Add new option to mark Erlang Service warnings as errors
If you want compiler warnings to be treated as errors in the IDE, you can now enable this behaviour via the .elp_lint.toml config file:
[erlang_service]
warnings_as_errors = true
Other improvements
- Add support for
--report-system-statstolintandparse-elpcommands - Only register dynamic capabilities once
- Bump tree-sitter-erlang version to 0.15
- Various bug fixes and performance improvements
Full Changelog
5937388 fix: including based on an application path requires include_lib (#118) (Tristan Sloughter)
0a1f82c Introduce simple_snapshot_output_contains helper, fix failing testcase (Roberto Aloi)
55a4aa6 Fix OSS compilation warnings (Roberto Aloi)
2b658e2 Extend memory analysis to lint command (Roberto Aloi)
747af17 Bump OSS VS Code extension for release (0.41.0 -> 0.42.0) (Roberto Aloi)
bba1512 Point Cargo.toml to tree-sitter-erlang crate (Roberto Aloi)
5471c71 Include per-query memory info when using --report-system-stats (Roberto Aloi)
bde2492 server: only register dynamic capabilities once (Alan Zimmerman)
e9c2cd4 Refactor extraction of exdoc links (Roberto Aloi)
aabdad4 Remove warnings due to ShipIt (Roberto Aloi)
4b44e20 Allow extract variable inside a macro call (Alan Zimmerman)
66612ad Remove obsolete Haskell E2E tests for the Erlang extension (Roberto Aloi)
293a2ac Update loader progress on percent change only (Alan Zimmerman)
98bba7a Fixed name of EQWALIZER_DIR variable (Roberto Aloi)
312319b Remove old arc diagnostics logic (Victor Lanvin)
5e1154d Cleanup references (Roberto Aloi)
47e7759 Fix some issues in WhatsApp ELP Glean (Yongchao Lyu)
1bbfa6c Improve linters documentation (Roberto Aloi)
742281a Bump tree-sitter-erlang version to 0.15 (Alan Zimmerman)
31e798f send explicit telemetry to track the time from the server starting to operational (Alan Zimmerman)
8ddb16f Add testcase showcasing the issue with dynamic calls from macros (Roberto Aloi)
3e25ccb Add a fact about the module info (Yongchao Lyu)
84ee71d Include dynamic calls when finding references (Roberto Aloi)
cb9f719 Use a FxHashMap to store the patterns of interest for dynamic calls and a macro to reduce verbosity (Roberto Aloi)
64fb3fb Include the most common 'erpc' functions when searching for dynamic calls (Roberto Aloi)
95dfeb4 Include some of the 'erlang' functions when searching for dynamic calls (Roberto Aloi)
3177337 Find references for rpc dynamic calls (Roberto Aloi)
bb49a57 Generalize lookup for dynamic calls (Roberto Aloi)
8805345 BE: Add oncalls metadata to elp_development LLMs rules (Alan Zimmerman)
1eb41cc Add support for docPath (Roberto Aloi)
57f6788 Pin 2022 version for Windows (Roberto Aloi)
dac0ab0 Fix broken VSCodeErlangOpenDocs E2E test (Roberto Aloi)
06fa2d0 Explicitly include rustfmt during setup (Roberto Aloi)
7bb16e4 Fix flaky tests using buck cell info (Alan Zimmerman)
06fc13b Add build-oss script (Roberto Aloi)
b4e24a8 Avoid compilation warning (Roberto Aloi)
ec97959 3/n: Reload project if a buck2 generated input changes (Alan Zimmerman)
f8c8cc5 2/n: Include watches for buck2 generated inputs (Alan Zimmerman)
6afb92e 1/n: Add field to track generation source file inputs for buck2 generated targets (Alan Zimmerman)
e27ffab Use buck2 cell info to resolve target directories (Alan Zimmerman)
14ae7af Add --report-system-stats to parse-elp command (Roberto Aloi)
3bff340 Convert wid_tuple linter to use trait (Roberto Aloi)
853d37f Do not attempt to import MetaOnly resources in OSS build (Roberto Aloi)
9323230 Add telemetry for textDocument/reference timing (Alan Zimmerman)
d9f02ee Split token identification and documentation extraction (Roberto Aloi)
e6b0c60 Track destination in telemetry for go-to-definition (Roberto Aloi)
03c28b4 Convert unused_macro linter to use new GenericLinter trait (Roberto Aloi)
63a2804 BE: Include a formatted start and end time stamp in telemetry (Alan Zimmerman)
91b432f BE: Provide explicit state change telemetry (Alan Zimmerman)
7f67904 BE: Use a vec for load telemetry (Alan Zimmerman)
f7e9bf9 Use local def_map in unused_macro linter (Roberto Aloi)
b32bd85 Convert cross_node_eval linter to use trait (Roberto Aloi)
ea45ecf BE: always check stderr in elp lint fix tests (Alan Zimmerman)
686d42f Add new option to mark Erlang Service warnings as errors (Roberto Aloi)
a849eaf buck2: Remove BuckTargetOrigin::Prelude (Alan Zimmerman)
cedda28 buck2: do not provide deps_targets to elp.bxl (Alan Zimmerman)
ee88849 Only show hover link to docs if the function has docs (Roberto Aloi)
1185d99 Specify exclusion list for undefined_function linter via config (Roberto Aloi)
314dbd6 Allow excluding function call matches via config (Roberto Aloi)
8d82b30 Allow function call linters to specify a list of matches to exclude from processing (Roberto Aloi)
a42d118 Convert undefined_function linter to use trait (Roberto Aloi)
545452c Provide an example of a poor translation from catch to try ... catch (Roberto Aloi)
679ed1f Return a &'static str for descriptions (Roberto Aloi)
39da159 Avoid passing sema and file_id since they are already part of the context (Roberto Aloi)
2e30b64 Rename is_match_valid into check_match (Roberto Aloi)
0f39e52 Convert no_forgets_api linter to use the Linter trait (Roberto Aloi)
92a009d Make tasks.json work for internal and OSS usage (Alan Zimmerman)%
2025-09-11
Highlights
- Improve code lenses for rebar3 projects
- Silent undefined function warnings for
lagerfunctions - Add could be a string literal linter
- Fix an issue where a newly added file would not be included in the Buck2 project
- Various bug fixes and performance improvements
Full Changelog
981d254 Add tasks for common ELP dev actions (Alan Zimmerman)
2edd919 Bump OSS VS Code extension for imminent release (Roberto Aloi)
ff9c0b8 Add support for interactive debugging for rebar3 projects (Roberto Aloi)
5ee1111 Mitigate false positive undefined function for lager (Roberto Aloi)
fb24c22 Add linter to find and fix expressions which could be string literals (Tom Davies)
a787db0 Partially fix escaping when pretty printing strings (Tom Davies)
1f0e955 detect new project source files (Alan Zimmerman)
a826c8c Fix OSS compilation of glean.rs (Roberto Aloi)
12ecfe5 Fix location of meta-only comment (Roberto Aloi)
ab12249 add gatekeeper for new links (Brian Suh (WhatsApp))
b1f429a add links to scuba (Brian Suh (WhatsApp))
d55260a add links to wam browser (Brian Suh (WhatsApp))
1897fe1 add links to logview (Brian Suh (WhatsApp))
6faa9f8 Ignore formatting to avoid fb_only/oss_only inconsistency (Roberto Aloi)
3caae92 Refactor definition of linters (Roberto Aloi)
26c8c30 Convert atoms exhaustion linter to use the FunctionCallLinter trait (Roberto Aloi)
2dc5420 Support custom fixes in FunctionCallLinter trait (Roberto Aloi)
2d6afac Allowing specifying a custom cli_severity/override (Roberto Aloi)
4361433 Avoid duplication in treating function / ssr linters (Roberto Aloi)
be360da Fix wording in W0030 diagnostic docs (dedicated maps:put/3 syntax) (Tom Davies)
2d8c4a0 Avoid duplication to extract linter conditions (Roberto Aloi)
6dbb64a Be able to override a linter's experimental property via config (Roberto Aloi)
a92b4ee Be able to override a linter's include_generated property via config (Roberto Aloi)
04ec06f Be able to override a linter's include_test property via config (Roberto Aloi)
1e49624 Be able to override diagnostic severities via config (Roberto Aloi)