Skip to content

v2.1.0

Choose a tag to compare

@dannote dannote released this 06 May 00:01
· 135 commits to master since this release

New smell checks

  • Enum.at/2 inside loop — flags O(n) indexed access inside loops (O(n²) total)
  • List.delete_at/2 inside loop — same O(n²) concern
  • Enum.count/1 without predicate — suggests length/1 (avoids protocol dispatch)
  • Map.put with variable key and boolean — suggests MapSet for membership tracking
  • Map.values → Enum.all?/any?/find/filter/map — iterate the map directly
  • Enum.map → Enum.max/min/sum — allocates intermediate list; use *_by or reduce
  • List.foldl/3 — non-idiomatic; use Enum.reduce/3
  • String.graphemes → Enum.reverse → Enum.join — use String.reverse/1
  • Redundant negated guardwhen x != y after when x == y on same variables
  • Destructure then reconstruct[a, b, c] pattern reassembled as [a, b, c] in body

Fixed

  • Frontend crash on import Mod, only: :macros — atom values are now handled correctly
  • Frontend crash on macro-generated AST — bare atoms in with clauses, non-list else clauses, and non-list handler clauses no longer crash
  • Enum.count/1 false positive — piped predicate form (|> Enum.count(&pred)) no longer flagged
  • Dogfooded own smells — fixed 50 findings in Reach's own code

Improved

  • Stress-tested on 4500+ Hex packages with zero crashes