From 2a0afcc5d0b7ecb47ff90cef2adddc2e48145230 Mon Sep 17 00:00:00 2001 From: Brian Cardarella Date: Tue, 23 Jul 2024 19:52:36 -0400 Subject: [PATCH] Add Sourceror.strip_meta/1 (#158) * Add Sourceror.strip_meta/1 * mix format --------- Co-authored-by: doorgan --- lib/sourceror.ex | 13 +++++++++++++ test/sourceror_test.exs | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/sourceror.ex b/lib/sourceror.ex index 51c1976..7b1aa7b 100644 --- a/lib/sourceror.ex +++ b/lib/sourceror.ex @@ -892,6 +892,19 @@ defmodule Sourceror do |> Enum.join() end + @doc """ + A convenience utility function for stripping all meta data out of + a quoted expression. This is useful when debugging for readability of very large + ASTs. + """ + @spec strip_meta(quoted :: Macro.t()) :: Macro.t() + def strip_meta(quoted) do + Macro.prewalk(quoted, [], fn + {name, _meta, args}, acc -> {{name, {}, args}, acc} + other, acc -> {other, acc} + end) + end + defp do_patch_string(lines, [], seen, _), do: Enum.reverse(lines) ++ seen defp do_patch_string([], _, seen, _), do: seen diff --git a/test/sourceror_test.exs b/test/sourceror_test.exs index c11ff5c..2e53e7d 100644 --- a/test/sourceror_test.exs +++ b/test/sourceror_test.exs @@ -1226,4 +1226,22 @@ defmodule SourcerorTest do """ end end + + describe "strip_meta/1" do + test "will strip all meta data from AST" do + original = ~S""" + hello world do + :ok + end + """ + + quoted = Sourceror.parse_string!(original) + + assert Sourceror.strip_meta(quoted) == { + {:hello, {}, + [{:world, {}, nil}, [{{:__block__, {}, [:do]}, {:__block__, {}, [:ok]}}]]}, + [] + } + end + end end