Skip to content

Commit 15581e7

Browse files
authored
chore: support dev server using tcp transport (#43)
* chore: support dev server using tcp transport * fix: compile expert before release * fix: use Logger instead of IO.puts * chore: fix credo issues * fix: typo * fix: try higher timeout so the slow GH runners don't freak out * fix: transform beans in a process * fix: bring back old beam transforms task options
1 parent 4594294 commit 15581e7

File tree

19 files changed

+343
-203
lines changed

19 files changed

+343
-203
lines changed

.iex.exs

Lines changed: 0 additions & 7 deletions
This file was deleted.

.iex.namespaced.exs

Lines changed: 0 additions & 2 deletions
This file was deleted.

apps/engine/lib/engine/plugin/discovery.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule Engine.Plugin.Discovery do
1717

1818
@namespaced_document_module [:Forge, :Document]
1919
|> Module.concat()
20-
|> Forge.Namespace.Module.apply()
20+
|> Forge.Namespace.Module.run(apps: [:forge], roots: [Forge])
2121

2222
def run do
2323
for {app_name, _, _} <- :application.loaded_applications(),
@@ -49,10 +49,12 @@ defmodule Engine.Plugin.Discovery do
4949
end
5050

5151
defp namespace_module(module) when is_atom(module) do
52+
app = Application.get_application(module)
53+
5254
module
5355
|> :code.which()
5456
|> List.to_string()
55-
|> Forge.Namespace.Transform.Beams.apply()
57+
|> Forge.Namespace.Transform.Beams.apply_to_all(apps: [app])
5658
end
5759

5860
defp unload_module(module) do

apps/expert/.iex.exs

Lines changed: 0 additions & 14 deletions
This file was deleted.

apps/expert/lib/expert/application.ex

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,31 @@ defmodule Expert.Application do
1212

1313
@impl true
1414
def start(_type, _args) do
15+
{m, f, a} = Application.get_env(:expert, :arg_parser)
16+
17+
argv = apply(m, f, a)
18+
19+
{opts, _, _invalid} =
20+
OptionParser.parse(argv,
21+
strict: [port: :integer]
22+
)
23+
24+
buffer_opts =
25+
case opts[:port] do
26+
port when is_integer(port) ->
27+
[communication: {GenLSP.Communication.TCP, [port: port]}]
28+
29+
_ ->
30+
[]
31+
end
32+
1533
children = [
1634
document_store_child_spec(),
1735
{DynamicSupervisor, Expert.Project.DynamicSupervisor.options()},
1836
{DynamicSupervisor, name: Expert.DynamicSupervisor},
1937
{GenLSP.Assigns, [name: Expert.Assigns]},
2038
{Task.Supervisor, name: :expert_task_queue},
21-
{GenLSP.Buffer, name: Expert.Buffer},
39+
{GenLSP.Buffer, [name: Expert.Buffer] ++ buffer_opts},
2240
{Expert,
2341
name: Expert,
2442
buffer: Expert.Buffer,

apps/expert/lib/expert/engine_node.ex

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,19 @@ defmodule Expert.EngineNode do
166166
# When Engine is built in CI for a version matrix, we'll need to check if
167167
# we have the right version downloaded, and if not, we should download it.
168168
defp glob_paths do
169-
:expert
170-
|> :code.priv_dir()
169+
engine_path = System.get_env("EXPERT_ENGINE_PATH", default_engine_path())
170+
171+
Logger.info("Using Engine path: #{Path.expand(engine_path)}")
172+
173+
engine_path
174+
|> Path.expand()
171175
|> Path.join("lib/**/ebin")
172176
|> Path.wildcard()
173177
end
178+
179+
defp default_engine_path do
180+
:expert |> :code.priv_dir() |> Path.join("engine")
181+
end
174182
end
175183

176184
@stop_timeout 1_000

apps/expert/lib/expert/release.ex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
defmodule Expert.Release do
22
def assemble(release) do
3-
Mix.Task.run(:namespace, [release.path])
4-
53
engine_path = Path.expand("../../../engine", __DIR__)
64

75
source = Path.join([engine_path, "_build/dev_ns"])
@@ -10,10 +8,13 @@ defmodule Expert.Release do
108
Path.join([
119
release.path,
1210
"lib",
13-
"xp_expert-#{release.version}",
14-
"priv"
11+
"#{release.name}-#{release.version}",
12+
"priv",
13+
"engine"
1514
])
1615

16+
File.mkdir_p!(dest)
17+
1718
File.cp_r!(source, dest)
1819

1920
release

apps/expert/mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ defmodule Expert.MixProject do
2323

2424
def application do
2525
[
26-
extra_applications: [:logger, :runtime_tools, :kernel, :erts, :observer],
26+
extra_applications: [:logger, :runtime_tools, :kernel, :erts, :observer, :wx],
2727
mod: {Expert.Application, []}
2828
]
2929
end

apps/forge/lib/forge/namespace/abstract.ex

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,25 @@ defmodule Forge.Namespace.Abstract do
66
https://www.erlang.org/doc/apps/erts/absform.html
77
"""
88

9+
def code_from(path) do
10+
with {:ok, {_orig_module, code_parts}} <- :beam_lib.chunks(path, [:abstract_code]),
11+
{:ok, {:raw_abstract_v1, forms}} <- Keyword.fetch(code_parts, :abstract_code) do
12+
{:ok, forms}
13+
else
14+
_ ->
15+
{:error, :not_found}
16+
end
17+
end
18+
19+
def run(abstract_format, opts) when is_list(abstract_format) do
20+
fn ->
21+
Process.put(:abstract_code_opts, opts)
22+
Enum.map(abstract_format, fn af -> rewrite(af) end)
23+
end
24+
|> Task.async()
25+
|> Task.await()
26+
end
27+
928
def rewrite(abstract_format) when is_list(abstract_format) do
1029
Enum.map(abstract_format, &rewrite/1)
1130
end
@@ -294,6 +313,7 @@ defmodule Forge.Namespace.Abstract do
294313
end
295314

296315
defp rewrite_module(module) do
297-
Forge.Namespace.Module.apply(module)
316+
opts = Process.get(:abstract_code_opts)
317+
Forge.Namespace.Module.run(module, opts)
298318
end
299319
end

apps/forge/lib/forge/namespace/module.ex

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
defmodule Forge.Namespace.Module do
22
@namespace_prefix "XP"
33

4-
def apply(module_name) do
4+
def run(module_name, opts) do
5+
apps = Keyword.fetch!(opts, :apps)
6+
roots = Keyword.fetch!(opts, :roots)
7+
58
cond do
69
prefixed?(module_name) ->
710
module_name
811

9-
module_name in Mix.Tasks.Namespace.app_names() ->
12+
opts[:do_apps] && module_name in apps ->
1013
:"xp_#{module_name}"
1114

1215
true ->
1316
module_name
1417
|> Atom.to_string()
15-
|> apply_namespace()
18+
|> apply_namespace(roots)
1619
end
1720
end
1821

@@ -28,7 +31,7 @@ defmodule Forge.Namespace.Module do
2831
def prefixed?(@namespace_prefix <> _),
2932
do: true
3033

31-
def prefixed?("xp" <> _),
34+
def prefixed?("xp_" <> _),
3235
do: true
3336

3437
def prefixed?([?x, ?p, ?_ | _]), do: true
@@ -38,8 +41,9 @@ defmodule Forge.Namespace.Module do
3841
def prefixed?(_),
3942
do: false
4043

41-
defp apply_namespace("Elixir." <> rest) do
42-
Mix.Tasks.Namespace.root_modules()
44+
defp apply_namespace("Elixir." <> rest, roots) do
45+
roots
46+
|> Enum.filter(fn module -> Macro.classify_atom(module) == :alias end)
4347
|> Enum.map(fn module -> module |> Module.split() |> List.first() end)
4448
|> Enum.reduce_while(rest, fn root_module, module ->
4549
if has_root_module?(root_module, module) do
@@ -57,8 +61,14 @@ defmodule Forge.Namespace.Module do
5761
|> Module.concat()
5862
end
5963

60-
defp apply_namespace(erlang_module) do
61-
String.to_atom(erlang_module)
64+
defp apply_namespace(erlang_module, roots) do
65+
erlang_module = String.to_atom(erlang_module)
66+
67+
if erlang_module in roots do
68+
:"xp_#{erlang_module}"
69+
else
70+
erlang_module
71+
end
6272
end
6373

6474
defp has_root_module?(root_module, root_module), do: true

0 commit comments

Comments
 (0)