-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Closed
Labels
Description
Elixir and Erlang/OTP versions
Erlang/OTP 26 [erts-14.2.5.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit]
Elixir 1.17.2 (compiled with Erlang/OTP 26)
Operating system
any
Current behavior
In cases where relevant information is after the operator the returned AST is suboptimal. An example (with cursor marked as |
)
case foo do
%{some: some} -> do_sth(some)
%{other: other} = |foo -> {:error, other}
end
AST returned
{:case, [line: 1],
[
{:foo, [line: 1], nil},
[
do: [
{:->, [line: 1],
[
[{:%{}, [line: 1], [some: {:some, [line: 1], nil}]}],
{:__block__, [],
[
{:do_sth, [line: 1], [{:some, [line: 1], nil}]},
{:=, [line: 1],
[
{:%{}, [line: 1], [other: {:other, [line: 1], nil}]},
{:__cursor__, [line: 1], []}
]}
]}
]}
]
]
]}
as if the code was
case foo do
%{some: some} ->
do_sth(some)
%{other: other} = |foo
end
This means the cursor is on the wrong case branch and in wrong context.
I understand that the behaviour is a consequence of tokenizer dropping all code after the cursor and in this case the result is ambiguous.
Expected behavior
Some ideas.
- Use indent as to decide which AST representation is more likely
- Provide some a new API that does not drop valid code after cursor