diff --git a/README.md b/README.md index e32f491..09f193d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Use at your peril, _for now._ ### Example ```elixir - mix ex_factor --module TestModule.Here --function my_func --arity 1 --target NewModule.Test + mix ex_factor --module TestModule.Here --function my_func --arity 1 --target NewModule.There ``` ## Roadmap TODONE @@ -23,24 +23,24 @@ Use at your peril, _for now._ - [X] github actions, run test suite - [X] Add Mix.Task tests - [X] Add CLI tests - - [X] Add and configure CHANGELOG tracking. - [X] Support opt-out of format-ing - [X] Option to only change the module name throughout the project - [X] update code to rely on compilation tracers, instead of XREF - [X] With module-only option, ensure we remove changed aliases + - [] defdelegate ## Roadmap TODO + - [] find private functions references in refactored fn bodies. + - [] Add and configure CHANGELOG tracking. - [] Add test for one file containing more than one `defmodule` - [] Add test for nested defmodules. - [] update test file refs by CLI option - [] find dead functions - [] find module attrs and also move them? - [] find types referenced in the moved specs - - [] find private functions references in refactored fn bodies. - [] git stage all changes? - [] How does this work with macro code? Does that even make sense as a case to handle? - - [] Update .exs files too? - [] Write tests to ensure we can find modules across umbrella apps. - [] Add configuration hooks? - [] ElixirLS integration for VSCode? @@ -72,3 +72,13 @@ Alternate name: ## License See [LICENSE](https://github.com/ckochx/ex_factor/blob/main/LICENSE) + +## Miscellaneous resources + + - https://dorgan.netlify.app/posts/2021/04/the_elixir_ast/ + - https://www.educative.io/courses/metaprogramming-elixir/7DXEpKlj3Rr + - https://elixirforum.com/t/is-there-a-complete-elixir-ast-reference/38923/3 + - https://www.botsquad.com/2019/04/11/the-ast-explained/ + - https://elixirforum.com/t/getting-each-stage-of-elixirs-compilation-all-the-way-to-the-beam-bytecode/1873/8 + - http://gomoripeti.github.io/beam_by_example/ + - https://en.wikipedia.org/wiki/BEAM_(Erlang_virtual_machine) diff --git a/lib/ex_factor/parser.ex b/lib/ex_factor/parser.ex index 8caf8fd..be981d7 100644 --- a/lib/ex_factor/parser.ex +++ b/lib/ex_factor/parser.ex @@ -4,6 +4,8 @@ defmodule ExFactor.Parser do context of a Mix app and that every file contains one or more `defmodule` blocks. """ + @code_options [:line, token_metadata: true, columns: true] + @doc """ Parse the contents of a filepath in an Abstract Syntaxt Tree (AST) and extraxct the block contents of the module at the filepath. @@ -11,14 +13,14 @@ defmodule ExFactor.Parser do def read_file(filepath) when is_binary(filepath) do contents = File.read!(filepath) list = String.split(contents, "\n") - {:ok, ast} = Code.string_to_quoted(contents, token_metadata: true) + {:ok, ast} = Code.string_to_quoted(contents, @code_options) {ast, list} end def block_contents(filepath) when is_binary(filepath) do filepath |> File.read!() - |> Code.string_to_quoted(token_metadata: true) + |> Code.string_to_quoted(@code_options) |> block_contents() end @@ -34,7 +36,7 @@ defmodule ExFactor.Parser do def all_functions(filepath) when is_binary(filepath) do filepath |> File.read!() - |> Code.string_to_quoted([:line, token_metadata: true, columns: true]) + |> Code.string_to_quoted(@code_options) |> all_functions() end @@ -51,7 +53,7 @@ defmodule ExFactor.Parser do def public_functions(filepath) when is_binary(filepath) do filepath |> File.read!() - |> Code.string_to_quoted([:line, token_metadata: true, columns: true]) + |> Code.string_to_quoted(@code_options) |> public_functions() end @@ -67,7 +69,7 @@ defmodule ExFactor.Parser do def private_functions(filepath) when is_binary(filepath) do filepath |> File.read!() - |> Code.string_to_quoted([:line, token_metadata: true, columns: true]) + |> Code.string_to_quoted(@code_options) |> private_functions() end diff --git a/mix.exs b/mix.exs index 35df2c6..0877b38 100644 --- a/mix.exs +++ b/mix.exs @@ -48,6 +48,7 @@ defmodule ExFactor.MixProject do defp deps do [ + {:changex, ">= 0.0.0", only: :dev, runtime: false, optional: true, app: false}, {:ex_doc, ">= 0.0.0", only: :dev, runtime: false, optional: true, app: false} ] end diff --git a/mix.lock b/mix.lock index 969b73a..3ccb14a 100644 --- a/mix.lock +++ b/mix.lock @@ -1,4 +1,5 @@ %{ + "changex": {:hex, :changex, "0.3.0", "ccba573ffc7f42b7535a31ee457c7e6d23628480d17afb0a7ce9695dfbde2ba1", [:mix], [], "hexpm", "8d2a4549f006835ef7d26bbf1e452d0d4c4093865db9998b50aa426cb2fe19b6"}, "earmark_parser": {:hex, :earmark_parser, "1.4.26", "f4291134583f373c7d8755566122908eb9662df4c4b63caa66a0eabe06569b0a", [:mix], [], "hexpm", "48d460899f8a0c52c5470676611c01f64f3337bad0b26ddab43648428d94aabc"}, "ex_doc": {:hex, :ex_doc, "0.28.4", "001a0ea6beac2f810f1abc3dbf4b123e9593eaa5f00dd13ded024eae7c523298", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bf85d003dd34911d89c8ddb8bda1a958af3471a274a4c2150a9c01c78ac3f8ed"}, "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, diff --git a/support/trace_task.ex b/support/trace_task.ex new file mode 100644 index 0000000..2c2e0d6 --- /dev/null +++ b/support/trace_task.ex @@ -0,0 +1,57 @@ +defmodule Mix.Tasks.ExFactorRunner do + @moduledoc """ + In order to run ExFactor on ExFactor, we need to make some files available "outside of" ExFactor, or more precisely along side of ExFactor. + + We need to have a process running during compilation that can run the `ExFactor.Server` Agent. + Additionally we need the setup from `ExFactor.Traces`, we could replicate this here, but why + bother copying something that we'll reuse. + """ + use Mix.Task + + @impl true + def run(args) do + unless Version.match?(System.version(), ">= 1.13.0") do + Mix.raise("Elixir v1.13+ is required!") + end + + Code.compiler_options(debug_info: true, parser_options: [columns: true, token_metadata: true]) + + Code.compile_file("./lib/ex_factor/server.ex", File.cwd!()) + :timer.sleep(20) + + Code.compile_file("./lib/ex_factor/traces.ex", File.cwd!()) + :timer.sleep(20) + + case args do + [] -> + + do_run() + + _ -> + Mix.raise("Additional CLI args are not supported.\n\n\tUsage: elixir -r support/trace_task.ex -S mix ex_factor_runner") + end + end + + defp do_run() do + ExFactor.Traces.setup() + + Mix.Task.rerun("compile", ["--force", "--tracer=ExFactor.Tracer"]) |> IO.inspect(label: "") + + entries = ExFactor.Server.entries() + entries_string = inspect(entries, limit: :infinity, printable_limit: :infinity) + File.write!("./tmp/trace_entries", entries_string) + + file_contents = [ + "defmodule ExFactor.Support.Trace do", + "def trace_function do", + entries_string, + "end", + "end" + ] + |> Enum.join("\n") + + path = "./test/support/trace.ex" + File.write!(path, file_contents) + Mix.Tasks.Format.run([path]) + end +end diff --git a/test/support/trace.ex b/test/support/trace.ex index f397054..0cb3a13 100644 --- a/test/support/trace.ex +++ b/test/support/trace.ex @@ -131,98 +131,113 @@ defmodule ExFactor.Support.Trace do {:remote_function, 2, nil, Module, :__put_attribute__, 4} ], {"lib/ex_factor/changer.ex", ExFactor.Changer} => [ - {:remote_function, 289, nil, String.Chars, :to_string, 1}, - {:remote_function, 289, nil, String.Chars, :to_string, 1}, - {:remote_function, 289, nil, Regex, :compile!, 2}, - {:remote_function, 289, 12, String, :match?, 2}, - {:remote_function, 285, nil, String.Chars, :to_string, 1}, - {:remote_function, 285, nil, Regex, :compile!, 2}, - {:remote_function, 285, 12, String, :match?, 2}, - {:remote_function, 276, nil, String.Chars, :to_string, 1}, - {:remote_function, 276, 77, :erlang, :+, 2}, - {:imported_function, 276, 77, Kernel, :+, 2}, - {:remote_function, 276, 46, List, :insert_at, 3}, - {:remote_function, 275, nil, :erlang, :"=:=", 2}, - {:remote_function, 275, nil, :erlang, :"=:=", 2}, - {:remote_function, 275, nil, :erlang, :orelse, 2}, - {:remote_function, 273, 14, Enum, :find_index, 2}, - {:remote_function, 272, nil, :erlang, :"=:=", 2}, - {:remote_function, 272, nil, :erlang, :"=:=", 2}, - {:remote_function, 272, nil, :erlang, :orelse, 2}, - {:remote_function, 272, 12, Enum, :find_index, 2}, - {:remote_function, 267, 44, :erlang, :-, 1}, - {:imported_function, 267, 44, Kernel, :-, 1}, - {:remote_function, 267, 25, Enum, :at, 2}, - {:remote_function, 266, 29, String, :split, 2}, - {:remote_function, 264, 29, Keyword, :fetch!, 2}, - {:remote_function, 263, 29, Keyword, :fetch!, 2}, - {:remote_function, 253, nil, String.Chars, :to_string, 1}, - {:remote_function, 253, 61, :erlang, :-, 2}, - {:imported_function, 253, 61, Kernel, :-, 2}, - {:remote_function, 253, 30, List, :insert_at, 3}, - {:remote_function, 252, nil, :erlang, :"=:=", 2}, - {:remote_function, 252, nil, :erlang, :"=:=", 2}, - {:remote_function, 252, nil, :erlang, :orelse, 2}, - {:remote_function, 250, 16, Enum, :find_index, 2}, - {:remote_function, 248, nil, Enum, :member?, 2}, - {:remote_function, 245, nil, Enum, :member?, 2}, - {:remote_function, 242, nil, Enum, :member?, 2}, - {:remote_function, 239, nil, Enum, :member?, 2}, - {:remote_function, 230, nil, :erlang, :"=:=", 2}, - {:remote_function, 230, nil, :erlang, :"=:=", 2}, - {:remote_function, 230, nil, :erlang, :orelse, 2}, - {:remote_function, 228, 17, Enum, :find, 2}, - {:remote_function, 223, 12, Enum, :reverse, 1}, - {:remote_function, 220, nil, :erlang, :"=:=", 2}, - {:remote_function, 220, nil, :erlang, :"=:=", 2}, - {:remote_function, 220, nil, :erlang, :orelse, 2}, - {:remote_function, 220, 15, String, :match?, 2}, - {:remote_function, 211, nil, String.Chars, :to_string, 1}, - {:remote_function, 210, 29, Keyword, :fetch!, 2}, - {:remote_function, 205, 10, Enum, :join, 2}, - {:remote_function, 193, 10, File, :write, 3}, - {:remote_function, 174, 25, :erlang, :==, 2}, - {:imported_function, 174, 25, Kernel, :==, 2}, - {:remote_function, 171, 44, :erlang, :-, 1}, - {:imported_function, 171, 44, Kernel, :-, 1}, - {:remote_function, 171, 25, Enum, :at, 2}, - {:remote_function, 170, 29, String, :split, 2}, - {:remote_function, 163, 18, :erlang, :-, 1}, - {:imported_function, 163, 18, Kernel, :-, 1}, - {:remote_function, 162, 17, String, :split, 3}, - {:remote_function, 163, 15, Enum, :at, 2}, - {:remote_function, 160, nil, :erlang, :"=:=", 2}, - {:remote_function, 160, nil, :erlang, :"=:=", 2}, - {:remote_function, 160, nil, :erlang, :orelse, 2}, - {:remote_function, 160, 15, String, :match?, 2}, - {:remote_function, 158, 21, Enum, :find, 3}, - {:remote_function, 154, 49, :erlang, :-, 2}, - {:imported_function, 154, 49, Kernel, :-, 2}, - {:remote_function, 154, 22, List, :replace_at, 3}, - {:remote_function, 147, 28, String, :replace, 3}, - {:remote_function, 146, nil, String.Chars, :to_string, 1}, - {:remote_function, 146, nil, Regex, :compile!, 2}, - {:remote_function, 146, 16, String, :match?, 2}, - {:remote_function, 142, 28, String, :replace, 3}, - {:remote_function, 141, nil, String.Chars, :to_string, 1}, - {:remote_function, 141, nil, Regex, :compile!, 2}, - {:remote_function, 141, 16, String, :match?, 2}, - {:remote_function, 137, nil, String.Chars, :to_string, 1}, - {:remote_function, 137, nil, Regex, :compile!, 2}, - {:remote_function, 137, 16, String, :match?, 2}, - {:remote_function, 132, 39, :erlang, :-, 2}, - {:imported_function, 132, 39, Kernel, :-, 2}, - {:remote_function, 132, 20, Enum, :at, 2}, - {:remote_function, 129, 44, :erlang, :-, 1}, - {:imported_function, 129, 44, Kernel, :-, 1}, - {:remote_function, 129, 25, Enum, :at, 2}, - {:remote_function, 128, 29, String, :split, 2}, - {:remote_function, 127, nil, String.Chars, :to_string, 1}, - {:remote_function, 124, 29, Keyword, :fetch!, 2}, - {:remote_function, 123, 29, Keyword, :fetch!, 2}, - {:remote_function, 118, 49, :erlang, :-, 2}, - {:imported_function, 118, 49, Kernel, :-, 2}, - {:remote_function, 118, 22, List, :replace_at, 3}, + {:remote_function, 301, nil, String.Chars, :to_string, 1}, + {:remote_function, 301, nil, String.Chars, :to_string, 1}, + {:remote_function, 301, nil, Regex, :compile!, 2}, + {:remote_function, 301, 12, String, :match?, 2}, + {:remote_function, 297, nil, String.Chars, :to_string, 1}, + {:remote_function, 297, nil, Regex, :compile!, 2}, + {:remote_function, 297, 12, String, :match?, 2}, + {:remote_function, 288, nil, String.Chars, :to_string, 1}, + {:remote_function, 288, 77, :erlang, :+, 2}, + {:imported_function, 288, 77, Kernel, :+, 2}, + {:remote_function, 288, 46, List, :insert_at, 3}, + {:remote_function, 287, nil, :erlang, :"=:=", 2}, + {:remote_function, 287, nil, :erlang, :"=:=", 2}, + {:remote_function, 287, nil, :erlang, :orelse, 2}, + {:remote_function, 285, 14, Enum, :find_index, 2}, + {:remote_function, 284, nil, :erlang, :"=:=", 2}, + {:remote_function, 284, nil, :erlang, :"=:=", 2}, + {:remote_function, 284, nil, :erlang, :orelse, 2}, + {:remote_function, 284, 12, Enum, :find_index, 2}, + {:remote_function, 279, 44, :erlang, :-, 1}, + {:imported_function, 279, 44, Kernel, :-, 1}, + {:remote_function, 279, 25, Enum, :at, 2}, + {:remote_function, 278, 29, String, :split, 2}, + {:remote_function, 276, 29, Keyword, :fetch!, 2}, + {:remote_function, 275, 29, Keyword, :fetch!, 2}, + {:remote_function, 265, nil, String.Chars, :to_string, 1}, + {:remote_function, 265, 61, :erlang, :-, 2}, + {:imported_function, 265, 61, Kernel, :-, 2}, + {:remote_function, 265, 30, List, :insert_at, 3}, + {:remote_function, 264, nil, :erlang, :"=:=", 2}, + {:remote_function, 264, nil, :erlang, :"=:=", 2}, + {:remote_function, 264, nil, :erlang, :orelse, 2}, + {:remote_function, 262, 16, Enum, :find_index, 2}, + {:remote_function, 260, nil, Enum, :member?, 2}, + {:remote_function, 257, nil, Enum, :member?, 2}, + {:remote_function, 254, nil, Enum, :member?, 2}, + {:remote_function, 251, nil, Enum, :member?, 2}, + {:remote_function, 242, nil, :erlang, :"=:=", 2}, + {:remote_function, 242, nil, :erlang, :"=:=", 2}, + {:remote_function, 242, nil, :erlang, :orelse, 2}, + {:remote_function, 240, 17, Enum, :find, 2}, + {:remote_function, 235, 12, Enum, :reverse, 1}, + {:remote_function, 232, nil, :erlang, :"=:=", 2}, + {:remote_function, 232, nil, :erlang, :"=:=", 2}, + {:remote_function, 232, nil, :erlang, :orelse, 2}, + {:remote_function, 232, 15, String, :match?, 2}, + {:remote_function, 223, nil, String.Chars, :to_string, 1}, + {:remote_function, 222, 29, Keyword, :fetch!, 2}, + {:remote_function, 217, 10, Enum, :join, 2}, + {:remote_function, 205, 10, File, :write, 3}, + {:remote_function, 186, 25, :erlang, :==, 2}, + {:imported_function, 186, 25, Kernel, :==, 2}, + {:remote_function, 183, 44, :erlang, :-, 1}, + {:imported_function, 183, 44, Kernel, :-, 1}, + {:remote_function, 183, 25, Enum, :at, 2}, + {:remote_function, 182, 29, String, :split, 2}, + {:remote_function, 175, 18, :erlang, :-, 1}, + {:imported_function, 175, 18, Kernel, :-, 1}, + {:remote_function, 174, 17, String, :split, 3}, + {:remote_function, 175, 15, Enum, :at, 2}, + {:remote_function, 172, nil, :erlang, :"=:=", 2}, + {:remote_function, 172, nil, :erlang, :"=:=", 2}, + {:remote_function, 172, nil, :erlang, :orelse, 2}, + {:remote_function, 172, 15, String, :match?, 2}, + {:remote_function, 170, 21, Enum, :find, 3}, + {:remote_function, 166, 49, :erlang, :-, 2}, + {:imported_function, 166, 49, Kernel, :-, 2}, + {:remote_function, 166, 22, List, :replace_at, 3}, + {:remote_function, 159, 28, String, :replace, 3}, + {:remote_function, 158, nil, String.Chars, :to_string, 1}, + {:remote_function, 158, nil, Regex, :compile!, 2}, + {:remote_function, 158, 16, String, :match?, 2}, + {:remote_function, 154, 28, String, :replace, 3}, + {:remote_function, 153, nil, String.Chars, :to_string, 1}, + {:remote_function, 153, nil, Regex, :compile!, 2}, + {:remote_function, 153, 16, String, :match?, 2}, + {:remote_function, 149, nil, String.Chars, :to_string, 1}, + {:remote_function, 149, nil, Regex, :compile!, 2}, + {:remote_function, 149, 16, String, :match?, 2}, + {:remote_function, 144, 39, :erlang, :-, 2}, + {:imported_function, 144, 39, Kernel, :-, 2}, + {:remote_function, 144, 20, Enum, :at, 2}, + {:remote_function, 141, 44, :erlang, :-, 1}, + {:imported_function, 141, 44, Kernel, :-, 1}, + {:remote_function, 141, 25, Enum, :at, 2}, + {:remote_function, 140, 29, String, :split, 2}, + {:remote_function, 139, nil, String.Chars, :to_string, 1}, + {:remote_function, 136, 29, Keyword, :fetch!, 2}, + {:remote_function, 135, 29, Keyword, :fetch!, 2}, + {:remote_function, 130, 49, :erlang, :-, 2}, + {:imported_function, 130, 49, Kernel, :-, 2}, + {:remote_function, 130, 22, List, :replace_at, 3}, + {:remote_function, 123, 28, String, :replace, 3}, + {:remote_function, 122, nil, String.Chars, :to_string, 1}, + {:remote_function, 122, nil, String.Chars, :to_string, 1}, + {:remote_function, 122, nil, Regex, :compile!, 2}, + {:remote_function, 122, 16, String, :match?, 2}, + {:remote_function, 119, 28, String, :replace, 3}, + {:remote_function, 118, nil, String.Chars, :to_string, 1}, + {:remote_function, 118, nil, String.Chars, :to_string, 1}, + {:remote_function, 118, nil, Regex, :compile!, 2}, + {:remote_function, 118, 16, String, :match?, 2}, + {:remote_function, 115, 28, String, :replace, 3}, + {:remote_function, 114, nil, String.Chars, :to_string, 1}, + {:remote_function, 114, nil, String.Chars, :to_string, 1}, + {:remote_function, 114, nil, Regex, :compile!, 2}, + {:remote_function, 114, 16, String, :match?, 2}, {:remote_function, 111, 28, String, :replace, 3}, {:remote_function, 110, nil, String.Chars, :to_string, 1}, {:remote_function, 110, nil, String.Chars, :to_string, 1}, @@ -270,42 +285,42 @@ defmodule ExFactor.Support.Trace do {:remote_function, 18, 16, ExFactor.Callers, :callers, 1}, {:remote_function, 15, 29, Keyword, :fetch!, 2}, {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 293, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 293, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 292, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 292, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 288, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 288, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 284, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 284, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 282, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 282, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 262, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 262, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 261, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 261, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 237, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 237, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 227, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 227, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 305, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 305, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 304, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 304, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 300, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 300, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 296, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 296, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 294, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 294, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 274, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 274, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 273, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 273, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 249, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 249, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 239, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 239, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 231, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 231, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 221, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 221, nil, :elixir_def, :store_definition, 5}, {:remote_function, 219, nil, :elixir_module, :read_cache, 2}, {:remote_function, 219, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 209, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 209, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 207, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 207, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 204, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 204, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 191, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 191, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 216, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 216, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 203, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 203, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 193, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 193, nil, :elixir_def, :store_definition, 5}, {:remote_function, 181, nil, :elixir_module, :read_cache, 2}, {:remote_function, 181, nil, :elixir_def, :store_definition, 5}, {:remote_function, 169, nil, :elixir_module, :read_cache, 2}, {:remote_function, 169, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 157, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 157, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 121, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 121, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 133, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 133, nil, :elixir_def, :store_definition, 5}, {:remote_function, 83, nil, :elixir_module, :read_cache, 2}, {:remote_function, 83, nil, :elixir_def, :store_definition, 5}, {:remote_function, 75, nil, :elixir_module, :read_cache, 2}, @@ -470,97 +485,98 @@ defmodule ExFactor.Support.Trace do {:remote_function, 2, nil, Module, :__put_attribute__, 4} ], {"lib/ex_factor/parser.ex", ExFactor.Parser} => [ - {:remote_function, 141, 27, :erlang, :"/=", 2}, - {:imported_function, 141, 27, Kernel, :!=, 2}, - {:remote_function, 140, 16, :erlang, :"/=", 2}, - {:imported_function, 140, 16, Kernel, :!=, 2}, - {:remote_function, 136, 18, Keyword, :get, 3}, - {:remote_function, 137, 18, Keyword, :get, 3}, - {:remote_function, 131, 18, Keyword, :get, 3}, - {:remote_function, 132, 18, Keyword, :get, 3}, - {:remote_function, 123, 26, Keyword, :get, 3}, - {:remote_function, 119, 12, :maps, :merge, 2}, - {:remote_function, 107, 13, :erlang, :length, 1}, - {:imported_function, 107, 13, Kernel, :length, 1}, - {:remote_function, 106, 88, :erlang, :==, 2}, - {:imported_function, 106, 88, Kernel, :==, 2}, - {:remote_function, 101, 13, :erlang, :length, 1}, - {:imported_function, 101, 13, Kernel, :length, 1}, - {:remote_function, 100, 17, :erlang, :==, 2}, - {:imported_function, 100, 17, Kernel, :==, 2}, - {:remote_function, 90, 13, :erlang, :length, 1}, - {:imported_function, 90, 13, Kernel, :length, 1}, - {:remote_function, 75, 11, Macro, :postwalk, 3}, - {:remote_function, 69, 13, File, :read!, 1}, - {:remote_function, 70, 13, Code, :string_to_quoted, 2}, - {:remote_function, 67, 40, :erlang, :is_binary, 1}, - {:imported_function, 67, 40, Kernel, :is_binary, 1}, - {:remote_function, 59, 11, Macro, :postwalk, 3}, - {:remote_function, 53, 13, File, :read!, 1}, - {:remote_function, 54, 13, Code, :string_to_quoted, 2}, - {:remote_function, 51, 39, :erlang, :is_binary, 1}, - {:imported_function, 51, 39, Kernel, :is_binary, 1}, - {:remote_function, 45, 16, Enum, :uniq, 1}, - {:remote_function, 44, 32, :erlang, :++, 2}, - {:imported_function, 44, 32, Kernel, :++, 2}, - {:remote_function, 36, 13, File, :read!, 1}, - {:remote_function, 37, 13, Code, :string_to_quoted, 2}, - {:remote_function, 34, 36, :erlang, :is_binary, 1}, - {:imported_function, 34, 36, Kernel, :is_binary, 1}, - {:remote_function, 26, 11, Macro, :postwalk, 3}, - {:remote_function, 20, 13, File, :read!, 1}, - {:remote_function, 21, 13, Code, :string_to_quoted, 2}, - {:remote_function, 18, 37, :erlang, :is_binary, 1}, - {:imported_function, 18, 37, Kernel, :is_binary, 1}, - {:remote_function, 14, 23, Code, :string_to_quoted, 2}, - {:remote_function, 13, 19, String, :split, 2}, - {:remote_function, 12, 21, File, :read!, 1}, - {:remote_function, 11, 32, :erlang, :is_binary, 1}, - {:imported_function, 11, 32, Kernel, :is_binary, 1}, + {:remote_function, 143, 27, :erlang, :"/=", 2}, + {:imported_function, 143, 27, Kernel, :!=, 2}, + {:remote_function, 142, 16, :erlang, :"/=", 2}, + {:imported_function, 142, 16, Kernel, :!=, 2}, + {:remote_function, 138, 18, Keyword, :get, 3}, + {:remote_function, 139, 18, Keyword, :get, 3}, + {:remote_function, 133, 18, Keyword, :get, 3}, + {:remote_function, 134, 18, Keyword, :get, 3}, + {:remote_function, 125, 26, Keyword, :get, 3}, + {:remote_function, 121, 12, :maps, :merge, 2}, + {:remote_function, 109, 13, :erlang, :length, 1}, + {:imported_function, 109, 13, Kernel, :length, 1}, + {:remote_function, 108, 88, :erlang, :==, 2}, + {:imported_function, 108, 88, Kernel, :==, 2}, + {:remote_function, 103, 13, :erlang, :length, 1}, + {:imported_function, 103, 13, Kernel, :length, 1}, + {:remote_function, 102, 17, :erlang, :==, 2}, + {:imported_function, 102, 17, Kernel, :==, 2}, + {:remote_function, 92, 13, :erlang, :length, 1}, + {:imported_function, 92, 13, Kernel, :length, 1}, + {:remote_function, 77, 11, Macro, :postwalk, 3}, + {:remote_function, 71, 13, File, :read!, 1}, + {:remote_function, 72, 13, Code, :string_to_quoted, 2}, + {:remote_function, 69, 40, :erlang, :is_binary, 1}, + {:imported_function, 69, 40, Kernel, :is_binary, 1}, + {:remote_function, 61, 11, Macro, :postwalk, 3}, + {:remote_function, 55, 13, File, :read!, 1}, + {:remote_function, 56, 13, Code, :string_to_quoted, 2}, + {:remote_function, 53, 39, :erlang, :is_binary, 1}, + {:imported_function, 53, 39, Kernel, :is_binary, 1}, + {:remote_function, 47, 16, Enum, :uniq, 1}, + {:remote_function, 46, 32, :erlang, :++, 2}, + {:imported_function, 46, 32, Kernel, :++, 2}, + {:remote_function, 38, 13, File, :read!, 1}, + {:remote_function, 39, 13, Code, :string_to_quoted, 2}, + {:remote_function, 36, 36, :erlang, :is_binary, 1}, + {:imported_function, 36, 36, Kernel, :is_binary, 1}, + {:remote_function, 28, 11, Macro, :postwalk, 3}, + {:remote_function, 22, 13, File, :read!, 1}, + {:remote_function, 23, 13, Code, :string_to_quoted, 2}, + {:remote_function, 20, 37, :erlang, :is_binary, 1}, + {:imported_function, 20, 37, Kernel, :is_binary, 1}, + {:remote_function, 16, 23, Code, :string_to_quoted, 2}, + {:remote_function, 15, 19, String, :split, 2}, + {:remote_function, 14, 21, File, :read!, 1}, + {:remote_function, 13, 32, :erlang, :is_binary, 1}, + {:imported_function, 13, 32, Kernel, :is_binary, 1}, {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 154, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 154, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 150, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 150, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 146, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 146, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 128, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 128, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 122, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 122, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 116, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 116, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 112, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 112, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 106, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 106, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 95, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 95, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 85, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 85, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 80, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 80, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 74, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 74, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 67, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 67, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 64, nil, Module, :__put_attribute__, 4}, - {:remote_function, 58, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 58, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 51, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 51, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 48, nil, Module, :__put_attribute__, 4}, - {:remote_function, 41, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 41, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 34, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 34, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 31, nil, Module, :__put_attribute__, 4}, - {:remote_function, 25, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 25, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 18, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 18, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 11, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 11, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 156, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 156, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 152, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 152, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 148, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 148, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 130, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 130, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 124, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 124, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 118, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 118, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 114, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 114, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 108, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 108, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 97, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 97, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 87, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 87, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 82, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 82, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 76, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 76, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 69, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 69, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 66, nil, Module, :__put_attribute__, 4}, + {:remote_function, 60, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 60, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 53, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 53, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 50, nil, Module, :__put_attribute__, 4}, + {:remote_function, 43, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 43, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 36, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 36, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 33, nil, Module, :__put_attribute__, 4}, + {:remote_function, 27, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 27, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 20, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 20, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 13, nil, :elixir_module, :read_cache, 2}, + {:remote_function, 13, nil, :elixir_def, :store_definition, 5}, + {:remote_function, 9, nil, Module, :__put_attribute__, 4}, {:remote_function, 7, nil, Module, :__put_attribute__, 4}, {:remote_function, 2, nil, Module, :__put_attribute__, 4} ], @@ -787,135 +803,6 @@ defmodule ExFactor.Support.Trace do {:remote_function, 9, nil, Module, :__put_attribute__, 4}, {:remote_function, 6, nil, String.Chars, :to_string, 1}, {:remote_function, 2, nil, Module, :__put_attribute__, 4} - ], - {"test/support/example_five.ex", ExFactor.Support.ExampleFive} => [ - {:remote_function, 22, 11, IO, :puts, 1}, - {:remote_function, 23, 11, IO, :inspect, 1}, - {:remote_function, 24, 11, IO, :puts, 1}, - {:remote_function, 18, nil, ExFactor.Formatter, :format, 2}, - {:remote_function, 15, 8, IO, :puts, 1}, - {:remote_function, 12, 36, ExFactor.Parser, :public_functions, 1}, - {:remote_function, 11, 29, ExFactor.Parser, :all_functions, 1}, - {:imported_function, 11, 29, ExFactor.Parser, :all_functions, 1}, - {:remote_function, 10, 33, ExFactor.Callers, :callers, 1}, - {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 20, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 20, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 18, nil, :elixir_quote, :list, 2}, - {:remote_function, 18, nil, :elixir_quote, :dot, 5}, - {:remote_function, 18, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 18, nil, :erlang, :length, 1}, - {:remote_function, 18, nil, Module, :__put_attribute__, 4}, - {:remote_function, 18, nil, Kernel.Utils, :defdelegate, 2}, - {:remote_function, 18, nil, List, :wrap, 1}, - {:remote_function, 18, nil, Macro.Env, :stacktrace, 1}, - {:remote_function, 18, nil, IO, :warn, 2}, - {:remote_function, 18, nil, :erlang, :"=:=", 2}, - {:remote_function, 18, nil, :erlang, :"=:=", 2}, - {:remote_function, 18, nil, :erlang, :orelse, 2}, - {:remote_function, 18, nil, Keyword, :has_key?, 2}, - {:remote_function, 18, nil, Macro.Env, :stacktrace, 1}, - {:remote_function, 18, nil, IO, :warn, 2}, - {:remote_function, 18, nil, :erlang, :is_list, 1}, - {:remote_function, 18, nil, ArgumentError, :exception, 1}, - {:remote_function, 18, nil, :erlang, :error, 1}, - {:remote_function, 18, nil, :erlang, :"=:=", 2}, - {:remote_function, 18, nil, :erlang, :"=:=", 2}, - {:remote_function, 18, nil, :erlang, :orelse, 2}, - {:remote_function, 18, nil, Keyword, :get, 2}, - {:remote_function, 14, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 14, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 12, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 12, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 11, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 11, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 10, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 10, nil, :elixir_def, :store_definition, 5}, - {:alias, 7, 3, ExFactor.Callers, Callers, []}, - {:alias, 6, 3, ExFactor.Parser, Parser, []}, - {:remote_function, 2, nil, Module, :__put_attribute__, 4} - ], - {"test/support/example_one.ex", ExFactor.Support.ExampleOne} => [ - {:remote_function, 11, 35, ExFactor.Parser, :all_functions, 1}, - {:remote_function, 10, 33, ExFactor.Callers, :callers, 1}, - {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 11, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 11, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 10, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 10, nil, :elixir_def, :store_definition, 5}, - {:alias, 8, 3, ExFactor.Callers, Callers, []}, - {:alias, 7, 3, ExFactor.Parser, P, [as: P]}, - {:remote_function, 2, nil, Module, :__put_attribute__, 4} - ], - {"test/support/example_seven.ex", ExFactor.Support.ExampleSeven} => [ - {:remote_function, 11, 29, ExFactor.Parser, :all_functions, 1}, - {:imported_function, 11, 29, ExFactor.Parser, :all_functions, 1}, - {:remote_function, 10, 33, ExFactor.Callers, :callers, 1}, - {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 11, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 11, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 10, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 10, nil, :elixir_def, :store_definition, 5}, - {:alias, 7, 3, ExFactor.Callers, Callers, []}, - {:alias, 6, 3, ExFactor.Parser, Parser, []}, - {:remote_function, 2, nil, Module, :__put_attribute__, 4} - ], - {"test/support/example_three.ex", ExFactor.Support.ExampleFour} => [ - {:remote_function, 15, 1, :elixir_utils, :noop, 0}, - {:remote_function, 16, nil, Kernel.LexicalTracker, :read_cache, 2}, - {:remote_function, 16, nil, :elixir_module, :compile, 4}, - {:alias, 16, 13, ExFactor.Support.ExampleFour.SubModuleTwoA, SubModuleTwoA, - [as: SubModuleTwoA, warn: false]} - ], - {"test/support/example_three.ex", ExFactor.Support.ExampleFour.SubModuleTwoA} => [ - {:remote_function, 20, 15, Kernel, :inspect, 2}, - {:imported_function, 20, 15, Kernel, :inspect, 2}, - {:remote_function, 20, 10, IO, :puts, 1}, - {:remote_function, nil, nil, :elixir_utils, :noop, 0}, - {:remote_function, 19, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 19, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 17, nil, Module, :__put_attribute__, 4} - ], - {"test/support/example_three.ex", ExFactor.Support.ExampleThree} => [ - {:remote_function, 11, 40, ExFactor.Parser, :all_functions, 1}, - {:remote_function, 10, 33, ExFactor.Callers, :callers, 1}, - {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 11, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 11, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 10, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 10, nil, :elixir_def, :store_definition, 5}, - {:alias, 7, 3, ExFactor.Parser, Parser, []}, - {:alias, 7, 3, ExFactor.Callers, Callers, []}, - {:remote_function, 2, nil, Module, :__put_attribute__, 4} - ], - {"test/support/example_two.ex", ExFactor.Support.ExampleTwo} => [ - {:remote_function, 10, 35, ExFactor.Parser, :all_functions, 1}, - {:remote_function, 9, 42, ExFactor.Callers, :callers, 1}, - {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 12, nil, Kernel.LexicalTracker, :read_cache, 2}, - {:remote_function, 12, nil, :elixir_module, :compile, 4}, - {:alias, 12, 13, ExFactor.Support.ExampleTwo.SubModuleTwoA, SubModuleTwoA, - [as: SubModuleTwoA, warn: false]}, - {:remote_function, 10, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 10, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 9, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 9, nil, :elixir_def, :store_definition, 5}, - {:alias, 7, 3, ExFactor.Parser, P, [as: P]}, - {:remote_function, 2, nil, Module, :__put_attribute__, 4} - ], - {"test/support/example_two.ex", ExFactor.Support.ExampleTwo.SubModuleTwoA} => [ - {:remote_function, 16, 15, Kernel, :inspect, 2}, - {:imported_function, 16, 15, Kernel, :inspect, 2}, - {:remote_function, 16, 10, IO, :puts, 1}, - {:remote_function, nil, nil, :elixir_utils, :noop, 0}, - {:remote_function, 15, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 15, nil, :elixir_def, :store_definition, 5}, - {:remote_function, 13, nil, Module, :__put_attribute__, 4} - ], - {"test/support/trace.ex", ExFactor.Support.Trace} => [ - {:remote_function, 1, 1, :elixir_utils, :noop, 0}, - {:remote_function, 2, nil, :elixir_module, :read_cache, 2}, - {:remote_function, 2, nil, :elixir_def, :store_definition, 5} ] } end