Skip to content

Commit 17ab8ef

Browse files
committed
apply upstream fix
1 parent 5561dbd commit 17ab8ef

File tree

1 file changed

+30
-23
lines changed

1 file changed

+30
-23
lines changed

lib/elixir_sense/core/compiler/quote.ex

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ defmodule ElixirSense.Core.Compiler.Quote do
55
defstruct line: false,
66
file: nil,
77
context: nil,
8-
op: :none,
8+
op: :escape,
99
aliases_hygiene: nil,
1010
imports_hygiene: nil,
1111
unquote: true,
@@ -74,7 +74,7 @@ defmodule ElixirSense.Core.Compiler.Quote do
7474
generated = validate_runtime(:generated, generated)
7575

7676
q = %__MODULE__{
77-
op: :add_context,
77+
op: :quote,
7878
aliases_hygiene: e,
7979
imports_hygiene: e,
8080
line: v_line,
@@ -128,16 +128,17 @@ defmodule ElixirSense.Core.Compiler.Quote do
128128
defp default(:generated), do: false
129129

130130
def escape(expr, op, unquote, state) do
131-
do_quote(
132-
expr,
133-
%__MODULE__{
134-
line: true,
135-
file: nil,
136-
op: op,
137-
unquote: unquote
138-
},
139-
state
140-
)
131+
q = %__MODULE__{
132+
line: true,
133+
file: nil,
134+
op: op,
135+
unquote: unquote
136+
}
137+
138+
case unquote do
139+
true -> do_quote(expr, q, state)
140+
false -> do_escape(expr, q, state)
141+
end
141142
end
142143

143144
def quote({:unquote_splicing, _, [_]} = expr, %__MODULE__{unquote: true} = q, state) do
@@ -157,7 +158,7 @@ defmodule ElixirSense.Core.Compiler.Quote do
157158

158159
new_meta =
159160
case q do
160-
%__MODULE__{op: :add_context, context: context} ->
161+
%__MODULE__{op: :quote, context: context} ->
161162
keystore(:context, meta, context)
162163

163164
_ ->
@@ -173,7 +174,7 @@ defmodule ElixirSense.Core.Compiler.Quote do
173174

174175
new_meta =
175176
case q do
176-
%__MODULE__{op: :add_context, context: context} ->
177+
%__MODULE__{op: :quote, context: context} ->
177178
keystore(:context, meta, context)
178179

179180
_ ->
@@ -219,7 +220,7 @@ defmodule ElixirSense.Core.Compiler.Quote do
219220

220221
# Vars
221222

222-
defp do_quote({name, meta, nil}, %__MODULE__{op: :add_context} = q, state)
223+
defp do_quote({name, meta, nil}, %__MODULE__{op: :quote} = q, state)
223224
when is_atom(name) and is_list(meta) do
224225
import_meta =
225226
case q.imports_hygiene do
@@ -313,7 +314,7 @@ defmodule ElixirSense.Core.Compiler.Quote do
313314

314315
# Everything else
315316

316-
defp do_quote(other, q = %{op: op}, state) when op != :add_context do
317+
defp do_quote(other, q = %{op: op}, state) when op != :quote do
317318
do_escape(other, q, state)
318319
end
319320

@@ -502,15 +503,21 @@ defmodule ElixirSense.Core.Compiler.Quote do
502503

503504
defp annotate_def(other, _context), do: other
504505

505-
defp do_escape({left, meta, right}, q = %{op: :prune_metadata}, state) when is_list(meta) do
506+
defp do_escape({left, meta, right}, q = %{op: :escape_and_prune}, state) when is_list(meta) do
506507
tm = for {k, v} <- meta, k == :no_parens or k == :line or k == :delimiter, do: {k, v}
507-
{tl, state} = do_quote(left, q, state)
508-
{tr, state} = do_quote(right, q, state)
508+
{tl, state} = do_escape(left, q, state)
509+
{tr, state} = do_escape(right, q, state)
509510
{{:{}, [], [tl, tm, tr]}, state}
510511
end
511512

513+
defp do_escape({left, right}, q, state) do
514+
{tl, state} = do_escape(left, q, state)
515+
{tr, state} = do_escape(right, q, state)
516+
{{tl, tr}, state}
517+
end
518+
512519
defp do_escape(tuple, q, state) when is_tuple(tuple) do
513-
{tt, state} = do_quote(Tuple.to_list(tuple), q, state)
520+
{tt, state} = do_escape(Tuple.to_list(tuple), q, state)
514521
{{:{}, [], tt}, state}
515522
end
516523

@@ -544,15 +551,15 @@ defmodule ElixirSense.Core.Compiler.Quote do
544551
_ -> true
545552
end)
546553
|> Enum.sort
547-
{tt, state} = do_quote(keys, q, state)
554+
{tt, state} = do_escape(keys, q, state)
548555
{{:%{}, [], tt}, state}
549556
end
550557
end
551558

552559
defp do_escape([], _, state), do: {[], state}
553560

554561
defp do_escape([h | t], %__MODULE__{unquote: false} = q, state) do
555-
{ht, state} = do_quote(h, q, state)
562+
{ht, state} = do_escape(h, q, state)
556563
do_quote_simple_list(t, ht, q, state)
557564
end
558565

@@ -565,7 +572,7 @@ defmodule ElixirSense.Core.Compiler.Quote do
565572
_ ->
566573
{l, r} = reverse_improper(t, [h])
567574
{tl, state} = do_quote_splice(l, q, [], [], state)
568-
{tr, state} = do_quote(r, q, state)
575+
{tr, state} = do_escape(r, q, state)
569576
{update_last(tl, fn x -> {:|, [], [x, tr]} end), state}
570577
end
571578
end

0 commit comments

Comments
 (0)