Skip to content

Commit ca0d6ad

Browse files
committed
Keep operators and identifiers in container_cursor_to_quoted
1 parent d1d3a08 commit ca0d6ad

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

lib/elixir/src/elixir_tokenizer.erl

+7-1
Original file line numberDiff line numberDiff line change
@@ -1721,7 +1721,8 @@ cursor_complete(Line, Column, Terminators, Tokens) ->
17211721
add_cursor(_Line, Column, noprune, Terminators, Tokens) ->
17221722
{Column, Terminators, Tokens};
17231723
add_cursor(Line, Column, prune_and_cursor, Terminators, Tokens) ->
1724-
{PrunedTokens, PrunedTerminators} = prune_tokens(Tokens, [], Terminators),
1724+
PrePrunedTokens = prune_identifier(Tokens),
1725+
{PrunedTokens, PrunedTerminators} = prune_tokens(PrePrunedTokens, [], Terminators),
17251726
CursorTokens = [
17261727
{')', {Line, Column + 11, nil}},
17271728
{'(', {Line, Column + 10, nil}},
@@ -1730,6 +1731,9 @@ add_cursor(Line, Column, prune_and_cursor, Terminators, Tokens) ->
17301731
],
17311732
{Column + 12, PrunedTerminators, CursorTokens}.
17321733

1734+
prune_identifier([{identifier, _, _} | Tokens]) -> Tokens;
1735+
prune_identifier(Tokens) -> Tokens.
1736+
17331737
%%% Any terminator needs to be closed
17341738
prune_tokens([{'end', _} | Tokens], Opener, Terminators) ->
17351739
prune_tokens(Tokens, ['end' | Opener], Terminators);
@@ -1776,6 +1780,8 @@ prune_tokens([{'{', _} | _] = Tokens, [], Terminators) ->
17761780
{Tokens, Terminators};
17771781
prune_tokens([{'<<', _} | _] = Tokens, [], Terminators) ->
17781782
{Tokens, Terminators};
1783+
prune_tokens([{identifier, _, _} | _] = Tokens, [], Terminators) ->
1784+
{Tokens, Terminators};
17791785
prune_tokens([{block_identifier, _, _} | _] = Tokens, [], Terminators) ->
17801786
{Tokens, Terminators};
17811787
prune_tokens([{kw_identifier, _, _} | _] = Tokens, [], Terminators) ->

lib/elixir/test/elixir/code_fragment_test.exs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1101,8 +1101,10 @@ defmodule CodeFragmentTest do
11011101
end
11021102

11031103
test "keeps function calls without parens" do
1104-
# assert cc2q("alias foo") == s2q("alias __cursor__()")
1105-
# assert cc2q("alias Foo.Bar") == s2q("alias __cursor__()")
1104+
assert cc2q("alias") == s2q("__cursor__()")
1105+
assert cc2q("alias ") == s2q("alias __cursor__()")
1106+
assert cc2q("alias foo") == s2q("alias __cursor__()")
1107+
assert cc2q("alias Foo.Bar") == s2q("alias __cursor__()")
11061108
assert cc2q("alias Foo.Bar,") == s2q("alias Foo.Bar, __cursor__()")
11071109
assert cc2q("alias Foo.Bar, as: ") == s2q("alias Foo.Bar, as: __cursor__()")
11081110
end

lib/iex/lib/iex/autocomplete.ex

+11-2
Original file line numberDiff line numberDiff line change
@@ -382,8 +382,11 @@ defmodule IEx.Autocomplete do
382382
[cursor, pairs, {:|, _, [{variable, _, nil} | _]}, {:%{}, _, _} | _] ->
383383
container_context_map(cursor, pairs, variable, shell)
384384

385-
[cursor, {:"::", _, [_, cursor]}, {:<<>>, _, [_ | _]} | _] ->
386-
:bitstring_modifier
385+
[cursor | tail] ->
386+
case remove_operators(tail, cursor) do
387+
[{:"::", _, [_, _]}, {:<<>>, _, [_ | _]} | _] -> :bitstring_modifier
388+
_ -> nil
389+
end
387390

388391
_ ->
389392
nil
@@ -394,6 +397,12 @@ defmodule IEx.Autocomplete do
394397
end
395398
end
396399

400+
defp remove_operators([{op, _, [_, previous]} = head | tail], previous) when op in [:-],
401+
do: remove_operators(tail, head)
402+
403+
defp remove_operators(tail, _previous),
404+
do: tail
405+
397406
defp container_context_struct(cursor, pairs, aliases, shell) do
398407
with {pairs, [^cursor]} <- Enum.split(pairs, -1),
399408
alias = value_from_alias(aliases, shell),

lib/iex/test/iex/autocomplete_test.exs

+6
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,12 @@ defmodule IEx.AutocompleteTest do
461461

462462
assert {:yes, ~c"", entries} = expand(~c"<<foo::integer-")
463463
refute ~c"integer" in entries
464+
assert ~c"little" in entries
465+
assert ~c"size/1" in entries
466+
467+
assert {:yes, ~c"", entries} = expand(~c"<<foo::integer-little-")
468+
refute ~c"integer" in entries
469+
refute ~c"little" in entries
464470
assert ~c"size/1" in entries
465471
end
466472

0 commit comments

Comments
 (0)