@@ -55,26 +55,21 @@ defmodule IEx.Evaluator do
55
55
end
56
56
end
57
57
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 "
66
59
67
60
@ op_tokens [ :or_op , :and_op , :comp_op , :rel_op , :arrow_op , :in_op ] ++
68
61
[ :three_op , :concat_op , :mult_op ]
69
62
70
- @ doc false
71
- def parse ( input , opts , parser_state )
63
+ @ doc """
64
+ Default parsing implementation with support for pipes and #iex:break.
72
65
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 )
74
71
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 } )
78
73
79
74
def parse ( @ break_trigger , opts , _parser_state ) do
80
75
:elixir_errors . parse_error (
@@ -87,14 +82,13 @@ defmodule IEx.Evaluator do
87
82
end
88
83
89
84
def parse ( input , opts , { buffer , last_op } ) do
90
- input = buffer <> input
85
+ input = buffer ++ input
91
86
file = Keyword . get ( opts , :file , "nofile" )
92
87
line = Keyword . get ( opts , :line , 1 )
93
88
column = Keyword . get ( opts , :column , 1 )
94
- charlist = String . to_charlist ( input )
95
89
96
90
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 ) ,
98
92
{ :ok , adjusted_tokens } <- adjust_operator ( tokens , line , column , file , opts , last_op ) ,
99
93
{ :ok , forms } <- :elixir . tokens_to_quoted ( adjusted_tokens , file , opts ) do
100
94
last_op =
@@ -108,7 +102,7 @@ defmodule IEx.Evaluator do
108
102
109
103
case result do
110
104
{ :ok , forms , last_op } ->
111
- { :ok , forms , { "" , last_op } }
105
+ { :ok , forms , { [ ] , last_op } }
112
106
113
107
{ :error , { _ , _ , "" } } ->
114
108
{ :incomplete , { input , last_op } }
@@ -119,7 +113,7 @@ defmodule IEx.Evaluator do
119
113
file ,
120
114
error ,
121
115
token ,
122
- { charlist , line , column , 0 }
116
+ { input , line , column , 0 }
123
117
)
124
118
end
125
119
end
@@ -189,9 +183,9 @@ defmodule IEx.Evaluator do
189
183
190
184
defp loop ( % { server: server , ref: ref } = state ) do
191
185
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 } )
195
189
loop ( state )
196
190
197
191
{ :fields_from_env , ^ server , ref , receiver , fields } ->
@@ -296,32 +290,19 @@ defmodule IEx.Evaluator do
296
290
end
297
291
end
298
292
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
312
294
put_history ( state )
313
295
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 }
316
301
after
317
302
Process . delete ( :iex_history )
318
303
Process . delete ( :iex_whereami )
319
304
end
320
305
321
- defp eval_and_inspect_parsed ( { :incomplete , parser_state } , _counter , state ) do
322
- { :incomplete , parser_state , state }
323
- end
324
-
325
306
defp put_history ( % { history: history } ) do
326
307
Process . put ( :iex_history , history )
327
308
end
@@ -410,12 +391,7 @@ defmodule IEx.Evaluator do
410
391
411
392
_ ->
412
393
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 ) ]
419
395
end
420
396
421
397
stackdata = Exception . format_stacktrace ( prune_stacktrace ( stacktrace ) )
0 commit comments