diff --git a/lib/elixir/lib/code/fragment.ex b/lib/elixir/lib/code/fragment.ex index 06714048bb..7e5323c5fa 100644 --- a/lib/elixir/lib/code/fragment.ex +++ b/lib/elixir/lib/code/fragment.ex @@ -302,7 +302,8 @@ defmodule Code.Fragment do {{:local_or_var, acc}, count} -> {{:local_arity, acc}, count} {{:dot, base, acc}, count} -> {{:dot_arity, base, acc}, count} {{:operator, acc}, count} -> {{:operator_arity, acc}, count} - {_, _} -> {:none, 0} + {{:sigil, _}, _} -> {:none, 0} + {_, _} -> {{:operator, ~c"/"}, 1} end end diff --git a/lib/elixir/test/elixir/code_fragment_test.exs b/lib/elixir/test/elixir/code_fragment_test.exs index f4ae21cc99..497ca3ae0b 100644 --- a/lib/elixir/test/elixir/code_fragment_test.exs +++ b/lib/elixir/test/elixir/code_fragment_test.exs @@ -302,6 +302,7 @@ defmodule CodeFragmentTest do end test "operators" do + assert CF.cursor_context("/") == {:operator, ~c"/"} assert CF.cursor_context("+") == {:operator, ~c"+"} assert CF.cursor_context("++") == {:operator, ~c"++"} assert CF.cursor_context("!") == {:operator, ~c"!"} @@ -361,6 +362,15 @@ defmodule CodeFragmentTest do assert CF.cursor_context("~r/") == :none assert CF.cursor_context("~r<") == :none + assert CF.cursor_context("~r''") == :none + assert CF.cursor_context("~r' '") == :none + assert CF.cursor_context("~r'foo'") == :none + + # The slash is used in sigils, arities, and operators, so there is ambiguity + assert CF.cursor_context("~r//") == {:operator, ~c"/"} + assert CF.cursor_context("~r/ /") == {:operator, ~c"/"} + assert CF.cursor_context("~r/foo/") == {:local_arity, ~c"foo"} + assert CF.cursor_context("~R") == {:sigil, ~c"R"} assert CF.cursor_context("~R/") == :none assert CF.cursor_context("~R<") == :none