lifting from within user-defined macros can break compilation
- Dominant language
- Elixir
- Stars
- 804
- Forks
- 45
- Avg merge
- 6d 6h
- Merged PRs (30d)
- 1
Description
## Versions
currently on main, but 0.12 when it gets cut
## Example Input
lifting is smart enough to not interact with `quote` children, but user-defined macros can hide that that's occurring.
```elixir
defmodule Foo do
@moduledoc false
my_quote do
alias AliasFor.In.MyQuote
... Foo.Bar.Baz...
... Foo.Bar.Baz ...
end
end
```
results in:
```elixir
defmodule Foo do
@moduledoc false
alias Foo.Bar.Baz
my_quote do
alias AliasFor.In.MyQuote
... Baz...
... Baz ...
end
end
```
but as with quote, the compiler will warn that `Baz` is unused within `Foo`, and anything that uses `my_quote` will then error on `Baz` being undefined
as-is, the user will have to put the alias where it belongs inside `my_quote`, which styler is just fine with and will leave be. still, i'd like styler to not leave a codebase uncompilable, even if it just requires a simple human fix
### Fix
I see two possible
1. never go into do blocks of unknown parents looking for liftable aliases (allowlist all kernel forms and nothing else)
2. when a do-block contains a module directive, assume that it's equivalent to a `quote` block and back out of it
there are pros and cons to each, but 2 probably gives the more correct result, with the downside being a more complex look-ahead implementation. actually, the real win might be doing a combination of both: when encounter directives in a nested scope, figure out if it's a known block parent. if it is, carry on. if it's not, assume this works as a quote does and don't lift
Contributor guide
Research direction
Start by reproducing the Example Input on main and inspect how styler lifts aliases through nested do-blocks and handles quote children. Compare the two proposed fixes, then verify that code using a user-defined macro still compiles without an unused outer alias or an undefined name inside the macro.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- elixir
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100