summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@dashbit.co>2023-05-04 13:15:33 +0200
committerJosé Valim <jose.valim@dashbit.co>2023-05-04 13:15:33 +0200
commit97d4cd624f8199466dbc6f92e015eb9d5a50ac9a (patch)
tree7900402dd89585a3aca4437a1a9c5de71999f1b4
parentccbdd63070bd80299a3231767880bc9fe10d4903 (diff)
downloadelixir-97d4cd624f8199466dbc6f92e015eb9d5a50ac9a.tar.gz
Properly keep context in map update fragment: %{map |
-rw-r--r--lib/elixir/src/elixir_tokenizer.erl2
-rw-r--r--lib/elixir/test/elixir/code_fragment_test.exs8
-rw-r--r--lib/iex/test/iex/autocomplete_test.exs9
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