提交 eafff87b 编写于 作者: T Tomáš Matoušek

Merge pull request #2806 from DinoV/master

 Fix issue where stdout and input aren't interleaving correctly
......@@ -136,6 +136,32 @@ TextWriter ErrorOutputWriter
/// </remarks>
Span Write(string text);
/// <summary>
/// Writes string followed by a line break into the error buffer.
/// </summary>
/// <param name="text">Text to write. Might be null.</param>
/// <returns>
/// The offset in the output subject buffer where the text is inserted and the length of the inserted text including the line break.
/// </returns>
/// <remarks>
/// 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.
/// </remarks>
Span WriteErrorLine(string text);
/// <summary>
/// Writes a line into the error buffer.
/// </summary>
/// <param name="text">Text to write. Might be null.</param>
/// <returns>
/// The offset in the output subject buffer where the text is inserted.
/// </returns>
/// <remarks>
/// 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.
/// </remarks>
Span WriteError(string text);
/// <summary>
/// Writes a UI object to the REPL window.
/// </summary>
......
......@@ -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)
......
......@@ -26,6 +26,14 @@ public IInteractiveWindow Window
get { return _window; }
}
public SortedSpans Spans
{
get
{
return _spans;
}
}
public override object InitializeLifetimeService()
{
return null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册