Skip to content

Commit 1fca074

Browse files
authored
Fix &//2 parsing issue (#10312)
1 parent 749459a commit 1fca074

File tree

4 files changed

+25
-9
lines changed

4 files changed

+25
-9
lines changed

lib/elixir/src/elixir_tokenizer.erl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -715,11 +715,11 @@ handle_unary_op([$: | Rest], Line, Column, _Kind, Length, Op, Scope, Tokens) whe
715715
tokenize(Rest, Line, Column + Length + 1, Scope, [Token | Tokens]);
716716

717717
handle_unary_op(Rest, Line, Column, Kind, Length, Op, Scope, Tokens) ->
718-
case strip_horizontal_space(Rest, 0) of
719-
{[$/ | _] = Remaining, Extra} ->
718+
case {strip_horizontal_space(Rest, 0), Tokens} of
719+
{{[$/ | _] = Remaining, Extra}, [{capture_op, _, '&'} | _]} ->
720720
Token = {identifier, {Line, Column, nil}, Op},
721721
tokenize(Remaining, Line, Column + Length + Extra, Scope, [Token | Tokens]);
722-
{Remaining, Extra} ->
722+
{{Remaining, Extra}, _} ->
723723
Token = {Kind, {Line, Column, nil}, Op},
724724
tokenize(Remaining, Line, Column + Length + Extra, Scope, [Token | Tokens])
725725
end.

lib/elixir/test/elixir/code_formatter/operators_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,7 @@ defmodule Code.Formatter.OperatorsTest do
896896
assert_same "&and/2"
897897
assert_same "& &&/2"
898898
assert_same "& &/1"
899+
assert_same "&//2"
899900
end
900901

901902
test "Module.remote/arity" do

lib/elixir/test/elixir/kernel/quote_test.exs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,6 @@ defmodule Kernel.QuoteTest do
263263
assert quote(do: &1.foo) == quote(do: &1.foo)
264264
end
265265

266-
test "operators slash arity" do
267-
assert {:/, _, [{:+, _, _}, 2]} = quote(do: + / 2)
268-
assert {:/, _, [{:&&, _, _}, 3]} = quote(do: && / 3)
269-
end
270-
271266
test "pipe precedence" do
272267
assert {:|>, _, [{:|>, _, [{:foo, _, _}, {:bar, _, _}]}, {:baz, _, _}]} =
273268
quote(do: foo |> bar |> baz)

lib/elixir/test/erlang/tokenizer_test.erl

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,27 @@ capture_test() ->
209209
{unary_op, {1, 2, nil}, 'not'},
210210
{int, {1, 6, 1}, "1"},
211211
{',', {1, 7, 0}},
212-
{int, {1, 9, 2}, "2"}] = tokenize("&not 1, 2").
212+
{int, {1, 9, 2}, "2"}] = tokenize("&not 1, 2"),
213+
[{capture_op,{1,1,nil},'&'},
214+
{identifier,{1,3,nil},'&'},
215+
{mult_op,{1,4,nil},'/'},
216+
{int,{1,5,1},"1"}] = tokenize("& &/1"),
217+
[{capture_op, {1, 1, nil}, '&'},
218+
{identifier, {1, 2, nil}, '/'},
219+
{mult_op, {1, 3, nil}, '/'},
220+
{int, {1, 4, 2}, "2"}] = tokenize("&//2"),
221+
[{capture_op, {1, 1, nil}, '&'},
222+
{identifier, {1, 3, nil}, '/'},
223+
{mult_op, {1, 4, nil}, '/'},
224+
{int, {1, 5, 2}, "2"}] = tokenize("& //2"),
225+
[{capture_op, {1, 1, nil}, '&'},
226+
{identifier, {1, 3, nil}, '/'},
227+
{mult_op, {1, 5, nil}, '/'},
228+
{int, {1, 6, 2}, "2"}] = tokenize("& / /2"),
229+
[{capture_op, {1, 1, nil}, '&'},
230+
{identifier, {1, 2, nil}, '/'},
231+
{mult_op, {1, 4, nil}, '/'},
232+
{int, {1, 5, 2}, "2"}] = tokenize("&/ /2").
213233

214234
vc_merge_conflict_test() ->
215235
{1, 1, "found an unexpected version control marker, please resolve the conflicts: ", "<<<<<<< HEAD"} =

0 commit comments

Comments
 (0)