adobe / adobe/elixir-styler

lifting from within user-defined macros can break compilation

Open
#141 4 comments 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.