-
Notifications
You must be signed in to change notification settings - Fork 40
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.
defmodule Foo do
@moduledoc false
my_quote do
alias AliasFor.In.MyQuote
... Foo.Bar.Baz...
... Foo.Bar.Baz ...
end
endresults in:
defmodule Foo do
@moduledoc false
alias Foo.Bar.Baz
my_quote do
alias AliasFor.In.MyQuote
... Baz...
... Baz ...
end
endbut 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
- never go into do blocks of unknown parents looking for liftable aliases (allowlist all kernel forms and nothing else)
- when a do-block contains a module directive, assume that it's equivalent to a
quoteblock 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