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;