diff --git a/lib/elixir_script/compiler.ex b/lib/elixir_script/compiler.ex index f1cc9a32..ba0f869b 100644 --- a/lib/elixir_script/compiler.ex +++ b/lib/elixir_script/compiler.ex @@ -23,6 +23,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 """ alias ElixirScript.{ State, @@ -72,7 +74,9 @@ defmodule ElixirScript.Compiler do defp do_compile(entry_modules, pid, opts) do FindUsedModules.execute(entry_modules, pid) - FindUsedFunctions.execute(entry_modules, pid) + if opts.remove_unused_functions do + FindUsedFunctions.execute(entry_modules, pid) + end modules = State.list_modules(pid) Translate.execute(modules, pid) @@ -90,6 +94,7 @@ defmodule ElixirScript.Compiler do |> Map.put(:output, Keyword.get(opts, :output)) |> Map.put(:format, :es) |> 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, ES) 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 81ed418b..e39daadc 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, @@ -23,9 +27,10 @@ defmodule ElixirScript.Translate.Module do line: _line, module: ^module, unreachable: unreachable, - used: used } = info + used = Map.get(info, :used) + state = %{ module: module, pid: pid @@ -39,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 0946528a..7a4e03e6 100644 --- a/lib/elixir_script/state.ex +++ b/lib/elixir_script/state.ex @@ -51,7 +51,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