elixir icon indicating copy to clipboard operation
elixir copied to clipboard

Code.Fragment.container_cursor_to_quoted does not handle stab well

Open lukaszsamson opened this issue 1 year ago • 0 comments

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.

  1. Use indent as to decide which AST representation is more likely
  2. Provide some a new API that does not drop valid code after cursor

lukaszsamson avatar Sep 14 '24 06:09 lukaszsamson