@@ -89,14 +89,25 @@ defmodule IEx.Evaluator do
89
89
90
90
result =
91
91
with { :ok , tokens } <- :elixir . string_to_tokens ( input , line , column , file , opts ) ,
92
- { :ok , adjusted_tokens } <- adjust_operator ( tokens , line , column , file , opts , last_op ) ,
92
+ { :ok , adjusted_tokens , adjusted_op } <-
93
+ adjust_operator ( tokens , line , column , file , opts , last_op ) ,
93
94
{ :ok , forms } <- :elixir . tokens_to_quoted ( adjusted_tokens , file , opts ) do
94
95
last_op =
95
96
case forms do
96
97
{ := , _ , [ _ , _ ] } -> :match
97
98
_ -> :other
98
99
end
99
100
101
+ forms =
102
+ if adjusted_op != nil do
103
+ quote do
104
+ IEx.Evaluator . assert_no_error! ( )
105
+ unquote ( forms )
106
+ end
107
+ else
108
+ forms
109
+ end
110
+
100
111
{ :ok , forms , last_op }
101
112
end
102
113
@@ -129,10 +140,20 @@ defmodule IEx.Evaluator do
129
140
defp adjust_operator ( [ { op_type , _ , _ } | _ ] = tokens , line , column , file , opts , _last_op )
130
141
when op_type in @ op_tokens do
131
142
{ :ok , prefix } = :elixir . string_to_tokens ( ~c" v(-1)" , line , column , file , opts )
132
- { :ok , prefix ++ tokens }
143
+ { :ok , prefix ++ tokens , op_type }
133
144
end
134
145
135
- defp adjust_operator ( tokens , _line , _column , _file , _opts , _last_op ) , do: { :ok , tokens }
146
+ defp adjust_operator ( tokens , _line , _column , _file , _opts , _last_op ) , do: { :ok , tokens , nil }
147
+
148
+ @ doc """
149
+ Raises an error if the last iex result was itself an error
150
+ """
151
+ def assert_no_error! ( ) do
152
+ if Process . get ( :iex_error , false ) do
153
+ message = "skipping evaluation of expression because pipeline has failed"
154
+ reraise RuntimeError . exception ( message ) , [ ]
155
+ end
156
+ end
136
157
137
158
@ doc """
138
159
Gets a value out of the binding, using the provided
@@ -183,6 +204,10 @@ defmodule IEx.Evaluator do
183
204
184
205
defp loop ( % { server: server , ref: ref } = state ) do
185
206
receive do
207
+ { :reader_errored , ^ server } ->
208
+ Process . put ( :iex_error , true )
209
+ loop ( state )
210
+
186
211
{ :eval , ^ server , code , counter } ->
187
212
{ status , state } = safe_eval_and_inspect ( code , counter , state )
188
213
send ( server , { :evaled , self ( ) , status } )
@@ -293,9 +318,12 @@ defmodule IEx.Evaluator do
293
318
defp safe_eval_and_inspect ( forms , counter , state ) do
294
319
put_history ( state )
295
320
put_whereami ( state )
296
- { :ok , eval_and_inspect ( forms , counter , state ) }
321
+ result = eval_and_inspect ( forms , counter , state )
322
+ Process . delete ( :iex_error )
323
+ { :ok , result }
297
324
catch
298
325
kind , error ->
326
+ Process . put ( :iex_error , true )
299
327
print_error ( kind , error , __STACKTRACE__ )
300
328
{ :error , state }
301
329
after
0 commit comments