From 3b53ed1577607446cc68167013613b2329c3ab26 Mon Sep 17 00:00:00 2001 From: Marek Kaput Date: Tue, 17 Feb 2026 15:11:58 +0100 Subject: [PATCH 1/2] fix: preserve fn newline metadata after semicolons Capture newline metadata for anonymous functions when the separator is a semicolon token that carries newline count. This aligns cases like `fn ;\n -> :ok end` with Elixir metadata while avoiding incorrect `newlines: 0` for same-line semicolons. Adds deterministic regression assertions in the property-regression test block. --- lib/spitfire.ex | 13 ++++++++++++- test/spitfire_test.exs | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/spitfire.ex b/lib/spitfire.ex index 50c54b9..51cb57f 100644 --- a/lib/spitfire.ex +++ b/lib/spitfire.ex @@ -2109,7 +2109,18 @@ defmodule Spitfire do trace "parse_anon_function", trace_meta(parser) do meta = current_meta(parser) - newlines = get_newlines(parser) + semicolon_newlines = + case peek_newlines(parser, :";") do + nl when is_integer(nl) and nl > 0 -> nl + _ -> nil + end + + newlines = + case peek_newlines(parser) || semicolon_newlines do + nil -> [] + nl -> [newlines: nl] + end + parser = parser |> next_token() |> eat_eoe() # fn creates its own stab scope diff --git a/test/spitfire_test.exs b/test/spitfire_test.exs index aeb8e42..1c9e9f1 100644 --- a/test/spitfire_test.exs +++ b/test/spitfire_test.exs @@ -2295,6 +2295,10 @@ defmodule SpitfireTest do # In-match operator (<-) in map keys - should be part of key, not wrap it assert Spitfire.parse("%{s\\\\r => 1}") == s2q("%{s\\\\r => 1}") + + # Fn args with semicolon/newline trivia + assert Spitfire.parse("fn ;\n -> :ok end") == s2q("fn ;\n -> :ok end") + assert Spitfire.parse("fn ; -> :ok end") == s2q("fn ; -> :ok end") end end From 100d8c7d569176245477142f45f5a81a1bfef7f3 Mon Sep 17 00:00:00 2001 From: Marek Kaput Date: Wed, 18 Feb 2026 09:27:50 +0100 Subject: [PATCH 2/2] fmt --- test/spitfire_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spitfire_test.exs b/test/spitfire_test.exs index 0698aba..0cdf80f 100644 --- a/test/spitfire_test.exs +++ b/test/spitfire_test.exs @@ -2299,7 +2299,7 @@ defmodule SpitfireTest do # Fn args with semicolon/newline trivia assert Spitfire.parse("fn ;\n -> :ok end") == s2q("fn ;\n -> :ok end") assert Spitfire.parse("fn ; -> :ok end") == s2q("fn ; -> :ok end") - + # Struct type with dot-call target assert Spitfire.parse("%e.(){}") == s2q("%e.(){}") assert Spitfire.parse("%e.(1){}") == s2q("%e.(1){}")