diff --git a/src/InteractiveWindow/Editor/IInteractiveWindow.cs b/src/InteractiveWindow/Editor/IInteractiveWindow.cs
index a6b74e92ee91f29af9c321b1cede0300667e73c4..6d01ad224e5e9cfbd10d6787d2fa4a125a102688 100644
--- a/src/InteractiveWindow/Editor/IInteractiveWindow.cs
+++ b/src/InteractiveWindow/Editor/IInteractiveWindow.cs
@@ -136,6 +136,32 @@ TextWriter ErrorOutputWriter
///
Span Write(string text);
+ ///
+ /// Writes string followed by a line break into the error buffer.
+ ///
+ /// Text to write. Might be null.
+ ///
+ /// The offset in the output subject buffer where the text is inserted and the length of the inserted text including the line break.
+ ///
+ ///
+ /// Note that the text might not be written to the editor buffer immediately but be buffered.
+ /// The returned offsets might thus be beyond the current length of the editor buffer.
+ ///
+ Span WriteErrorLine(string text);
+
+ ///
+ /// Writes a line into the error buffer.
+ ///
+ /// Text to write. Might be null.
+ ///
+ /// The offset in the output subject buffer where the text is inserted.
+ ///
+ ///
+ /// Note that the text might not be written to the editor buffer immediately but be buffered.
+ /// The returned offset might thus be beyond the current length of the editor buffer.
+ ///
+ Span WriteError(string text);
+
///
/// Writes a UI object to the REPL window.
///
diff --git a/src/InteractiveWindow/Editor/InteractiveWindow.cs b/src/InteractiveWindow/Editor/InteractiveWindow.cs
index 52348c5ceae29950a828676288223952c3bb07a8..7b7ec0a723b0beb383c81ddedef0b00ba229b32c 100644
--- a/src/InteractiveWindow/Editor/InteractiveWindow.cs
+++ b/src/InteractiveWindow/Editor/InteractiveWindow.cs
@@ -117,7 +117,7 @@ internal class InteractiveWindow : IInteractiveWindow
private readonly OutputBuffer _buffer;
private readonly TextWriter _outputWriter;
- private readonly TextWriter _errorOutputWriter;
+ private readonly InteractiveWindowWriter _errorOutputWriter;
private int _currentOutputProjectionSpan;
private int _outputTrackingCaretPosition;
@@ -1844,20 +1844,25 @@ private Task Submit()
}
}
- private void FinishCurrentSubmissionInput()
+ private void FinishCurrentSubmissionInput()
{
Debug.Assert(CheckAccess());
AppendLineNoPromptInjection(_currentLanguageBuffer);
ApplyProtection(_currentLanguageBuffer, regions: null);
- if (_adornmentToMinimize)
+ if (_adornmentToMinimize)
{
// TODO (tomat): remember the index of the adornment(s) in the current output and minimize those instead of the last one
InlineAdornmentProvider.MinimizeLastInlineAdornment(TextView);
_adornmentToMinimize = false;
}
+ NewOutputBuffer();
+ }
+
+ private void NewOutputBuffer()
+ {
// Stop growing the current output projection span.
Debug.Assert(_projectionSpans[_currentOutputProjectionSpan].Kind == ReplSpanKind.Output);
var nonGrowingSpan = _projectionSpans[_currentOutputProjectionSpan].WithEndTrackingMode(PointTrackingMode.Negative);
@@ -1950,6 +1955,8 @@ public TextReader ReadStandardInput()
ReplaceProjectionSpan(i, newSpan);
ApplyProtection(_stdInputBuffer, _stdInputProtection, allowAppend: true);
+ NewOutputBuffer();
+
if (wasRunning)
{
_isRunning = true;
@@ -2028,6 +2035,23 @@ public Span WriteLine(string text = null)
return new Span(result, (text != null ? text.Length : 0) + LineBreak.Length);
}
+ public Span WriteError(string text)
+ {
+ int result = _buffer.Write(text);
+ var res = new Span(result, (text != null ? text.Length : 0));
+ _errorOutputWriter.Spans.Add(res);
+ return res;
+ }
+
+ public Span WriteErrorLine(string text = null)
+ {
+ int result = _buffer.Write(text);
+ _buffer.Write(LineBreak);
+ var res = new Span(result, (text != null ? text.Length : 0) + LineBreak.Length);
+ _errorOutputWriter.Spans.Add(res);
+ return res;
+ }
+
public void Write(UIElement element)
{
if (element == null)
diff --git a/src/InteractiveWindow/Editor/Output/OutputWriter.cs b/src/InteractiveWindow/Editor/Output/OutputWriter.cs
index 11de2bf4680ec4b28c7a9ce190d09eb3d067af3b..215d52a91d31ddb9327a431e971013f0d668efa8 100644
--- a/src/InteractiveWindow/Editor/Output/OutputWriter.cs
+++ b/src/InteractiveWindow/Editor/Output/OutputWriter.cs
@@ -26,6 +26,14 @@ public IInteractiveWindow Window
get { return _window; }
}
+ public SortedSpans Spans
+ {
+ get
+ {
+ return _spans;
+ }
+ }
+
public override object InitializeLifetimeService()
{
return null;