Skip to content

Commit b7a99d0

Browse files
committed
Fix long line formatting part 1
1 parent 1e815bd commit b7a99d0

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

apps/language_server/lib/language_server/experimental/code_mod/diff.ex

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,21 @@ defmodule ElixirLS.LanguageServer.Experimental.CodeMod.Diff do
7070

7171
defp apply_diff(:ins, {line, code_unit} = position, change, {current_line, prev_lines}) do
7272
current_line = [edit(change, line, code_unit, line, code_unit) | current_line]
73-
advance(change, position, {current_line, prev_lines})
73+
advance(:ins, change, position, {current_line, prev_lines})
74+
end
75+
76+
defp advance(:ins, <<>>, position, edits) do
77+
{position, edits}
78+
end
79+
80+
for ending <- ["\r\n", "\r", "\n"] do
81+
defp advance(:ins, <<unquote(ending), rest::binary>>, position, edits) do
82+
advance(rest, position, edits)
83+
end
84+
end
85+
86+
defp advance(:ins, <<_c::utf8, rest::binary>>, position, edits) do
87+
advance(rest, position, edits)
7488
end
7589

7690
defp advance(<<>>, position, edits) do

apps/language_server/test/experimental/code_mod/format_test.exs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,76 @@ defmodule ElixirLS.Experimental.FormatTest do
7171
]t == result
7272
end
7373

74+
test "it can handles long lines" do
75+
unformatted = ~q[
76+
defmodule Unformatted do
77+
def foo1(s) do
78+
s = very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonooooong(s) |> IO.inputs()
79+
s
80+
end
81+
82+
def very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonooooong(s) do
83+
s
84+
end
85+
end
86+
]t
87+
88+
formatted = ~q[
89+
defmodule Unformatted do
90+
def foo1(s) do
91+
s =
92+
very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonooooong(s) |> IO.inputs()
93+
94+
s
95+
end
96+
97+
def very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonooooong(s) do
98+
s
99+
end
100+
end
101+
]t
102+
103+
assert {:ok, formatted} == modify(unformatted)
104+
end
105+
106+
test "it can handles the case of long line split into multiple lines" do
107+
unformatted = ~q[
108+
defmodule Unformatted do
109+
def foo(foo1, foo2, foo3, foo4, foo5, foo6, foo7, foo8, foo9, foo10, foo11, foo12, foo13, foo14, foo15, foo16) do
110+
foo = foo14 <> foo15 <> foo16
111+
{foo1, foo2, foo3, foo4, foo5, foo6, foo7, foo8, foo9, foo10, foo11, foo12, foo13, foo}
112+
end
113+
end
114+
]t
115+
formatted = ~q[
116+
defmodule Unformatted do
117+
def foo(
118+
foo1,
119+
foo2,
120+
foo3,
121+
foo4,
122+
foo5,
123+
foo6,
124+
foo7,
125+
foo8,
126+
foo9,
127+
foo10,
128+
foo11,
129+
foo12,
130+
foo13,
131+
foo14,
132+
foo15,
133+
foo16
134+
) do
135+
foo = foo14 <> foo15 <> foo16
136+
{foo1, foo2, foo3, foo4, foo5, foo6, foo7, foo8, foo9, foo10, foo11, foo12, foo13, foo}
137+
end
138+
end
139+
]t
140+
141+
assert {:ok, formatted} == modify(unformatted)
142+
end
143+
74144
test "it handles extra lines" do
75145
assert {:ok, result} = ~q[
76146
defmodule Unformatted do

0 commit comments

Comments
 (0)