From 83999b7047462fda27f31b76c244d841b858ab7c Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 1 Mar 2019 13:37:54 -0600 Subject: [PATCH 01/11] Enable async completion for integration tests --- azure-pipelines-integration.yml | 18 +++++++++++++----- eng/build.ps1 | 9 +++++++++ .../TestUtilities/AsyncCompletionCondition.cs | 17 +++++++++++++++++ .../TestUtilities/LegacyCompletionCondition.cs | 18 ++++++++++++++++++ .../VisualStudioInstanceFactory.cs | 6 ++++-- 5 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 src/VisualStudio/IntegrationTest/TestUtilities/AsyncCompletionCondition.cs create mode 100644 src/VisualStudio/IntegrationTest/TestUtilities/LegacyCompletionCondition.cs diff --git a/azure-pipelines-integration.yml b/azure-pipelines-integration.yml index 44aef9171f111..db59725f0868b 100644 --- a/azure-pipelines-integration.yml +++ b/azure-pipelines-integration.yml @@ -22,16 +22,24 @@ jobs: - job: Windows_VisualStudio_Integration_Tests pool: dotnet-external-vs2019-preview strategy: - maxParallel: 2 + maxParallel: 4 matrix: debug: _configuration: Debug + _useLegacyCompletion: false release: _configuration: Release + _useLegacyCompletion: false + debug_legacy: + _configuration: Debug + _useLegacyCompletion: true + release_legacy: + _configuration: Release + _useLegacyCompletion: true timeoutInMinutes: 135 steps: - - script: eng/cibuild.cmd -configuration $(_configuration) -prepareMachine -testVsi + - script: eng/cibuild.cmd -configuration $(_configuration) -prepareMachine -testVsi -testLegacyCompletion:$$(_useLegacyCompletion) displayName: Build and Test - task: PublishTestResults@1 @@ -40,14 +48,14 @@ jobs: testRunner: XUnit testResultsFiles: $(Build.SourcesDirectory)\artifacts\TestResults\$(_configuration)\*.xml mergeTestResults: true - testRunTitle: 'Windows Visual Studio Integration $(_configuration)' + testRunTitle: 'Windows Visual Studio Integration $(_configuration)_$(_useLegacyCompletion)' condition: always() - task: PublishBuildArtifacts@1 displayName: Publish Logs inputs: PathtoPublish: '$(Build.SourcesDirectory)\artifacts\log\$(_configuration)' - ArtifactName: 'Windows Visual Studio Integration $(_configuration)' + ArtifactName: 'Windows Visual Studio Integration $(_configuration)_$(_useLegacyCompletion)' publishLocation: Container continueOnError: true condition: not(succeeded()) @@ -56,7 +64,7 @@ jobs: displayName: Publish Screenshots inputs: PathtoPublish: '$(Build.SourcesDirectory)\artifacts\bin\Microsoft.VisualStudio.LanguageServices.IntegrationTests\$(_configuration)\net472\xUnitResults' - ArtifactName: 'Screenshots $(_configuration)' + ArtifactName: 'Screenshots $(_configuration)_$(_useLegacyCompletion)' publishLocation: Container continueOnError: true condition: not(succeeded()) diff --git a/eng/build.ps1 b/eng/build.ps1 index 9a346142d130f..bcb012dc6987a 100644 --- a/eng/build.ps1 +++ b/eng/build.ps1 @@ -57,6 +57,7 @@ param ( [switch][Alias('test')]$testDesktop, [switch]$testCoreClr, [switch]$testIOperation, + [switch]$testLegacyCompletion, [parameter(ValueFromRemainingArguments=$true)][string[]]$properties) @@ -87,6 +88,7 @@ function Print-Usage() { Write-Host " -testCoreClr Run CoreClr unit tests" Write-Host " -testVsi Run all integration tests" Write-Host " -testIOperation Run extra checks to validate IOperations" + Write-Host " -testLegacyCompletion Run integration tests with legacy completion" Write-Host "" Write-Host "Advanced settings:" Write-Host " -ci Set when running on CI server" @@ -325,6 +327,10 @@ function TestUsingOptimizedRunner() { $env:ROSLYN_TEST_IOPERATION = "true" } + if ($testLegacyCompletion) { + $env:ROSLYN_TEST_LEGACY_COMPLETION = "true" + } + $testResultsDir = Join-Path $ArtifactsDir "TestResults\$configuration" $binDir = Join-Path $ArtifactsDir "bin" $runTests = GetProjectOutputBinary "RunTests.exe" @@ -397,6 +403,9 @@ function TestUsingOptimizedRunner() { if ($testIOperation) { Remove-Item env:\ROSLYN_TEST_IOPERATION } + if ($testLegacyCompletion) { + Remove-Item env:\ROSLYN_TEST_LEGACY_COMPLETION + } } } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/AsyncCompletionCondition.cs b/src/VisualStudio/IntegrationTest/TestUtilities/AsyncCompletionCondition.cs new file mode 100644 index 0000000000000..eff082f64f3eb --- /dev/null +++ b/src/VisualStudio/IntegrationTest/TestUtilities/AsyncCompletionCondition.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Roslyn.Test.Utilities; + +namespace Microsoft.VisualStudio.IntegrationTest.Utilities +{ + /// + /// Marks a test that should only run when async completion is enabled. + /// + public sealed class AsyncCompletionCondition : ExecutionCondition + { + public static AsyncCompletionCondition Instance { get; } = new AsyncCompletionCondition(); + + public override bool ShouldSkip => !LegacyCompletionCondition.Instance.ShouldSkip; + public override string SkipReason => "The test only runs when async completion is enabled."; + } +} diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/LegacyCompletionCondition.cs b/src/VisualStudio/IntegrationTest/TestUtilities/LegacyCompletionCondition.cs new file mode 100644 index 0000000000000..fc002166256e3 --- /dev/null +++ b/src/VisualStudio/IntegrationTest/TestUtilities/LegacyCompletionCondition.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Roslyn.Test.Utilities; + +namespace Microsoft.VisualStudio.IntegrationTest.Utilities +{ + /// + /// Marks a test that should only run when legacy completion is enabled. + /// + public sealed class LegacyCompletionCondition : ExecutionCondition + { + public static LegacyCompletionCondition Instance { get; } = new LegacyCompletionCondition(); + + public override bool ShouldSkip => string.Equals(Environment.GetEnvironmentVariable("ROSLYN_TEST_LEGACY_COMPLETION"), "true", StringComparison.OrdinalIgnoreCase); + public override string SkipReason => "The test only runs when legacy completion is enabled."; + } +} diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstanceFactory.cs b/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstanceFactory.cs index cc42d3bbc9365..b65292123c467 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstanceFactory.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstanceFactory.cs @@ -324,8 +324,10 @@ private static Process StartNewVisualStudioProcess(string installationPath, int // Disable roaming settings to avoid interference from the online user profile Process.Start(vsRegEditExeFile, $"set \"{installationPath}\" {Settings.Default.VsRootSuffix} HKCU \"ApplicationPrivateSettings\\Microsoft\\VisualStudio\" RoamingEnabled string \"1*System.Boolean*False\"").WaitForExit(); - // Disable async completion for 16.0 Preview 3 testing - Process.Start(vsRegEditExeFile, $"set \"{installationPath}\" {Settings.Default.VsRootSuffix} HKCU \"ApplicationPrivateSettings\\WindowManagement\\Options\" UseAsyncCompletion string \"1*System.Int32*-1\"").WaitForExit(); + // Enable or disable async completion as necessary for integration testing + var usingAsyncCompletion = LegacyCompletionCondition.Instance.ShouldSkip; + var useAsyncCompletionSetting = usingAsyncCompletion ? 1 : -1; + Process.Start(vsRegEditExeFile, $"set \"{installationPath}\" {Settings.Default.VsRootSuffix} HKCU \"ApplicationPrivateSettings\\WindowManagement\\Options\" UseAsyncCompletion string \"1*System.Int32*{useAsyncCompletionSetting}\"").WaitForExit(); // Disable text editor error reporting because it pops up a dialog. We want to either fail fast in our // custom handler or fail silently and continue testing. From 071969d4f853df4132fb2b926d6a7e4496806c6a Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 1 Mar 2019 20:13:41 -0600 Subject: [PATCH 02/11] Fix suggestion mode detection --- .../Completion/AsyncCompletionService.cs | 16 +++++ .../IntegrationTests/AbstractEditorTest.cs | 2 +- .../CSharp/CSharpIntelliSense.cs | 14 ++--- .../CSharp/CSharpInteractive.cs | 2 +- .../CSharp/CSharpInteractiveDirectives.cs | 2 +- .../CSharp/CSharpReplIdeFeatures.cs | 4 +- .../CSharp/CSharpReplIntellisense.cs | 6 +- .../VisualBasic/BasicIntelliSense.cs | 14 ++--- .../TestUtilities/InProcess/Editor_InProc.cs | 59 +++++++++++++++++++ .../InProcess/VisualStudioWorkspace_InProc.cs | 12 ---- .../OutOfProcess/Editor_OutOfProc.cs | 6 ++ .../VisualStudioWorkspace_OutOfProc.cs | 7 --- 12 files changed, 103 insertions(+), 41 deletions(-) diff --git a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/AsyncCompletionService.cs b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/AsyncCompletionService.cs index 095231d5d9bb4..fdd8d3275b8a1 100644 --- a/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/AsyncCompletionService.cs +++ b/src/EditorFeatures/Core/Implementation/IntelliSense/Completion/AsyncCompletionService.cs @@ -162,5 +162,21 @@ private ImmutableHashSet GetAllAutoBraceCompletionChars(IContentType buffe return set; } + + internal TestAccessor GetTestAccessor() + => new TestAccessor(this); + + internal readonly struct TestAccessor + { + private readonly AsyncCompletionService _asyncCompletionService; + + public TestAccessor(AsyncCompletionService asyncCompletionService) + { + _asyncCompletionService = asyncCompletionService; + } + + internal bool UseLegacyCompletion(ITextView textView, ITextBuffer subjectBuffer) + => _asyncCompletionService.UseLegacyCompletion(textView, subjectBuffer); + } } } diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs index cdcaceeeb0e63..f8f2c73211b4c 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractEditorTest.cs @@ -51,7 +51,7 @@ public override async Task InitializeAsync() _projectTemplate != WellKnownProjectTemplates.WpfApplication && _projectTemplate != WellKnownProjectTemplates.CSharpNetCoreClassLibrary) { - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); ClearEditor(); } } diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs index 0127cdc648e45..ca0b695bc63c3 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs @@ -87,7 +87,7 @@ public static class NavigateTo [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] public void CtrlAltSpace() { - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.Editor.SendKeys("nam Goo", VirtualKey.Enter); VisualStudio.Editor.SendKeys('{', VirtualKey.Enter, '}', VirtualKey.Up, VirtualKey.Enter); @@ -108,13 +108,13 @@ public void CtrlAltSpace() [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] public void CtrlAltSpaceOption() { - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.Editor.SendKeys("nam Goo"); VisualStudio.Editor.Verify.CurrentLineText("namespace Goo$$", assertCaretPosition: true); ClearEditor(); - VisualStudio.Workspace.SetUseSuggestionMode(true); + VisualStudio.Editor.SetUseSuggestionMode(true); VisualStudio.Editor.SendKeys("nam Goo"); VisualStudio.Editor.Verify.CurrentLineText("nam Goo$$", assertCaretPosition: true); @@ -193,7 +193,7 @@ void Main(string[] args) } }"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.Editor.SendKeys("Mai("); @@ -211,7 +211,7 @@ void Main(string[] args) $$ }"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.Editor.SendKeys( '{', @@ -244,7 +244,7 @@ void Main(string[] args) } }"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.Editor.SendKeys( 'M', @@ -270,7 +270,7 @@ class Class1 $$ }"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.Editor.SendKeys("int P { g{"); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs index b70466852bc80..db462163ef450 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs @@ -97,7 +97,7 @@ public async Task WpfInteractionAsync() [WpfFact] public void TypingHelpDirectiveWorks() { - VisualStudio.Workspace.SetUseSuggestionMode(true); + VisualStudio.Editor.SetUseSuggestionMode(true); VisualStudio.InteractiveWindow.ShowWindow(waitForPrompt: true); // Directly type #help, rather than sending it through VisualStudio.InteractiveWindow.SubmitText. We want to actually test diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs index 62ca6c62d6e16..c8b52675c7a8c 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs @@ -18,7 +18,7 @@ public CSharpInteractiveDirectives(VisualStudioInstanceFactory instanceFactory) [WpfFact] public void VerifyHostCommandsCompletionList() { - VisualStudio.Workspace.SetUseSuggestionMode(true); + VisualStudio.Editor.SetUseSuggestionMode(true); VisualStudio.InteractiveWindow.InsertCode("#"); VisualStudio.InteractiveWindow.InvokeCompletionList(); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs index c58706e82210a..5cff4a3556cdb 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs @@ -19,12 +19,12 @@ public CSharpReplIdeFeatures(VisualStudioInstanceFactory instanceFactory) public override async Task InitializeAsync() { await base.InitializeAsync().ConfigureAwait(true); - VisualStudio.Workspace.SetUseSuggestionMode(true); + VisualStudio.Editor.SetUseSuggestionMode(true); } public override Task DisposeAsync() { - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.InteractiveWindow.ClearReplText(); VisualStudio.InteractiveWindow.Reset(); return base.DisposeAsync(); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs index 51be6f4bf408b..c384c0516d721 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs @@ -20,7 +20,7 @@ public CSharpReplIntellisense(VisualStudioInstanceFactory instanceFactory) public override async Task InitializeAsync() { await base.InitializeAsync().ConfigureAwait(true); - VisualStudio.Workspace.SetUseSuggestionMode(true); + VisualStudio.Editor.SetUseSuggestionMode(true); } [WpfFact] @@ -71,14 +71,14 @@ public void VerifySharpLoadCompletionList() [WpfFact] public void VerifyNoCrashOnEnter() { - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send("#help", VirtualKey.Enter, VirtualKey.Enter); } [WpfFact] public void VerifyCorrectIntellisenseSelectionOnEnter() { - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send("TimeSpan.FromMin"); VisualStudio.SendKeys.Send(VirtualKey.Enter, "(0d)", VirtualKey.Enter); VisualStudio.InteractiveWindow.WaitForReplOutput("[00:00:00]"); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs index a0269c2737e73..794dddae55abc 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs @@ -29,7 +29,7 @@ Sub Main() End Sub End Module"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send("dim q as lis("); VisualStudio.Editor.Verify.CompletionItemsExist("Of"); @@ -128,7 +128,7 @@ Sub Main() End Sub End Module"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send("dim"); VisualStudio.Editor.Verify.CompletionItemsExist("Dim", "ReDim"); @@ -183,7 +183,7 @@ Sub Main() End Sub End Module"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send("dim q as "); VisualStudio.Editor.Verify.CompletionItemsExist("_AppDomain"); @@ -204,7 +204,7 @@ public void TypeLeftAngleAfterImports() SetUpEditor(@" Imports$$"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send(' '); VisualStudio.Editor.Verify.CompletionItemsExist("Microsoft", "System"); @@ -223,7 +223,7 @@ Module Module1 End Function End Module"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send('M'); VisualStudio.Editor.Verify.CompletionItemsExist("M"); @@ -244,7 +244,7 @@ End Function [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] public void CtrlAltSpaceOption() { - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send("Nam Foo"); VisualStudio.Editor.Verify.CurrentLineText("Namespace Foo$$", assertCaretPosition: true); @@ -270,7 +270,7 @@ End Interface End Class"); - VisualStudio.Workspace.SetUseSuggestionMode(false); + VisualStudio.Editor.SetUseSuggestionMode(false); VisualStudio.SendKeys.Send(" UF"); VisualStudio.Editor.Verify.CompletionItemsExist("UFoo"); diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs index ab24f9aff985d..42842c7c3d902 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs @@ -12,11 +12,18 @@ using System.Windows.Controls; using System.Windows.Forms; using System.Windows.Media; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Editor; using Microsoft.CodeAnalysis.Editor.Implementation.Highlighting; +using Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.Completion; +using Microsoft.CodeAnalysis.Editor.Options; using Microsoft.CodeAnalysis.Editor.Shared.Extensions; +using Microsoft.CodeAnalysis.Options; using Microsoft.VisualStudio.IntegrationTest.Utilities.Common; using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; using Microsoft.VisualStudio.Language.Intellisense; +using Microsoft.VisualStudio.Language.Intellisense.AsyncCompletion; +using Microsoft.VisualStudio.LanguageServices; using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Classification; @@ -72,6 +79,58 @@ private static IWpfTextViewHost GetActiveTextViewHost() return (IWpfTextViewHost)wpfTextViewHost; } + public bool IsUseSuggestionModeOn() + { + var asyncCompletionService = (AsyncCompletionService)GetComponentModelService(); + return ExecuteOnActiveView(textView => + { + var subjectBuffer = GetBufferContainingCaret(textView); + if (asyncCompletionService.GetTestAccessor().UseLegacyCompletion(textView, subjectBuffer)) + { + return GetComponentModelService().Options.GetOption(EditorCompletionOptions.UseSuggestionMode); + } + else + { + var options = textView.Options.GlobalOptions; + EditorOptionKey optionKey; + Option roslynOption; + if (IsDebuggerTextView(textView)) + { + optionKey = new EditorOptionKey(PredefinedCompletionNames.SuggestionModeInDebuggerCompletionOptionName); + roslynOption = EditorCompletionOptions.UseSuggestionMode_Debugger; + } + else + { + optionKey = new EditorOptionKey(PredefinedCompletionNames.SuggestionModeInCompletionOptionName); + roslynOption = EditorCompletionOptions.UseSuggestionMode; + } + + if (!options.IsOptionDefined(optionKey, localScopeOnly: false)) + { + return roslynOption.DefaultValue; + } + + return options.GetOptionValue(optionKey); + } + }); + + bool IsDebuggerTextView(IWpfTextView textView) + => textView.Roles.Contains("DEBUGVIEW"); + } + + public void SetUseSuggestionMode(bool value) + { + if (IsUseSuggestionModeOn() != value) + { + ExecuteCommand(WellKnownCommandNames.Edit_ToggleCompletionMode); + + if (IsUseSuggestionModeOn() != value) + { + throw new InvalidOperationException($"{WellKnownCommandNames.Edit_ToggleCompletionMode} did not leave the editor in the expected state."); + } + } + } + public string GetActiveBufferName() { return GetDTE().ActiveDocument.Name; diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/VisualStudioWorkspace_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/VisualStudioWorkspace_InProc.cs index 0cfdaa0262d21..bbca914b8da44 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/VisualStudioWorkspace_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/VisualStudioWorkspace_InProc.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Runtime.InteropServices; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Editor.Options; using Microsoft.CodeAnalysis.Editor.Shared.Options; using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Options; @@ -45,17 +44,6 @@ private EnvDTE.Project GetProject(string nameOrFileName) string.Compare(p.FileName, nameOrFileName, StringComparison.OrdinalIgnoreCase) == 0 || string.Compare(p.Name, nameOrFileName, StringComparison.OrdinalIgnoreCase) == 0); - public bool IsUseSuggestionModeOn() - => _visualStudioWorkspace.Options.GetOption(EditorCompletionOptions.UseSuggestionMode); - - public void SetUseSuggestionMode(bool value) - { - if (IsUseSuggestionModeOn() != value) - { - ExecuteCommand(WellKnownCommandNames.Edit_ToggleCompletionMode); - } - } - public bool IsPrettyListingOn(string languageName) => _visualStudioWorkspace.Options.GetOption(FeatureOnOffOptions.PrettyListing, languageName); diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs index ba6c55849bca4..7062e998ff81c 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs @@ -224,6 +224,12 @@ public void NavigateToSendKeys(params object[] keys) public ClassifiedToken[] GetLightbulbPreviewClassification(string menuText) => _editorInProc.GetLightbulbPreviewClassifications(menuText); + public bool IsUseSuggestionModeOn() + => _editorInProc.IsUseSuggestionModeOn(); + + public void SetUseSuggestionMode(bool value) + => _editorInProc.SetUseSuggestionMode(value); + public void WaitForActiveView(string viewName) => _editorInProc.WaitForActiveView(viewName); diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs index 01d0284c6129e..10a33e3c778a9 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs @@ -19,13 +19,6 @@ internal VisualStudioWorkspace_OutOfProc(VisualStudioInstance visualStudioInstan _instance = visualStudioInstance; _inProc = CreateInProcComponent(visualStudioInstance); } - - public bool IsUseSuggestionModeOn() - => _inProc.IsUseSuggestionModeOn(); - - public void SetUseSuggestionMode(bool value) - => _inProc.SetUseSuggestionMode(value); - public void SetOptionInfer(string projectName, bool value) { _inProc.SetOptionInfer(projectName, value); From 245fea33865dde467294090fe2faf8c5b4e0a16f Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 1 Mar 2019 20:14:08 -0600 Subject: [PATCH 03/11] Improve suggestion mode integration tests --- .../CSharp/CSharpIntelliSense.cs | 2 +- .../VisualBasic/BasicIntelliSense.cs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs index ca0b695bc63c3..569667858d36a 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs @@ -99,7 +99,7 @@ public void CtrlAltSpace() VisualStudio.Editor.Verify.CurrentLineText("System.Console.WriteLine();$$", assertCaretPosition: true); VisualStudio.Editor.SendKeys(VirtualKey.Home, Shift(VirtualKey.End), VirtualKey.Delete); - VisualStudio.ExecuteCommand(WellKnownCommandNames.Edit_ToggleCompletionMode); + VisualStudio.Editor.SendKeys(new KeyPress(VirtualKey.Space, ShiftState.Ctrl | ShiftState.Alt)); VisualStudio.Editor.SendKeys("System.Console.writeline();"); VisualStudio.Editor.Verify.CurrentLineText("System.Console.writeline();$$", assertCaretPosition: true); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs index 794dddae55abc..16caf23967183 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs @@ -241,6 +241,22 @@ End Function assertCaretPosition: true); } + [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] + public void CtrlAltSpace() + { + VisualStudio.Editor.SetUseSuggestionMode(false); + + VisualStudio.SendKeys.Send("Nam Foo"); + VisualStudio.Editor.Verify.CurrentLineText("Namespace Foo$$", assertCaretPosition: true); + + ClearEditor(); + + VisualStudio.Editor.SendKeys(new KeyPress(VirtualKey.Space, ShiftState.Ctrl | ShiftState.Alt)); + + VisualStudio.SendKeys.Send("Nam Foo"); + VisualStudio.Editor.Verify.CurrentLineText("Nam Foo$$", assertCaretPosition: true); + } + [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] public void CtrlAltSpaceOption() { From f1213f237bda144ed2610b449fc3423c67d5042a Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Sat, 2 Mar 2019 08:18:48 -0600 Subject: [PATCH 04/11] Disable suggestion mode for interactive window tests --- .../IntegrationTests/CSharp/CSharpInteractive.cs | 1 - .../IntegrationTests/CSharp/CSharpInteractiveDirectives.cs | 1 - .../IntegrationTests/CSharp/CSharpReplIdeFeatures.cs | 6 ------ .../IntegrationTests/CSharp/CSharpReplIntellisense.cs | 7 ------- 4 files changed, 15 deletions(-) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs index db462163ef450..95492e997dfe3 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractive.cs @@ -97,7 +97,6 @@ public async Task WpfInteractionAsync() [WpfFact] public void TypingHelpDirectiveWorks() { - VisualStudio.Editor.SetUseSuggestionMode(true); VisualStudio.InteractiveWindow.ShowWindow(waitForPrompt: true); // Directly type #help, rather than sending it through VisualStudio.InteractiveWindow.SubmitText. We want to actually test diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs index c8b52675c7a8c..a1fe7f55ccfa0 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpInteractiveDirectives.cs @@ -18,7 +18,6 @@ public CSharpInteractiveDirectives(VisualStudioInstanceFactory instanceFactory) [WpfFact] public void VerifyHostCommandsCompletionList() { - VisualStudio.Editor.SetUseSuggestionMode(true); VisualStudio.InteractiveWindow.InsertCode("#"); VisualStudio.InteractiveWindow.InvokeCompletionList(); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs index 5cff4a3556cdb..84bf37cdb9d96 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIdeFeatures.cs @@ -16,12 +16,6 @@ public CSharpReplIdeFeatures(VisualStudioInstanceFactory instanceFactory) { } - public override async Task InitializeAsync() - { - await base.InitializeAsync().ConfigureAwait(true); - VisualStudio.Editor.SetUseSuggestionMode(true); - } - public override Task DisposeAsync() { VisualStudio.Editor.SetUseSuggestionMode(false); diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs index c384c0516d721..103fd14f19a8c 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpReplIntellisense.cs @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Threading.Tasks; using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.VisualStudio.IntegrationTest.Utilities; using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; @@ -17,12 +16,6 @@ public CSharpReplIntellisense(VisualStudioInstanceFactory instanceFactory) { } - public override async Task InitializeAsync() - { - await base.InitializeAsync().ConfigureAwait(true); - VisualStudio.Editor.SetUseSuggestionMode(true); - } - [WpfFact] public void VerifyCompletionListOnEmptyTextAtTopLevel() { From cd9f8dfa8785411e5b4031a6f3e0454b400a4061 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 1 Mar 2019 20:14:26 -0600 Subject: [PATCH 05/11] Dismiss completion before closing documents to avoid crashing --- .../IntegrationTests/AbstractIntegrationTest.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs index 2a8c4bbdb5da4..cb8028f3e6db1 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/AbstractIntegrationTest.cs @@ -63,6 +63,13 @@ public virtual async Task InitializeAsync() /// public virtual Task DisposeAsync() { + if (VisualStudio?.Editor.IsCompletionActive() ?? false) + { + // Make sure completion isn't visible. + // 🐛 Only needed as a workaround for https://devdiv.visualstudio.com/DevDiv/_workitems/edit/801435 + VisualStudio.SendKeys.Send(VirtualKey.Escape); + } + _visualStudioContext.Dispose(); return Task.CompletedTask; } From 2f3e9af114e54d7cc4b9ced9954b2da84003af03 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 1 Mar 2019 20:14:51 -0600 Subject: [PATCH 06/11] Make sure the correct completion item is selected See #33824 --- .../CSharp/CSharpIntelliSense.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs index 569667858d36a..8e2fb530a4771 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs @@ -1,5 +1,7 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Linq; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Test.Utilities; using Microsoft.VisualStudio.IntegrationTest.Utilities; @@ -157,6 +159,20 @@ void Main(string[] args) VisualStudio.Editor.SendKeys("().ToArray(); + VisualStudio.Editor.SendKeys(keys); + } + } + VisualStudio.Editor.SendKeys(VirtualKey.Enter); VisualStudio.Editor.Verify.CurrentLineText("///", assertCaretPosition: true); } From f7dcfec42a04b6aed6eaaaf406bd6ac92c66f25f Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 1 Mar 2019 20:15:11 -0600 Subject: [PATCH 07/11] Add an automatic line ender integration test for suggestion mode See #33823 --- .../CSharp/CSharpIntelliSense.cs | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs index 8e2fb530a4771..a44109b90473c 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs @@ -248,7 +248,9 @@ void Main(string[] args) assertCaretPosition: true); } - [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] + // 🐛 This should work with async completion, but currently does not. + [ConditionalWpfFact(typeof(LegacyCompletionCondition)), Trait(Traits.Feature, Traits.Features.Completion)] + [WorkItem(33823, "https://github.com/dotnet/roslyn/issues/33823")] public void CommitOnShiftEnter() { SetUpEditor(@" @@ -277,6 +279,36 @@ void Main(string[] args) assertCaretPosition: true); } + [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] + public void LineBreakOnShiftEnter() + { + SetUpEditor(@" +class Class1 +{ + void Main(string[] args) + { + $$ + } +}"); + + VisualStudio.Editor.SetUseSuggestionMode(true); + + VisualStudio.Editor.SendKeys( + 'M', + Shift(VirtualKey.Enter)); + + VisualStudio.Editor.Verify.TextContains(@" +class Class1 +{ + void Main(string[] args) + { + M +$$ + } +}", +assertCaretPosition: true); + } + [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] public void CommitOnLeftCurly() { From 30c3dc6073a1b034ccee30ffe18a3935ad773dda Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Fri, 1 Mar 2019 22:38:50 -0600 Subject: [PATCH 08/11] Update BasicIntelliSense tests for async completion behavior changes --- .../VisualBasic/BasicIntelliSense.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs index 16caf23967183..bd33e083bff0b 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicIntelliSense.cs @@ -97,6 +97,20 @@ End Sub End Module", assertCaretPosition: true); + if (LegacyCompletionCondition.Instance.ShouldSkip) + { + // Async completion has an extra undo step + VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z)); + + VisualStudio.Editor.Verify.TextContains(@" +Module Module1 + Sub Main() + Dim q As List($$) + End Sub +End Module", +assertCaretPosition: true); + } + VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z)); VisualStudio.Editor.Verify.TextContains(@" From cc9076c6999c48f66426927111200230ed5092bd Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Sat, 2 Mar 2019 08:19:38 -0600 Subject: [PATCH 09/11] Update EnsureTheCaretIsVisibleAfterALongEdit to account for larger monitors See #33822 --- .../CSharp/CSharpIntelliSense.cs | 23 +++++++++++-------- .../InProcess/TextViewWindow_InProc.cs | 18 +++++++++++++++ .../OutOfProcess/TextViewWindow_OutOfProc.cs | 6 +++++ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs index a44109b90473c..90a09b6edfe65 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs @@ -330,26 +330,31 @@ class Class1 assertCaretPosition: true); } - [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] + [ConditionalWpfFact(typeof(LegacyCompletionCondition)), Trait(Traits.Feature, Traits.Features.Completion)] + [WorkItem(33822, "https://github.com/dotnet/roslyn/issues/33822")] public void EnsureTheCaretIsVisibleAfterALongEdit() { - SetUpEditor(@" + var visibleColumns = VisualStudio.Editor.GetVisibleColumnCount(); + var variableName = new string('a', (int)(0.75 * visibleColumns)); + SetUpEditor($@" public class Program -{ +{{ static void Main(string[] args) - { - var aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 0; - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = $$ - } -}"); + {{ + var {variableName} = 0; + {variableName} = $$ + }} +}}"); + Assert.True(variableName.Length > 0); VisualStudio.Editor.SendKeys( VirtualKey.Delete, "aaa", VirtualKey.Tab); var actualText = VisualStudio.Editor.GetText(); - Assert.Contains("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", actualText); + Assert.Contains($"{variableName} = {variableName}", actualText); Assert.True(VisualStudio.Editor.IsCaretOnScreen()); + Assert.True(VisualStudio.Editor.GetCaretColumn() > visibleColumns, "This test is inconclusive if the view didn't need to move to keep the caret on screen."); } [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/TextViewWindow_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/TextViewWindow_InProc.cs index e02cafa0ce137..eb4f472d9a864 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/TextViewWindow_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/TextViewWindow_InProc.cs @@ -132,6 +132,14 @@ public string[] GetCurrentClassifications() } }); + public int GetVisibleColumnCount() + { + return ExecuteOnActiveView(view => + { + return (int)Math.Ceiling(view.ViewportWidth / Math.Max(view.FormattedLineSource.ColumnWidth, 1)); + }); + } + public void PlaceCaret( string marker, int charsOffset, @@ -211,6 +219,16 @@ public int GetCaretPosition() return bufferPosition.Position; }); + public int GetCaretColumn() + { + return ExecuteOnActiveView(view => + { + var startOfLine = view.Caret.ContainingTextViewLine.Start.Position; + var caretVirtualPosition = view.Caret.Position.VirtualBufferPosition; + return caretVirtualPosition.Position - startOfLine + caretVirtualPosition.VirtualSpaces; + }); + } + protected T ExecuteOnActiveView(Func action) => InvokeOnUIThread(() => { diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/TextViewWindow_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/TextViewWindow_OutOfProc.cs index c21b4248fd003..bd07efa45d662 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/TextViewWindow_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/TextViewWindow_OutOfProc.cs @@ -26,12 +26,18 @@ internal TextViewWindow_OutOfProc(VisualStudioInstance visualStudioInstance) public int GetCaretPosition() => _textViewWindowInProc.GetCaretPosition(); + public int GetCaretColumn() + => _textViewWindowInProc.GetCaretColumn(); + public string[] GetCompletionItems() { WaitForCompletionSet(); return _textViewWindowInProc.GetCompletionItems(); } + public int GetVisibleColumnCount() + => _textViewWindowInProc.GetVisibleColumnCount(); + public void PlaceCaret( string marker, int charsOffset = 0, From e2b11da811bf8df3c6669becee1ec5bee0f0759e Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Sat, 2 Mar 2019 13:38:51 -0600 Subject: [PATCH 10/11] Disable broken test CompletionUsesTrackingPointsInTheFaceOfAutomaticBraceCompletion See #33825 --- .../IntegrationTests/CSharp/CSharpIntelliSense.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs index 90a09b6edfe65..a7ab157fe67d3 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpIntelliSense.cs @@ -217,7 +217,9 @@ void Main(string[] args) VisualStudio.Editor.Verify.CurrentParameter("args", ""); } - [WpfFact, Trait(Traits.Feature, Traits.Features.Completion)] + // 🐛 The async completion controller in 16.0 Preview 4 fails to account for brace completion sessions. + [ConditionalWpfFact(typeof(LegacyCompletionCondition)), Trait(Traits.Feature, Traits.Features.Completion)] + [WorkItem(33825, "https://github.com/dotnet/roslyn/issues/33825")] public void CompletionUsesTrackingPointsInTheFaceOfAutomaticBraceCompletion() { SetUpEditor(@" From 90a0227ce617951eb5ab71515805cbdcbadc85d5 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Sat, 2 Mar 2019 13:59:41 -0600 Subject: [PATCH 11/11] Disable broken test DocumentStateTrackingReadonlyInRunMode See #33829 --- .../IntegrationTests/VisualBasic/BasicEditAndContinue.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicEditAndContinue.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicEditAndContinue.cs index 5ada7e64fe3e9..7c3554d62db2c 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicEditAndContinue.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicEditAndContinue.cs @@ -198,7 +198,9 @@ public void MultiProjectDebuggingWhereNotAllModulesAreLoaded() VisualStudio.ErrorList.Verify.NoErrors(); } - [WpfFact] + // 🐛 This test crashes when async completion is enabled + [ConditionalWpfFact(typeof(LegacyCompletionCondition))] + [WorkItem(33829, "https://github.com/dotnet/roslyn/issues/33829")] public void DocumentStateTrackingReadonlyInRunMode() { SetupMultiProjectSolution();