diff options
author | José Valim <jose.valim@dashbit.co> | 2023-05-04 13:15:33 +0200 |
---|---|---|
committer | José Valim <jose.valim@dashbit.co> | 2023-05-04 13:15:33 +0200 |
commit | 97d4cd624f8199466dbc6f92e015eb9d5a50ac9a (patch) | |
tree | 7900402dd89585a3aca4437a1a9c5de71999f1b4 | |
parent | ccbdd63070bd80299a3231767880bc9fe10d4903 (diff) | |
download | elixir-97d4cd624f8199466dbc6f92e015eb9d5a50ac9a.tar.gz |
Properly keep context in map update fragment: %{map |
-rw-r--r-- | lib/elixir/src/elixir_tokenizer.erl | 2 | ||||
-rw-r--r-- | lib/elixir/test/elixir/code_fragment_test.exs | 8 | ||||
-rw-r--r-- | lib/iex/test/iex/autocomplete_test.exs | 9 |
3 files changed, 13 insertions, 6 deletions
diff --git a/lib/elixir/src/elixir_tokenizer.erl b/lib/elixir/src/elixir_tokenizer.erl index d26a8bbf8..cca210161 100644 --- a/lib/elixir/src/elixir_tokenizer.erl +++ b/lib/elixir/src/elixir_tokenizer.erl @@ -1783,6 +1783,8 @@ prune_tokens([{kw_identifier_unsafe, _, _} | _] = Tokens, [], Terminators) -> %%% we usually skip operators, except these contextual ones prune_tokens([{type_op, _, '::'} | _] = Tokens, [], [{'<<', _, _} | _] = Terminators) -> {Tokens, Terminators}; +prune_tokens([{pipe_op, _, '|'} | _] = Tokens, [], [{'{', _, _} | _] = Terminators) -> + {Tokens, Terminators}; %%% or we traverse until the end. prune_tokens([_ | Tokens], Opener, Terminators) -> prune_tokens(Tokens, Opener, Terminators); diff --git a/lib/elixir/test/elixir/code_fragment_test.exs b/lib/elixir/test/elixir/code_fragment_test.exs index 2973de8fd..fe447d789 100644 --- a/lib/elixir/test/elixir/code_fragment_test.exs +++ b/lib/elixir/test/elixir/code_fragment_test.exs @@ -1136,11 +1136,19 @@ defmodule CodeFragmentTest do assert cc2q("%{bar:") == s2q("%{__cursor__()}") assert cc2q("%{bar: ") == s2q("%{bar: __cursor__()}") assert cc2q("%{bar: baz,") == s2q("%{bar: baz, __cursor__()}") + assert cc2q("%{foo | ") == s2q("%{foo | __cursor__()}") + assert cc2q("%{foo | bar:") == s2q("%{foo | __cursor__()}") + assert cc2q("%{foo | bar: ") == s2q("%{foo | bar: __cursor__()}") + assert cc2q("%{foo | bar: baz,") == s2q("%{foo | bar: baz, __cursor__()}") assert cc2q("%Foo") == s2q("__cursor__()") assert cc2q("%Foo{") == s2q("%Foo{__cursor__()}") assert cc2q("%Foo{bar: ") == s2q("%Foo{bar: __cursor__()}") assert cc2q("%Foo{bar: baz,") == s2q("%Foo{bar: baz, __cursor__()}") + assert cc2q("%Foo{foo | ") == s2q("%Foo{foo | __cursor__()}") + assert cc2q("%Foo{foo | bar:") == s2q("%Foo{foo | __cursor__()}") + assert cc2q("%Foo{foo | bar: ") == s2q("%Foo{foo | bar: __cursor__()}") + assert cc2q("%Foo{foo | bar: baz,") == s2q("%Foo{foo | bar: baz, __cursor__()}") end test "binaries" do diff --git a/lib/iex/test/iex/autocomplete_test.exs b/lib/iex/test/iex/autocomplete_test.exs index dd4a5be42..56b574020 100644 --- a/lib/iex/test/iex/autocomplete_test.exs +++ b/lib/iex/test/iex/autocomplete_test.exs @@ -434,12 +434,9 @@ defmodule IEx.AutocompleteTest do test "completion for map keys in update syntax" do eval("map = %{some: 1, other: :ok, another: \"qwe\"}") - # Code.Fragment.container_cursor_to_quoted returns - # {:%{}, [line: 1], [{:__cursor__, [line: 1], []}]} - # and `map` variable and map update AST is lost - # assert {:yes, ~c"", entries} = expand(~c"%{map | ") - # assert ~c"some:" in entries - # assert ~c"other:" in entries + assert {:yes, ~c"", entries} = expand(~c"%{map | ") + assert ~c"some:" in entries + assert ~c"other:" in entries assert {:yes, ~c"", entries} = expand(~c"%{map | some: \"foo\",") assert ~c"some:" not in entries |