From 5f00e9d9e0a8c7d79ca63e9470c294161691b69e Mon Sep 17 00:00:00 2001 From: Bryan Joseph Date: Wed, 13 Sep 2017 19:37:39 -0500 Subject: [PATCH 1/3] Begin adding remove_unused_functions option --- lib/elixir_script/compiler.ex | 7 ++++++- lib/elixir_script/passes/translate/module.ex | 3 ++- test/support/helpers.ex | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/elixir_script/compiler.ex b/lib/elixir_script/compiler.ex index ee2de7a9..bdaeb5d0 100644 --- a/lib/elixir_script/compiler.ex +++ b/lib/elixir_script/compiler.ex @@ -21,6 +21,8 @@ defmodule ElixirScript.Compiler do If a directory is given, file will be named `elixirscript.build.js` * `root`: Optional root for imports of FFI JavaScript modules. Defaults to `.`. + * `remove_unused_functions`: Removed unused functions in output. Defaults to + removing unused functions when Mix.env == :prod """ @spec compile(atom | [atom], []) :: nil def compile(entry_modules, opts \\ []) do @@ -31,7 +33,9 @@ defmodule ElixirScript.Compiler do ElixirScript.FindUsedModules.execute(entry_modules, pid) - ElixirScript.FindUsedFunctions.execute(entry_modules, pid) + if opts.remove_unused_functions do + ElixirScript.FindUsedFunctions.execute(entry_modules, pid) + end modules = ElixirScript.State.list_modules(pid) ElixirScript.Translate.execute(modules, pid) @@ -50,6 +54,7 @@ defmodule ElixirScript.Compiler do |> Map.put(:format, :es) |> Map.put(:entry_modules, entry_modules) |> Map.put(:root, Keyword.get(opts, :root, ".")) + |> Map.put(:remove_unused_functions, Keyword.get(opts, :remove_unused_functions, Mix.env == :prod)) options = default_options Map.put(options, :module_formatter, ElixirScript.ModuleSystems.ES) diff --git a/lib/elixir_script/passes/translate/module.ex b/lib/elixir_script/passes/translate/module.ex index c35341ca..7790b807 100644 --- a/lib/elixir_script/passes/translate/module.ex +++ b/lib/elixir_script/passes/translate/module.ex @@ -23,9 +23,10 @@ defmodule ElixirScript.Translate.Module do line: _line, module: ^module, unreachable: unreachable, - used: used } = info + used = Map.get(info, :used, defs) + state = %{ module: module, pid: pid diff --git a/test/support/helpers.ex b/test/support/helpers.ex index a6eac917..f16eb03a 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -38,6 +38,8 @@ defmodule Helpers do {out, _a} = System.cmd "node", ["-r", "@std/esm", main_path] + IO.puts out + out |> Poison.decode! |> ElixirScript.TermConverter.decode From 6115af1c9b856528d005b836ead7ac01d86e2e5f Mon Sep 17 00:00:00 2001 From: Bryan Joseph Date: Wed, 13 Sep 2017 20:59:47 -0500 Subject: [PATCH 2/3] Debugging generation error --- lib/elixir_script/passes/output/js_module.ex | 2 +- lib/elixir_script/passes/translate/forms/receive.ex | 2 +- lib/elixir_script/passes/translate/module.ex | 8 ++++++-- lib/elixir_script/state.ex | 5 +++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/elixir_script/passes/output/js_module.ex b/lib/elixir_script/passes/output/js_module.ex index 3d093715..9277d826 100644 --- a/lib/elixir_script/passes/output/js_module.ex +++ b/lib/elixir_script/passes/output/js_module.ex @@ -10,7 +10,7 @@ defmodule ElixirScript.Output.JSModule do imports = opts.module_formatter.build_imports(js_modules) exports = opts.module_formatter.build_export(J.identifier("Elixir")) - [elixir, create_atom_table(), start(), load(), imports, body, exports] + [elixir, create_atom_table(), start(), load(), imports] ++ body ++ [exports] end def start do diff --git a/lib/elixir_script/passes/translate/forms/receive.ex b/lib/elixir_script/passes/translate/forms/receive.ex index 42b76cab..1186c285 100644 --- a/lib/elixir_script/passes/translate/forms/receive.ex +++ b/lib/elixir_script/passes/translate/forms/receive.ex @@ -9,7 +9,7 @@ defmodule ElixirScript.Translate.Forms.Receive do """ def compile(blocks, state) do receive_block = blocks - |> Keyword.get(:do) + |> Keyword.get(:do, []) |> Enum.map(fn x -> Clause.compile(x, state) |> elem(0) diff --git a/lib/elixir_script/passes/translate/module.ex b/lib/elixir_script/passes/translate/module.ex index 7790b807..81ed2660 100644 --- a/lib/elixir_script/passes/translate/module.ex +++ b/lib/elixir_script/passes/translate/module.ex @@ -14,6 +14,10 @@ defmodule ElixirScript.Translate.Module do ElixirScript.Translate.Protocol.compile(module, info, pid) end + def compile(_module, %{attributes: [__foreign_info__: %{path: _, name: _, global: _}]}, _) do + nil + end + def compile(module, info, pid) do %{ attributes: attrs, @@ -25,7 +29,7 @@ defmodule ElixirScript.Translate.Module do unreachable: unreachable, } = info - used = Map.get(info, :used, defs) + used = Map.get(info, :used) state = %{ module: module, @@ -40,7 +44,7 @@ defmodule ElixirScript.Translate.Module do _ -> true end) - used_defs = if Keyword.has_key?(attrs, :protocol_impl) do + used_defs = if Keyword.has_key?(attrs, :protocol_impl) or used == nil do reachable_defs else Enum.filter(reachable_defs, fn diff --git a/lib/elixir_script/state.ex b/lib/elixir_script/state.ex index 78c0d418..8e409b6f 100644 --- a/lib/elixir_script/state.ex +++ b/lib/elixir_script/state.ex @@ -24,7 +24,6 @@ defmodule ElixirScript.State do def put_module(pid, module, value) do Agent.update(pid, fn(state) -> - value = Map.put(value, :used, []) modules = Keyword.put(state.modules, module, value) %{ state | modules: modules } end) @@ -33,7 +32,9 @@ defmodule ElixirScript.State do def has_used?(pid, module, func) do Agent.get(pid, fn(state) -> module_info = Keyword.get(state.modules, module) - Enum.find(module_info.used, fn(x) -> x == func end) != nil + used = Map.get(module_info, :used, []) + + Enum.find(used, fn(x) -> x == func end) != nil end) end From a0f27a6e88e33a3eb97ce1c88271a567a0db2507 Mon Sep 17 00:00:00 2001 From: Bryan Joseph Date: Sun, 5 Nov 2017 21:59:02 -0600 Subject: [PATCH 3/3] Using alias for FindUnusedFunctions --- lib/elixir_script/compiler.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/elixir_script/compiler.ex b/lib/elixir_script/compiler.ex index e254f943..ba0f869b 100644 --- a/lib/elixir_script/compiler.ex +++ b/lib/elixir_script/compiler.ex @@ -75,7 +75,7 @@ defmodule ElixirScript.Compiler do FindUsedModules.execute(entry_modules, pid) if opts.remove_unused_functions do - ElixirScript.FindUsedFunctions.execute(entry_modules, pid) + FindUsedFunctions.execute(entry_modules, pid) end modules = State.list_modules(pid)