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-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/4992a477-1372-4161-bcf4-0e35a82f154en%40googlegroups.com.

Reply via email to