@@ -55,26 +55,21 @@ defmodule IEx.Evaluator do
5555 end
5656 end
5757
58- # If parsing fails, this might be a TokenMissingError which we treat in
59- # a special way (to allow for continuation of an expression on the next
60- # line in IEx).
61- #
62- # The first two clauses provide support for the break-trigger allowing to
63- # break out from a pending incomplete expression. See
64- # https://github.com/elixir-lang/elixir/issues/1089 for discussion.
65- @ break_trigger "#iex:break\n "
58+ @ break_trigger ~c" #iex:break\n "
6659
6760 @ op_tokens [ :or_op , :and_op , :comp_op , :rel_op , :arrow_op , :in_op ] ++
6861 [ :three_op , :concat_op , :mult_op ]
6962
70- @ doc false
71- def parse ( input , opts , parser_state )
63+ @ doc """
64+ Default parsing implementation with support for pipes and #iex:break.
7265
73- def parse ( input , opts , "" ) , do: parse ( input , opts , { "" , :other } )
66+ If parsing fails, this might be a TokenMissingError which we treat in
67+ a special way (to allow for continuation of an expression on the next
68+ line in IEx).
69+ """
70+ def parse ( input , opts , parser_state )
7471
75- def parse ( @ break_trigger , _opts , { "" , _ } = parser_state ) do
76- { :incomplete , parser_state }
77- end
72+ def parse ( input , opts , [ ] ) , do: parse ( input , opts , { [ ] , :other } )
7873
7974 def parse ( @ break_trigger , opts , _parser_state ) do
8075 :elixir_errors . parse_error (
@@ -87,14 +82,13 @@ defmodule IEx.Evaluator do
8782 end
8883
8984 def parse ( input , opts , { buffer , last_op } ) do
90- input = buffer <> input
85+ input = buffer ++ input
9186 file = Keyword . get ( opts , :file , "nofile" )
9287 line = Keyword . get ( opts , :line , 1 )
9388 column = Keyword . get ( opts , :column , 1 )
94- charlist = String . to_charlist ( input )
9589
9690 result =
97- with { :ok , tokens } <- :elixir . string_to_tokens ( charlist , line , column , file , opts ) ,
91+ with { :ok , tokens } <- :elixir . string_to_tokens ( input , line , column , file , opts ) ,
9892 { :ok , adjusted_tokens } <- adjust_operator ( tokens , line , column , file , opts , last_op ) ,
9993 { :ok , forms } <- :elixir . tokens_to_quoted ( adjusted_tokens , file , opts ) do
10094 last_op =
@@ -108,7 +102,7 @@ defmodule IEx.Evaluator do
108102
109103 case result do
110104 { :ok , forms , last_op } ->
111- { :ok , forms , { "" , last_op } }
105+ { :ok , forms , { [ ] , last_op } }
112106
113107 { :error , { _ , _ , "" } } ->
114108 { :incomplete , { input , last_op } }
@@ -119,7 +113,7 @@ defmodule IEx.Evaluator do
119113 file ,
120114 error ,
121115 token ,
122- { charlist , line , column , 0 }
116+ { input , line , column , 0 }
123117 )
124118 end
125119 end
@@ -189,9 +183,9 @@ defmodule IEx.Evaluator do
189183
190184 defp loop ( % { server: server , ref: ref } = state ) do
191185 receive do
192- { :eval , ^ server , code , counter , parser_state } ->
193- { status , parser_state , state } = parse_eval_inspect ( code , counter , parser_state , state )
194- send ( server , { :evaled , self ( ) , status , parser_state } )
186+ { :eval , ^ server , code , counter } ->
187+ { status , state } = safe_eval_and_inspect ( code , counter , state )
188+ send ( server , { :evaled , self ( ) , status } )
195189 loop ( state )
196190
197191 { :fields_from_env , ^ server , ref , receiver , fields } ->
@@ -296,32 +290,19 @@ defmodule IEx.Evaluator do
296290 end
297291 end
298292
299- defp parse_eval_inspect ( code , counter , parser_state , state ) do
300- try do
301- { parser_module , parser_fun , args } = IEx.Config . parser ( )
302- args = [ code , [ line: counter , file: "iex" ] , parser_state | args ]
303- eval_and_inspect_parsed ( apply ( parser_module , parser_fun , args ) , counter , state )
304- catch
305- kind , error ->
306- print_error ( kind , error , __STACKTRACE__ )
307- { :error , "" , state }
308- end
309- end
310-
311- defp eval_and_inspect_parsed ( { :ok , forms , parser_state } , counter , state ) do
293+ defp safe_eval_and_inspect ( forms , counter , state ) do
312294 put_history ( state )
313295 put_whereami ( state )
314- state = eval_and_inspect ( forms , counter , state )
315- { :ok , parser_state , state }
296+ { :ok , eval_and_inspect ( forms , counter , state ) }
297+ catch
298+ kind , error ->
299+ print_error ( kind , error , __STACKTRACE__ )
300+ { :error , state }
316301 after
317302 Process . delete ( :iex_history )
318303 Process . delete ( :iex_whereami )
319304 end
320305
321- defp eval_and_inspect_parsed ( { :incomplete , parser_state } , _counter , state ) do
322- { :incomplete , parser_state , state }
323- end
324-
325306 defp put_history ( % { history: history } ) do
326307 Process . put ( :iex_history , history )
327308 end
@@ -410,12 +391,7 @@ defmodule IEx.Evaluator do
410391
411392 _ ->
412393 banner = Exception . format_banner ( kind , blamed , stacktrace )
413-
414- if String . contains? ( banner , IO.ANSI . reset ( ) ) do
415- [ banner ]
416- else
417- [ IEx . color ( :eval_error , banner ) ]
418- end
394+ [ IEx . color ( :eval_error , banner ) ]
419395 end
420396
421397 stackdata = Exception . format_stacktrace ( prune_stacktrace ( stacktrace ) )
0 commit comments