It should be added when I fix this: https://github.com/elixir-lang/elixir/issues/11706 :)
On Mon, May 9, 2022 at 8:02 PM Zach Daniel <zachary.s.dan...@gmail.com> wrote: > That sounds perfect! Is there any place that I can see what that public > API will look like? I totally understand on being careful in that regard. > Since Ash DSLs are more like static configuration, there are a few places > where this is acceptable, but we don't use it for every (or even most) of > the places where a module name might be. > > On Monday, May 9, 2022 at 2:00:11 PM UTC-4 José Valim wrote: > >> Btw, we will also have a public API on Elixir v1.14 for expanding >> literals, so the problem shall disappear altogether. However, you must be >> extremely careful: this should only be used if you indeed don't use it at >> compile time. >> >> On Mon, May 9, 2022 at 7:56 PM Zach Daniel <zachary....@gmail.com> wrote: >> >>> Also, I forgot to mention, it was @icecreamcohen on discord who had the >>> idea that redefining alias may work (although they didn't really condone >>> it), don't want to take credit for anyone elses ideas though. >>> On Monday, May 9, 2022 at 1:53:50 PM UTC-4 Zach Daniel wrote: >>> >>>> This is something coming from a compile time optimization that Ash >>>> Framework does. >>>> >>>> In an Ash resource there is something called a change its basically >>>> like a plug but it operates on an Ash.Changeset >>>> >>>> So you might see something like this: >>>> ``` >>>> # in the resource >>>> actions do >>>> create :create_with_employee do >>>> change MyApp.CreateEmployee >>>> end >>>> end >>>> # the change module >>>> defmodule MyApp.CreateEmployee do >>>> use Ash.Resource.Change >>>> >>>> def change(changeset, _opts, _context) do >>>> Ash.Changeset.after_action(changeset, fn _changeset, result -> >>>> MyApp.Employee.create!(result.stuff, ...) >>>> end) >>>> end >>>> end >>>> >>>> Now, the change itself, when it comes to the resource, is simple static >>>> configuration. It cannot affect the compilation of the resource nor should >>>> any thing doing metaprogramming at compile time leverage the internals of >>>> that change >>>> >>>> Something that changes do often is refer to other related resources, >>>> like in this example case. So we drastically increase the surface area for >>>> transitive compile time dependencies >>>> >>>> Because a runtime dependency in one link becomes a compile time >>>> dependency when chained down the road. I.e I depend on the source resource, >>>> call it Post at compile time, and Post depends on Employee now at runtime, >>>> so I now depend on Employee at compile time. >>>> >>>> So to help people with their compile times, I've added some >>>> metaprogramming magic that does the following (only in very specific places >>>> for specific options) Macro.expand(node, %{env | lexical_tracker: nil}) and >>>> it works, no more unnecessary dependency. however, if you do this: >>>> ``` >>>> alias MyApp.CreateEmployee >>>> create :name do >>>> change CreateEmployee >>>> end >>>> ``` >>>> it yells at you for not using the alias, because I just disabled the >>>> thing that would inform the compiler that the alias was used >>>> >>>> I don't necessarily want to add back in those unnecessary compile time >>>> increases, so I'm looking for a way to detect that an alias had been used >>>> in these cases, and produce a compiler warning if you didn't add warn: >>>> false to the alias, that way you don't get a confusing "alias not used" >>>> error, you get (well, I guess you get both) an explanation of why the alias >>>> wasn't used and instructions to add warn: false to fix it. >>>> >>>> >>>> The options I have so far: >>>> >>>> 1. redefine `alias` and default to `warn: false` >>>> 2. redefine `alias` and track which ones have `warn: false` and print a >>>> warning if its used in one of these instances, so they can add it >>>> 3. if I detect that an alias is used, raise an error at compile time >>>> and say that aliases aren't supported here >>>> 4. get something in elixir core that allows explicit control to add >>>> something to an explicit list of "used aliases" >>>> >>>> Looking at the code for the lexical_tracker, it could be as simple as >>>> tracking a separate list of explicitly provided modules, or it could be a >>>> different mode of reference, i.e `:compile` `:runtime` or `:ignore`, that >>>> kind of thing. >>>> >>>> Also, if there is another way to accomplish the goal here I'm open to >>>> suggestions. >>>> >>>> Thanks! >>>> >>> -- >>> >> You received this message because you are subscribed to the Google Groups >>> "elixir-lang-core" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to elixir-lang-co...@googlegroups.com. >>> >> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/elixir-lang-core/f8e4ed44-f3a8-41cc-b82c-f6175ea461fdn%40googlegroups.com >>> <https://groups.google.com/d/msgid/elixir-lang-core/f8e4ed44-f3a8-41cc-b82c-f6175ea461fdn%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > You received this message because you are subscribed to the Google Groups > "elixir-lang-core" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to elixir-lang-core+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/elixir-lang-core/a249ae72-fc35-4ff2-be69-567aa53ceb87n%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/a249ae72-fc35-4ff2-be69-567aa53ceb87n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4Lue_uJZdyChHFL_crrW6PVARBFUzm%3DvS5mmPGSSTFi9A%40mail.gmail.com.