Conversation
15ce974 to
3043a23
Compare
08a231f to
82cb19c
Compare
82cb19c to
78026df
Compare
92a4772 to
9bc8fbd
Compare
9bc8fbd to
714ac00
Compare
apps/expert/priv/build_engine.exs
Outdated
| Mix.Task.run("local.hex", ["--force"]) | ||
| Mix.Task.run("local.rebar", ["--force"]) | ||
| Mix.Project.in_project(:engine, engine_source_path, [build_path: out_path], fn _module -> | ||
| Mix.Task.run("deps.get", []) |
There was a problem hiding this comment.
It might be worth downloading the deps at release time and bundling them along with the source code.
I'm mostly thinking about once less network call and mix task that could fail.
Something to consider for the future.
apps/forge/lib/forge/ast.ex
Outdated
| {:ok, quoted} -> | ||
| quoted | ||
| |> Future.Macro.path(&match?({:__cursor__, _, _}, &1)) | ||
| |> Forge.Future.Macro.path(&match?({:__cursor__, _, _}, &1)) |
There was a problem hiding this comment.
Were none of these working before? 😅
There was a problem hiding this comment.
They did but they complicate namespacing!
apps/forge/lib/forge/future/code.ex
Outdated
| # I commented print_diagnostic/1, because it is not used in the codebase. | ||
| # And I changed string_to_quoted/2 to make it use :future_elixir | ||
| defmodule Future.Code do | ||
| defmodule Forge.Future.Code do |
There was a problem hiding this comment.
Oh, disregard my other comment.
|
Sorry, I didn't realize this was a draft. |
|
@mhanberg yeah, it's functional but one bit I need to figure out first is how to make it viable for development, otherwise we need to rebuild the engine every single time we launch expert in case the engine source changed |
e17702f to
ab7472e
Compare
|
@mhanberg this is now ready for review, I moved to |
Also don't mark engine dependencies as optional, otherwise Mix.install won't compile them and the Engine will fail to start
60dd30d to
1af4c51
Compare
|
I'll try this out before bed tonight. |
|
Seems to work, tested with a local release on darwin arm (I still can't get the burrito to work on my linux machine, but I think its from a strange zig compiler memory corruption... the people in the zig discord were extremely confused. still digging into it) One thing is we should send a lsp progress when the engine is compiling. also in general, should be sending more logs through the logMessage notification so that they show up in the output panel/lsp logs inside the editors. i would merge this now tho |
|
I'll add the lsp progress on a followup pr |
🤖 I have created a release *beep* *boop* --- ## [0.1.0-rc.0](v0.1.0...v0.1.0-rc.0) (2026-02-19) ### ⚠ BREAKING CHANGES * add CLI flag handling ([#185](#185)) ### Features * add CLI flag handling ([#185](#185)) ([46713a1](46713a1)) * add engine subcommands to expert ([#254](#254)) ([d7c348c](d7c348c)) * add missing require code action ([#283](#283)) ([a9ee0ec](a9ee0ec)) * configure Workspace Symbols to return all symbols on empty query ([#293](#293)) ([03ec5c6](03ec5c6)) * create undefined function code action ([#287](#287)) ([9624b3a](9624b3a)) * **engine:** hover for module attributes ([#329](#329)) ([1330370](1330370)) * **engine:** indicate progress when loading checkpoint ([#313](#313)) ([fad5a0b](fad5a0b)) * **engine:** support shorthand notation inside ~H sigil ([#278](#278)) ([e1e5666](e1e5666)) * **engine:** use ElixirSense for hover resolution ([#351](#351)) ([0e7896b](0e7896b)) * epmdless clustering ([#205](#205)) ([488d3a9](488d3a9)) * epmdless deployments ([#167](#167)) ([9cfb5cc](9cfb5cc)) * on the fly engine builds ([#24](#24)) ([51eb6f1](51eb6f1)) * use Spitfire to provide document symbols on documents with syntax errors ([#288](#288)) ([2ed7a81](2ed7a81)) * windows support ([#219](#219)) ([d0927ce](d0927ce)) * workspace folders ([#18](#18)) ([1204313](1204313)), closes [#136](#136) ### Bug Fixes * add lsp logging when failing to find an elixir executable ([#169](#169)) ([4dfba22](4dfba22)) * avoid crashing when calling `ActiveProjects.active?/1` ([#297](#297)) ([ae352b9](ae352b9)) * better handling of native<->lsp conversions ([#34](#34)) ([88dc456](88dc456)) * bring back completions for things defined in test files ([#32](#32)) ([8d7a47a](8d7a47a)) * clamp start_char for comletion prefix ([#239](#239)) ([46d3446](46d3446)) * **cli:** don't crash when there is no CLI arg provided ([#348](#348)) ([9a9140e](9a9140e)) * **cli:** show per tool version engine builds ([#301](#301)) ([399b2a0](399b2a0)) * correctly order aliases ([#322](#322)) ([fb269fa](fb269fa)) * Crash when typing english ([#742](https://github.com/elixir-lang/expert/issues/742)) ([697eac9](697eac9)), closes [#741](https://github.com/elixir-lang/expert/issues/741) * Current module not identified in defimpl ([#665](https://github.com/elixir-lang/expert/issues/665)) ([29f1055](29f1055)) * **deps:** update sourceror to 1.10.1 to fix range calculations ([#362](#362)) ([59489c7](59489c7)) * disable shell sessions when fetching the PATH ([#177](#177)) ([78236ef](78236ef)) * do not clamp character recvd from client ([#123](#123)) ([1a3b843](1a3b843)) * don't convert to_lsp twice in server specific messages ([#190](#190)) ([33bb850](33bb850)) * don't sometimes hang ([5d6bcde](5d6bcde)) * Edge case for module loading ([#738](https://github.com/elixir-lang/expert/issues/738)) ([dbbef2c](dbbef2c)) * elixir path discovery ([#248](#248)) ([f9b119c](f9b119c)) * **engine_node:** error reason not being shown ([#277](#277)) ([c7b7fa8](c7b7fa8)) * **engine:** avoid duplicate spec annotation when falling back to ElixirSense ([#410](#410)) ([5b4faee](5b4faee)) * **engine:** code lens exception when mix.exs not found ([#281](#281)) ([f9c81da](f9c81da)) * **engine:** correctly match any-struct references ([#347](#347)) ([6a92581](6a92581)) * **engine:** don't attempt search when ETS checkpoint is loading ([#308](#308)) ([438c965](438c965)) * **engine:** don't crash on hover for piped expression in curly braces in HEEx ([#350](#350)) ([f0044d6](f0044d6)) * **engine:** don't crash when calling references on an atom ([#396](#396)) ([a8badfc](a8badfc)) * **engine:** don't terminate search store on timeout ([#338](#338)) ([d91f6af](d91f6af)), closes [#303](#303) * **engine:** download Hex and Rebar only if missing ([#337](#337)) ([bc7f57e](bc7f57e)) * **engine:** handle failing build script ([#188](#188)) ([ce9ac22](ce9ac22)) * **engine:** handle matches against any struct ([#343](#343)) ([86fe8ec](86fe8ec)) * **engine:** improve entity resolution for HEEx components with curly braces ([#328](#328)) ([eff68bf](eff68bf)) * **engine:** index functions with default arguments ([#402](#402)) ([1aea6c7](1aea6c7)) * **engine:** resolve correct arity from inside ~H sigil ([#314](#314)) ([d2eacc0](d2eacc0)) * **engine:** stuck on format request ([#378](#378)) ([aa5ba2b](aa5ba2b)) * **engine:** support go to definition when function is called via __MODULE__ ([#261](#261)) ([b1d5e17](b1d5e17)) * Exclude expert dependencies from completions based on project dependencies ([3a47058](3a47058)) * **expert:** always log PATH on start ([#387](#387)) ([bfeb8a2](bfeb8a2)) * **expert:** build engine for elixir version 1.16.1 and below ([#330](#330)) ([2a2bdd9](2a2bdd9)) * **expert:** correctly handle unicode characters sent via port ([#388](#388)) ([4fe530b](4fe530b)) * **expert:** print to stderr when no transport argument provided ([#280](#280)) ([fc841e4](fc841e4)) * **expert:** save new configuration after `workspace/didChangeConfiguration` ([#282](#282)) ([b060d23](b060d23)) * **expert:** spec completions for functions with guards ([#406](#406)) ([d615858](d615858)) * fallback to packaged or system elixir ([#300](#300)) ([10262cf](10262cf)) * filter out RELEASE_ROOT from PATH instead of running a login shell ([#344](#344)) ([375391c](375391c)) * fix release-all command ([492022f](492022f)) * fixup namespacing and packaging ([#29](#29)) ([69ac8fe](69ac8fe)) * **forge:** don't crash on analysis of code with incorrect aliases ([#408](#408)) ([7c30502](7c30502)) * **forge:** handle interpolation when it starts with a special token ([#342](#342)) ([dd7b027](dd7b027)) * **forge:** improve log when Spitfire crashes ([#352](#352)) ([80900e5](80900e5)) * formatting format incorrectly when contain special character ([#252](#252)) ([b5b001b](b5b001b)) * Function definition extractor chokes on macro functions ([#682](https://github.com/elixir-lang/expert/issues/682)) ([ccf355f](ccf355f)), closes [#680](https://github.com/elixir-lang/expert/issues/680) * give proper argument to `TaskQueue.add/2` in Server.handle_message ([#791](https://github.com/elixir-lang/expert/issues/791)) ([34ee071](34ee071)) * handle missing metadata in indexer extractors ([#390](#390)) ([71c33f1](71c33f1)) * handle spitfire crashes ([#319](#319)) ([ffe360c](ffe360c)) * handle string ids in requests ([#120](#120)) ([5d6bcde](5d6bcde)) * include erlang source files when packaging engine ([580ccc8](580ccc8)) * inherited PATH pollutes project environment ([#298](#298)) ([8e1bb3d](8e1bb3d)) * interpolation_ranges/1 should work for empty interpolations ([#321](#321)) ([3ec1810](3ec1810)) * Invalid reads for requests that contain multi-byte characters ([#661](https://github.com/elixir-lang/expert/issues/661)) ([f6ca36f](f6ca36f)) * let the system figure out the elixir version for the project ([#162](#162)) ([5dacce4](5dacce4)) * log project's erl path ([#367](#367)) ([d8c81cd](d8c81cd)) * make sure asdf shims are in the PATH ([#87](#87)) ([7626f90](7626f90)) * Module suggestion was incorrect for files with multiple periods ([#705](https://github.com/elixir-lang/expert/issues/705)) ([824df66](824df66)), closes [#703](https://github.com/elixir-lang/expert/issues/703) * nil.__struct__/0 is undefined when receiving shutdown ([#250](#250)) ([849003e](849003e)) * **nix:** use eval release command ([#199](#199)) ([25f80c8](25f80c8)) * Non-string test names crash exunit indexer ([#676](https://github.com/elixir-lang/expert/issues/676)) ([29373d5](29373d5)), closes [#675](https://github.com/elixir-lang/expert/issues/675) * properly log when engine fails to initialize ([#244](#244)) ([81e1184](81e1184)) * properly set the mix env when building expert ([4caf258](4caf258)) * **release:** don't cd into rel directory before starting app ([#268](#268)) ([3b76e97](3b76e97)) * remove all usages of epmd ([#339](#339)) ([cef4adb](cef4adb)) * remove erts from extra_applications ([#202](#202)) ([aa8bd84](aa8bd84)) * remove escape sequences from PATH in fish ([#237](#237)) ([b237fd5](b237fd5)) * Resolve doesn't recognize zero-arg defs as functions ([#606](https://github.com/elixir-lang/expert/issues/606)) ([38a649c](38a649c)), closes [#604](https://github.com/elixir-lang/expert/issues/604) * resolve function delegates on hover docs ([#399](#399)) ([a3c629a](a3c629a)) * revert "feat: epmdless deployments ([#167](#167))" ([#180](#180)) ([0f66faa](0f66faa)) * revert dev server ([#48](#48)) ([9345e31](9345e31)) * sanitize node names ([#323](#323)) ([7591304](7591304)) * start projects after server is initialized ([#294](#294)) ([76d6cd5](76d6cd5)) * stop sending genlsp datastructures to engine ([#31](#31)) ([43d406f](43d406f)) * support Fish shell's space-separated PATH format ([#172](#172)) ([9803293](9803293)) * support mise et al on windows ([#304](#304)) ([3cc343f](3cc343f)) * support Nushell for PATH detection ([#272](#272)) ([8a9fd3d](8a9fd3d)) * trim any quotes wrapping PATH when elixir is managed by mise ([#82](#82)) ([d828966](d828966)) * trim PATH returned by shell ([#213](#213)) ([735199d](735199d)) * update document store on didchange even without the engine running ([#326](#326)) ([c80b72d](c80b72d)) * update gen_lsp to 0.11.3 ([#315](#315)) ([13cfee6](13cfee6)), closes [#245](#245) * update spitfire to v0.3.4 ([#373](#373)) ([6f57f16](6f57f16)) * update spitfire to v0.3.5 ([#376](#376)) ([85822fe](85822fe)) * use Calendar.UTCOnlyTimeZoneDatabase instead of project configured tz database ([#324](#324)) ([9e913f6](9e913f6)) * use correct build directory when namespacing expert ([b6540dd](b6540dd)) * use dynamic registrations and start project node asynchronously ([#30](#30)) ([e1ce165](e1ce165)) * use minimal PATH on unix instead of fully removing it ([#305](#305)) ([74da1a5](74da1a5)) * use project directory when building engine ([#203](#203)) ([c5ac441](c5ac441)) * utf8_prefix should take into account empty lines ([#164](#164)) ([16c21e0](16c21e0)) ### Miscellaneous Chores * release as 0.1.0 ([7625d3c](7625d3c)) * release as 0.1.0-rc.0 ([c98b870](c98b870)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- [0.1.0-rc.0](elixir-lang/expert@v0.1.0...v0.1.0-rc.0) (2026-02-19) * add CLI flag handling ([elixir-lang#185](elixir-lang#185)) * add CLI flag handling ([elixir-lang#185](elixir-lang#185)) ([46713a1](elixir-lang@46713a1)) * add engine subcommands to expert ([elixir-lang#254](elixir-lang#254)) ([d7c348c](elixir-lang@d7c348c)) * add missing require code action ([elixir-lang#283](elixir-lang#283)) ([a9ee0ec](elixir-lang@a9ee0ec)) * configure Workspace Symbols to return all symbols on empty query ([elixir-lang#293](elixir-lang#293)) ([03ec5c6](elixir-lang@03ec5c6)) * create undefined function code action ([elixir-lang#287](elixir-lang#287)) ([9624b3a](elixir-lang@9624b3a)) * **engine:** hover for module attributes ([elixir-lang#329](elixir-lang#329)) ([1330370](elixir-lang@1330370)) * **engine:** indicate progress when loading checkpoint ([elixir-lang#313](elixir-lang#313)) ([fad5a0b](elixir-lang@fad5a0b)) * **engine:** support shorthand notation inside ~H sigil ([elixir-lang#278](elixir-lang#278)) ([e1e5666](elixir-lang@e1e5666)) * **engine:** use ElixirSense for hover resolution ([elixir-lang#351](elixir-lang#351)) ([0e7896b](elixir-lang@0e7896b)) * epmdless clustering ([elixir-lang#205](elixir-lang#205)) ([488d3a9](elixir-lang@488d3a9)) * epmdless deployments ([elixir-lang#167](elixir-lang#167)) ([9cfb5cc](elixir-lang@9cfb5cc)) * on the fly engine builds ([elixir-lang#24](elixir-lang#24)) ([51eb6f1](elixir-lang@51eb6f1)) * use Spitfire to provide document symbols on documents with syntax errors ([elixir-lang#288](elixir-lang#288)) ([2ed7a81](elixir-lang@2ed7a81)) * windows support ([elixir-lang#219](elixir-lang#219)) ([d0927ce](elixir-lang@d0927ce)) * workspace folders ([elixir-lang#18](elixir-lang#18)) ([1204313](elixir-lang@1204313)), closes [elixir-lang#136](elixir-lang#136) * add lsp logging when failing to find an elixir executable ([elixir-lang#169](elixir-lang#169)) ([4dfba22](elixir-lang@4dfba22)) * avoid crashing when calling `ActiveProjects.active?/1` ([elixir-lang#297](elixir-lang#297)) ([ae352b9](elixir-lang@ae352b9)) * better handling of native<->lsp conversions ([elixir-lang#34](elixir-lang#34)) ([88dc456](elixir-lang@88dc456)) * bring back completions for things defined in test files ([elixir-lang#32](elixir-lang#32)) ([8d7a47a](elixir-lang@8d7a47a)) * clamp start_char for comletion prefix ([elixir-lang#239](elixir-lang#239)) ([46d3446](elixir-lang@46d3446)) * **cli:** don't crash when there is no CLI arg provided ([elixir-lang#348](elixir-lang#348)) ([9a9140e](elixir-lang@9a9140e)) * **cli:** show per tool version engine builds ([elixir-lang#301](elixir-lang#301)) ([399b2a0](elixir-lang@399b2a0)) * correctly order aliases ([elixir-lang#322](elixir-lang#322)) ([fb269fa](elixir-lang@fb269fa)) * Crash when typing english ([#742](https://github.com/elixir-lang/expert/issues/742)) ([697eac9](elixir-lang@697eac9)), closes [#741](https://github.com/elixir-lang/expert/issues/741) * Current module not identified in defimpl ([#665](https://github.com/elixir-lang/expert/issues/665)) ([29f1055](elixir-lang@29f1055)) * **deps:** update sourceror to 1.10.1 to fix range calculations ([elixir-lang#362](elixir-lang#362)) ([59489c7](elixir-lang@59489c7)) * disable shell sessions when fetching the PATH ([elixir-lang#177](elixir-lang#177)) ([78236ef](elixir-lang@78236ef)) * do not clamp character recvd from client ([elixir-lang#123](elixir-lang#123)) ([1a3b843](elixir-lang@1a3b843)) * don't convert to_lsp twice in server specific messages ([elixir-lang#190](elixir-lang#190)) ([33bb850](elixir-lang@33bb850)) * don't sometimes hang ([5d6bcde](elixir-lang@5d6bcde)) * Edge case for module loading ([#738](https://github.com/elixir-lang/expert/issues/738)) ([dbbef2c](elixir-lang@dbbef2c)) * elixir path discovery ([elixir-lang#248](elixir-lang#248)) ([f9b119c](elixir-lang@f9b119c)) * **engine_node:** error reason not being shown ([elixir-lang#277](elixir-lang#277)) ([c7b7fa8](elixir-lang@c7b7fa8)) * **engine:** avoid duplicate spec annotation when falling back to ElixirSense ([elixir-lang#410](elixir-lang#410)) ([5b4faee](elixir-lang@5b4faee)) * **engine:** code lens exception when mix.exs not found ([elixir-lang#281](elixir-lang#281)) ([f9c81da](elixir-lang@f9c81da)) * **engine:** correctly match any-struct references ([elixir-lang#347](elixir-lang#347)) ([6a92581](elixir-lang@6a92581)) * **engine:** don't attempt search when ETS checkpoint is loading ([elixir-lang#308](elixir-lang#308)) ([438c965](elixir-lang@438c965)) * **engine:** don't crash on hover for piped expression in curly braces in HEEx ([elixir-lang#350](elixir-lang#350)) ([f0044d6](elixir-lang@f0044d6)) * **engine:** don't crash when calling references on an atom ([elixir-lang#396](elixir-lang#396)) ([a8badfc](elixir-lang@a8badfc)) * **engine:** don't terminate search store on timeout ([elixir-lang#338](elixir-lang#338)) ([d91f6af](elixir-lang@d91f6af)), closes [elixir-lang#303](elixir-lang#303) * **engine:** download Hex and Rebar only if missing ([elixir-lang#337](elixir-lang#337)) ([bc7f57e](elixir-lang@bc7f57e)) * **engine:** handle failing build script ([elixir-lang#188](elixir-lang#188)) ([ce9ac22](elixir-lang@ce9ac22)) * **engine:** handle matches against any struct ([elixir-lang#343](elixir-lang#343)) ([86fe8ec](elixir-lang@86fe8ec)) * **engine:** improve entity resolution for HEEx components with curly braces ([elixir-lang#328](elixir-lang#328)) ([eff68bf](elixir-lang@eff68bf)) * **engine:** index functions with default arguments ([elixir-lang#402](elixir-lang#402)) ([1aea6c7](elixir-lang@1aea6c7)) * **engine:** resolve correct arity from inside ~H sigil ([elixir-lang#314](elixir-lang#314)) ([d2eacc0](elixir-lang@d2eacc0)) * **engine:** stuck on format request ([elixir-lang#378](elixir-lang#378)) ([aa5ba2b](elixir-lang@aa5ba2b)) * **engine:** support go to definition when function is called via __MODULE__ ([elixir-lang#261](elixir-lang#261)) ([b1d5e17](elixir-lang@b1d5e17)) * Exclude expert dependencies from completions based on project dependencies ([3a47058](elixir-lang@3a47058)) * **expert:** always log PATH on start ([elixir-lang#387](elixir-lang#387)) ([bfeb8a2](elixir-lang@bfeb8a2)) * **expert:** build engine for elixir version 1.16.1 and below ([elixir-lang#330](elixir-lang#330)) ([2a2bdd9](elixir-lang@2a2bdd9)) * **expert:** correctly handle unicode characters sent via port ([elixir-lang#388](elixir-lang#388)) ([4fe530b](elixir-lang@4fe530b)) * **expert:** print to stderr when no transport argument provided ([elixir-lang#280](elixir-lang#280)) ([fc841e4](elixir-lang@fc841e4)) * **expert:** save new configuration after `workspace/didChangeConfiguration` ([elixir-lang#282](elixir-lang#282)) ([b060d23](elixir-lang@b060d23)) * **expert:** spec completions for functions with guards ([elixir-lang#406](elixir-lang#406)) ([d615858](elixir-lang@d615858)) * fallback to packaged or system elixir ([elixir-lang#300](elixir-lang#300)) ([10262cf](elixir-lang@10262cf)) * filter out RELEASE_ROOT from PATH instead of running a login shell ([elixir-lang#344](elixir-lang#344)) ([375391c](elixir-lang@375391c)) * fix release-all command ([492022f](elixir-lang@492022f)) * fixup namespacing and packaging ([elixir-lang#29](elixir-lang#29)) ([69ac8fe](elixir-lang@69ac8fe)) * **forge:** don't crash on analysis of code with incorrect aliases ([elixir-lang#408](elixir-lang#408)) ([7c30502](elixir-lang@7c30502)) * **forge:** handle interpolation when it starts with a special token ([elixir-lang#342](elixir-lang#342)) ([dd7b027](elixir-lang@dd7b027)) * **forge:** improve log when Spitfire crashes ([elixir-lang#352](elixir-lang#352)) ([80900e5](elixir-lang@80900e5)) * formatting format incorrectly when contain special character ([elixir-lang#252](elixir-lang#252)) ([b5b001b](elixir-lang@b5b001b)) * Function definition extractor chokes on macro functions ([#682](https://github.com/elixir-lang/expert/issues/682)) ([ccf355f](elixir-lang@ccf355f)), closes [#680](https://github.com/elixir-lang/expert/issues/680) * give proper argument to `TaskQueue.add/2` in Server.handle_message ([#791](https://github.com/elixir-lang/expert/issues/791)) ([34ee071](elixir-lang@34ee071)) * handle missing metadata in indexer extractors ([elixir-lang#390](elixir-lang#390)) ([71c33f1](elixir-lang@71c33f1)) * handle spitfire crashes ([elixir-lang#319](elixir-lang#319)) ([ffe360c](elixir-lang@ffe360c)) * handle string ids in requests ([elixir-lang#120](elixir-lang#120)) ([5d6bcde](elixir-lang@5d6bcde)) * include erlang source files when packaging engine ([580ccc8](elixir-lang@580ccc8)) * inherited PATH pollutes project environment ([elixir-lang#298](elixir-lang#298)) ([8e1bb3d](elixir-lang@8e1bb3d)) * interpolation_ranges/1 should work for empty interpolations ([elixir-lang#321](elixir-lang#321)) ([3ec1810](elixir-lang@3ec1810)) * Invalid reads for requests that contain multi-byte characters ([#661](https://github.com/elixir-lang/expert/issues/661)) ([f6ca36f](elixir-lang@f6ca36f)) * let the system figure out the elixir version for the project ([elixir-lang#162](elixir-lang#162)) ([5dacce4](elixir-lang@5dacce4)) * log project's erl path ([elixir-lang#367](elixir-lang#367)) ([d8c81cd](elixir-lang@d8c81cd)) * make sure asdf shims are in the PATH ([elixir-lang#87](elixir-lang#87)) ([7626f90](elixir-lang@7626f90)) * Module suggestion was incorrect for files with multiple periods ([#705](https://github.com/elixir-lang/expert/issues/705)) ([824df66](elixir-lang@824df66)), closes [#703](https://github.com/elixir-lang/expert/issues/703) * nil.__struct__/0 is undefined when receiving shutdown ([elixir-lang#250](elixir-lang#250)) ([849003e](elixir-lang@849003e)) * **nix:** use eval release command ([elixir-lang#199](elixir-lang#199)) ([25f80c8](elixir-lang@25f80c8)) * Non-string test names crash exunit indexer ([#676](https://github.com/elixir-lang/expert/issues/676)) ([29373d5](elixir-lang@29373d5)), closes [#675](https://github.com/elixir-lang/expert/issues/675) * properly log when engine fails to initialize ([elixir-lang#244](elixir-lang#244)) ([81e1184](elixir-lang@81e1184)) * properly set the mix env when building expert ([4caf258](elixir-lang@4caf258)) * **release:** don't cd into rel directory before starting app ([elixir-lang#268](elixir-lang#268)) ([3b76e97](elixir-lang@3b76e97)) * remove all usages of epmd ([elixir-lang#339](elixir-lang#339)) ([cef4adb](elixir-lang@cef4adb)) * remove erts from extra_applications ([elixir-lang#202](elixir-lang#202)) ([aa8bd84](elixir-lang@aa8bd84)) * remove escape sequences from PATH in fish ([elixir-lang#237](elixir-lang#237)) ([b237fd5](elixir-lang@b237fd5)) * Resolve doesn't recognize zero-arg defs as functions ([#606](https://github.com/elixir-lang/expert/issues/606)) ([38a649c](elixir-lang@38a649c)), closes [#604](https://github.com/elixir-lang/expert/issues/604) * resolve function delegates on hover docs ([elixir-lang#399](elixir-lang#399)) ([a3c629a](elixir-lang@a3c629a)) * revert "feat: epmdless deployments ([elixir-lang#167](elixir-lang#167))" ([elixir-lang#180](elixir-lang#180)) ([0f66faa](elixir-lang@0f66faa)) * revert dev server ([elixir-lang#48](elixir-lang#48)) ([9345e31](elixir-lang@9345e31)) * sanitize node names ([elixir-lang#323](elixir-lang#323)) ([7591304](elixir-lang@7591304)) * start projects after server is initialized ([elixir-lang#294](elixir-lang#294)) ([76d6cd5](elixir-lang@76d6cd5)) * stop sending genlsp datastructures to engine ([elixir-lang#31](elixir-lang#31)) ([43d406f](elixir-lang@43d406f)) * support Fish shell's space-separated PATH format ([elixir-lang#172](elixir-lang#172)) ([9803293](elixir-lang@9803293)) * support mise et al on windows ([elixir-lang#304](elixir-lang#304)) ([3cc343f](elixir-lang@3cc343f)) * support Nushell for PATH detection ([elixir-lang#272](elixir-lang#272)) ([8a9fd3d](elixir-lang@8a9fd3d)) * trim any quotes wrapping PATH when elixir is managed by mise ([elixir-lang#82](elixir-lang#82)) ([d828966](elixir-lang@d828966)) * trim PATH returned by shell ([elixir-lang#213](elixir-lang#213)) ([735199d](elixir-lang@735199d)) * update document store on didchange even without the engine running ([elixir-lang#326](elixir-lang#326)) ([c80b72d](elixir-lang@c80b72d)) * update gen_lsp to 0.11.3 ([elixir-lang#315](elixir-lang#315)) ([13cfee6](elixir-lang@13cfee6)), closes [elixir-lang#245](elixir-lang#245) * update spitfire to v0.3.4 ([elixir-lang#373](elixir-lang#373)) ([6f57f16](elixir-lang@6f57f16)) * update spitfire to v0.3.5 ([elixir-lang#376](elixir-lang#376)) ([85822fe](elixir-lang@85822fe)) * use Calendar.UTCOnlyTimeZoneDatabase instead of project configured tz database ([elixir-lang#324](elixir-lang#324)) ([9e913f6](elixir-lang@9e913f6)) * use correct build directory when namespacing expert ([b6540dd](elixir-lang@b6540dd)) * use dynamic registrations and start project node asynchronously ([elixir-lang#30](elixir-lang#30)) ([e1ce165](elixir-lang@e1ce165)) * use minimal PATH on unix instead of fully removing it ([elixir-lang#305](elixir-lang#305)) ([74da1a5](elixir-lang@74da1a5)) * use project directory when building engine ([elixir-lang#203](elixir-lang#203)) ([c5ac441](elixir-lang@c5ac441)) * utf8_prefix should take into account empty lines ([elixir-lang#164](elixir-lang#164)) ([16c21e0](elixir-lang@16c21e0)) * release as 0.1.0 ([7625d3c](elixir-lang@7625d3c)) * release as 0.1.0-rc.0 ([c98b870](elixir-lang@c98b870)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Ideally, the Project node would use an Engine built with the same elixir and otp versions as the project.
This PR adds support for that, looking at the user's data folder(
AppDatain windows,.local/sharein linux,Library/Application Supporton macos, etc) for an Engine build matching the project versions, and building an engine matching the user's elixir+otp on the fly if none is found