Skip to content

Commit ed9c88e

Browse files
committed
Fix Code.Fragment.surround_context for keyword keys
1 parent 357793a commit ed9c88e

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

lib/elixir/lib/code/fragment.ex

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,16 @@ defmodule Code.Fragment do
640640
maybe_operator(reversed_pre, post, line, opts)
641641

642642
{:identifier, reversed_post, rest} ->
643-
{rest, _} = strip_spaces(rest, 0)
643+
{keyword?, rest} =
644+
case rest do
645+
[?: | tail] when tail == [] or hd(tail) != ?: ->
646+
{true, rest}
647+
648+
_ ->
649+
{rest, _} = strip_spaces(rest, 0)
650+
{false, rest}
651+
end
652+
644653
reversed = reversed_post ++ reversed_pre
645654

646655
case codepoint_cursor_context(reversed, opts) do
@@ -656,6 +665,9 @@ defmodule Code.Fragment do
656665
{{:dot, _, [_ | _]} = dot, offset} ->
657666
build_surround(dot, reversed, line, offset)
658667

668+
{{:local_or_var, acc}, offset} when keyword? ->
669+
build_surround({:keyword, acc}, reversed, line, offset)
670+
659671
{{:local_or_var, acc}, offset} when hd(rest) == ?( ->
660672
build_surround({:local_call, acc}, reversed, line, offset)
661673

lib/elixir/test/elixir/code_fragment_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,6 +1110,38 @@ defmodule CodeFragmentTest do
11101110

11111111
assert CF.surround_context(":", {1, 1}) == :none
11121112
end
1113+
1114+
test "keyword keys" do
1115+
for i <- 2..4 do
1116+
assert CF.surround_context("[foo:", {1, i}) == %{
1117+
context: {:keyword, ~c"foo"},
1118+
begin: {1, 2},
1119+
end: {1, 5}
1120+
}
1121+
end
1122+
1123+
for i <- 10..12 do
1124+
assert CF.surround_context("[foo: 1, bar: 2]", {1, i}) == %{
1125+
context: {:keyword, ~c"bar"},
1126+
begin: {1, 10},
1127+
end: {1, 13}
1128+
}
1129+
end
1130+
end
1131+
1132+
test "keyword false positives" do
1133+
assert CF.surround_context("<<foo::", {1, 3}) == %{
1134+
context: {:local_or_var, ~c"foo"},
1135+
begin: {1, 3},
1136+
end: {1, 6}
1137+
}
1138+
1139+
assert CF.surround_context("[foo :atom", {1, 2}) == %{
1140+
context: {:local_or_var, ~c"foo"},
1141+
begin: {1, 2},
1142+
end: {1, 5}
1143+
}
1144+
end
11131145
end
11141146

11151147
describe "container_cursor_to_quoted/2" do

0 commit comments

Comments
 (0)