diff --git a/src/InteractiveWindow/Editor/InteractiveWindow.UIThreadOnly.cs b/src/InteractiveWindow/Editor/InteractiveWindow.UIThreadOnly.cs index 34501ac38f6ca4eb9d9e2927ea9f80423afe125f..81ce35f83e2905d45fb1084d429aea94b304212b 100644 --- a/src/InteractiveWindow/Editor/InteractiveWindow.UIThreadOnly.cs +++ b/src/InteractiveWindow/Editor/InteractiveWindow.UIThreadOnly.cs @@ -845,36 +845,30 @@ private async Task SubmitAsync() var snapshotSpan = CurrentLanguageBuffer.CurrentSnapshot.GetExtent(); var trimmedSpan = snapshotSpan.TrimEnd(); - - if (trimmedSpan.Length == 0) - { - // TODO: reuse the current language buffer - PrepareForInput(); - return; - } - else + if (trimmedSpan.Length > 0) { _history.Add(historySpan); - State = State.ExecutingInput; + } - StartCursorTimer(); + State = State.ExecutingInput; - var executionResult = await Evaluator.ExecuteCodeAsync(snapshotSpan.GetText()).ConfigureAwait(true); - Debug.Assert(_window.OnUIThread()); // ConfigureAwait should bring us back to the UI thread. + StartCursorTimer(); - // For reset command typed at prompt -> the state should be WaitingForInput. - // For all other submissions on the prompt -> it should be Executing input. - // If reset button is clicked during a long running submission -> it could be Resetting because - // oldService is disposed first as part of resetting, which leads to await call above returning, and new service is - // created after that as part of completing the resetting process. - Debug.Assert(State == State.ExecutingInput || - State == State.WaitingForInput || - State == State.Resetting, $"Unexpected state {State}"); + var executionResult = await Evaluator.ExecuteCodeAsync(snapshotSpan.GetText()).ConfigureAwait(true); + Debug.Assert(_window.OnUIThread()); // ConfigureAwait should bring us back to the UI thread. - if (State == State.ExecutingInput) - { - FinishExecute(executionResult.IsSuccessful); - } + // For reset command typed at prompt -> the state should be WaitingForInput. + // For all other submissions on the prompt -> it should be Executing input. + // If reset button is clicked during a long running submission -> it could be Resetting because + // oldService is disposed first as part of resetting, which leads to await call above returning, and new service is + // created after that as part of completing the resetting process. + Debug.Assert(State == State.ExecutingInput || + State == State.WaitingForInput || + State == State.Resetting, $"Unexpected state {State}"); + + if (State == State.ExecutingInput) + { + FinishExecute(executionResult.IsSuccessful); } } catch (Exception e) when (_window.ReportAndPropagateException(e)) diff --git a/src/InteractiveWindow/EditorTest/InteractiveWindowHistoryTests.cs b/src/InteractiveWindow/EditorTest/InteractiveWindowHistoryTests.cs index 409dc4897e2dbb8e6ec9d067ea6e7ed560ab94e6..3d635ba7b86a882d0dfa955f1710dde6c806252e 100644 --- a/src/InteractiveWindow/EditorTest/InteractiveWindowHistoryTests.cs +++ b/src/InteractiveWindow/EditorTest/InteractiveWindowHistoryTests.cs @@ -76,6 +76,29 @@ public async Task CheckHistoryPrevious() AssertCurrentSubmission(inputString); } + [WpfFact] + public async Task CheckHistoryPreviousWithAnEmptySubmission() { + //submit, submit, submit, up, up, up + const string inputString1 = "1 "; + const string inputString2 = " "; + const string inputString3 = "3 "; + + await InsertAndExecuteInput(inputString1).ConfigureAwait(true); + await InsertAndExecuteInput(inputString2).ConfigureAwait(true); + await InsertAndExecuteInput(inputString3).ConfigureAwait(true); + + _operations.HistoryPrevious(); + AssertCurrentSubmission(inputString3); + + //second input was empty, so it wasn't added to history + _operations.HistoryPrevious(); + AssertCurrentSubmission(inputString1); + + //has reached the top, no change + _operations.HistoryPrevious(); + AssertCurrentSubmission(inputString1); + } + [WpfFact] public async Task CheckHistoryPreviousNotCircular() { diff --git a/src/InteractiveWindow/EditorTest/InteractiveWindowTests.cs b/src/InteractiveWindow/EditorTest/InteractiveWindowTests.cs index a3967be6aab62d6f2bd7a1be38f15933f1aa2e84..4773177d474c1c15f48ce259de17839ac035fa42 100644 --- a/src/InteractiveWindow/EditorTest/InteractiveWindowTests.cs +++ b/src/InteractiveWindow/EditorTest/InteractiveWindowTests.cs @@ -1089,6 +1089,13 @@ public async Task SubmitAsyncMultiple() await SubmitAsync("1", "2", "1 + 2").ConfigureAwait(true); } + [WorkItem(8569, "https://github.com/dotnet/roslyn/issues/8569")] + [WpfFact] + public async Task SubmitAsyncEmptyLine() + { + await SubmitAsync("1", "", "1 + 2").ConfigureAwait(true); + } + private async Task SubmitAsync(params string[] submissions) { var actualSubmissions = new List();