@@ -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