diff --git a/docs/wiki/Manual-Testing.md b/docs/wiki/Manual-Testing.md index 05ab1927ecd8f..979cf1cf1a964 100644 --- a/docs/wiki/Manual-Testing.md +++ b/docs/wiki/Manual-Testing.md @@ -66,7 +66,7 @@ When doing a test pass, copy this page and consider using these status indicator | **Typing** | :fast_forward: **General Typing**
- Type and paste new constructs
- Nothing interferes with verbatim typing | | | | | | :mag: :fast_forward: **Completion**
- Typing new keyword/construct names
- Dotting off of new constructs
- Matching part of the identifier is highlighted (including word prefix matches) [Visual Studio 2015 Update 1]
- Target type preselection [Visual Studio 2017]
IntelliSense filtering [Visual Studio 2017] | | | | | | :fast_forward: **Formatting**
- Spacing in and around new constructs
- Spacing options
- Format Document command
`Tools > Options` settings should be respected | | | | -| | :fast_forward: **Automatic Brace Completion** (*C# only*)
- Auto-insert close brace
- Shift+Enter commit of IntelliSense and any pending brace completion sessions (Currently C# only: https://github.com/dotnet/roslyn/issues/18065) | | | N/A | +| | :fast_forward: **Automatic Brace Completion** (*C# only*)
- Auto-insert close brace
- Shift+Enter commit of IntelliSense and any pending brace completion sessions | | | N/A | | | :fast_forward: **Indentation**
- Typing `Enter` in an unfinished statement indents the next line | | | | | **Navigating** | :mag: :fast_forward: **Go To Definition**
- F12 from callsites to definition
- Ctrl+click [Visual Studio 2017 version 15.4] | | | | | | :fast_forward: **Go To Implementation**
- Ctrl+F12 to jump from virtual members to their implementations
- Jump from inheritable types to their implementations | | | N/A | diff --git a/src/Features/Core/Portable/Rename/SymbolicRenameInfo.cs b/src/Features/Core/Portable/Rename/SymbolicRenameInfo.cs index ed8c79f41fdf9..88e3b271cdd2b 100644 --- a/src/Features/Core/Portable/Rename/SymbolicRenameInfo.cs +++ b/src/Features/Core/Portable/Rename/SymbolicRenameInfo.cs @@ -70,11 +70,8 @@ private bool CanRenameAttributePrefix(string triggerText) // Ok, the symbol is good. Now, make sure that the trigger text starts with the prefix // of the attribute. If it does, then we can rename just the attribute prefix (otherwise // we need to rename the entire attribute). -#pragma warning disable IDE0059 // Unnecessary assignment of a value - https://github.com/dotnet/roslyn/issues/45895 var nameWithoutAttribute = GetWithoutAttributeSuffix(this.Symbol.Name); - - return triggerText.StartsWith(triggerText); // TODO: Always true? What was it supposed to do? -#pragma warning restore IDE0059 // Unnecessary assignment of a value + return triggerText.StartsWith(nameWithoutAttribute); bool IsRenamingAttributeTypeWithAttributeSuffix() { diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpAutomaticBraceCompletion.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpAutomaticBraceCompletion.cs deleted file mode 100644 index 6491e640331cd..0000000000000 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpAutomaticBraceCompletion.cs +++ /dev/null @@ -1,814 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -#nullable disable - -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Test.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; -using Microsoft.VisualStudio.LanguageServices.Implementation.Log; -using Roslyn.Test.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace Roslyn.VisualStudio.IntegrationTests.CSharp -{ - [Collection(nameof(SharedIntegrationHostFixture))] - public class CSharpAutomaticBraceCompletion : AbstractEditorTest - { - protected override string LanguageName => LanguageNames.CSharp; - - public CSharpAutomaticBraceCompletion(VisualStudioInstanceFactory instanceFactory) - : base(instanceFactory, nameof(CSharpAutomaticBraceCompletion)) - { - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_InsertionAndTabCompleting(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - void Goo() { - $$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("if (true) {"); - VisualStudio.Editor.Verify.CurrentLineText("if (true) { $$}", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("if (true) { }$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_Overtyping(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - void Goo() { - $$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("if (true) {"); - VisualStudio.Editor.Verify.CurrentLineText("if (true) { $$}", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys("}"); - VisualStudio.Editor.Verify.CurrentLineText("if (true) { }$$", assertCaretPosition: true); - } - - /// - /// This is a muscle-memory test for users who rely on the following sequence: - /// - /// Enter - /// { - /// Enter - /// } - /// - /// - [WpfFact, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_Overtyping_Method() - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Editor.SendKeys("public void A()"); - VisualStudio.Editor.SendKeys(VirtualKey.Enter, '{', VirtualKey.Enter, '}'); - - VisualStudio.Editor.Verify.CurrentLineText("}$$", assertCaretPosition: true); - } - - /// - /// This is a muscle-memory test for users who rely on the following sequence: - /// - /// Enter - /// { - /// Enter - /// } - /// - /// - [WpfFact, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_Overtyping_Property() - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Editor.SendKeys("public int X"); - VisualStudio.Editor.SendKeys(VirtualKey.Enter, '{', VirtualKey.Enter, '}'); - - VisualStudio.Editor.Verify.CurrentLineText("}$$", assertCaretPosition: true); - } - - /// - /// This is a muscle-memory test for users who rely on the following sequence: - /// - /// Enter - /// { - /// Enter - /// } - /// - /// - [WpfFact, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_Overtyping_CollectionInitializer() - { - SetUpEditor(@" -using System.Collections.Generic; -class C { - void Method() { - $$ - } -}"); - - VisualStudio.Editor.SendKeys("var x = new List()"); - VisualStudio.Editor.SendKeys(VirtualKey.Enter, '{', VirtualKey.Enter, '}'); - - VisualStudio.Editor.Verify.CurrentLineText("}$$", assertCaretPosition: true); - } - - /// - /// This is a muscle-memory test for users who rely on the following sequence: - /// - /// Enter - /// { - /// Enter - /// } - /// - /// - [WpfFact, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_Overtyping_ObjectInitializer() - { - SetUpEditor(@" -class C { - void Method() { - $$ - } -}"); - - VisualStudio.Editor.SendKeys("var x = new object()"); - VisualStudio.Editor.SendKeys(VirtualKey.Enter, '{', VirtualKey.Enter, '}'); - - VisualStudio.Editor.Verify.CurrentLineText("}$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_OnReturnNoFormattingOnlyIndentationBeforeCloseBrace(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - void Goo() { - $$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys( - "if (true) {", - VirtualKey.Enter, - "var a = 1;"); - - VisualStudio.Editor.Verify.TextContains(@" -class C { - void Goo() { - if (true) - { - var a = 1;$$ - } - } -}", -assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_OnReturnOvertypingTheClosingBrace(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - void Goo() { - $$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys( - "if (true) {", - VirtualKey.Enter, - "var a = 1;", - '}'); - - VisualStudio.Editor.Verify.TextContains(@" -class C { - void Goo() { - if (true) - { - var a = 1; - }$$ - } -}", -assertCaretPosition: true); - } - - [WorkItem(653540, "DevDiv")] - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_OnReturnWithNonWhitespaceSpanInside(bool showCompletionInArgumentLists) - { - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys( - "class A { int i;", - VirtualKey.Enter); - - VisualStudio.Editor.Verify.TextContains(@"class A { int i; -$$}", -assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Paren_InsertionAndTabCompleting(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("void Goo("); - VisualStudio.Editor.Verify.CurrentLineText("void Goo($$)", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys("int x", VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("void Goo(int x)$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Paren_Overtyping(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys( - "void Goo(", - VirtualKey.Escape, - ")"); - - VisualStudio.Editor.Verify.CurrentLineText("void Goo()$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void SquareBracket_Insertion(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("int ["); - VisualStudio.Editor.Verify.CurrentLineText("int[$$]", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void SquareBracket_Overtyping(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("int [", ']'); - VisualStudio.Editor.Verify.CurrentLineText(" int[]$$ ", assertCaretPosition: true, trimWhitespace: false); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void DoubleQuote_InsertionAndTabCompletion(bool showCompletionInArgumentLists) - - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("string str = \"", VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("string str = \"\"$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void DoubleQuote_InsertionAndOvertyping(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("string str = \"Hi Roslyn!", '"'); - VisualStudio.Editor.Verify.CurrentLineText("string str = \"Hi Roslyn!\"$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void DoubleQuote_FixedInterpolatedVerbatimString(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C -{ - void M() - { - $$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("var v = @$\""); - VisualStudio.Editor.Verify.CurrentLineText("var v = $@\"$$\"", assertCaretPosition: true); - - // Backspace removes quotes - VisualStudio.Editor.SendKeys(VirtualKey.Backspace); - VisualStudio.Editor.Verify.CurrentLineText("var v = $@$$", assertCaretPosition: true); - - // Undo puts them back - VisualStudio.Editor.Undo(); - // Incorrect assertion: https://github.com/dotnet/roslyn/issues/33672 - VisualStudio.Editor.Verify.CurrentLineText("var v = $@\"\"$$", assertCaretPosition: true); - - // First, the FixInterpolatedVerbatimString action is undone (@$ reordering) - VisualStudio.Editor.Undo(); - // Incorrect assertion: https://github.com/dotnet/roslyn/issues/33672 - VisualStudio.Editor.Verify.CurrentLineText("var v = @$\"\"$$", assertCaretPosition: true); - - // Then the automatic quote completion is undone - VisualStudio.Editor.Undo(); - VisualStudio.Editor.Verify.CurrentLineText("var v = @$\"$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void AngleBracket_PossibleGenerics_InsertionAndCompletion(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - //field - $$ -}"); - - // Disable new rename UI for now, it's causing these tests to fail. - // https://github.com/dotnet/roslyn/issues/63576 - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_UseNewUI, language: null, false); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("System.Action<", VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("System.Action<>$$", assertCaretPosition: true); - - SetUpEditor(@" -class C { - //method decl - $$ -}"); - - VisualStudio.Editor.SendKeys("void GenericMethod<", VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("void GenericMethod<>$$", assertCaretPosition: true); - - SetUpEditor(@" -class C { - //delegate - $$ -}"); - - VisualStudio.Editor.SendKeys("delegate void Del<"); - VisualStudio.Editor.Verify.CurrentLineText("delegate void Del<$$>", assertCaretPosition: true); - - SetUpEditor(@" -//using directive -$$ -"); - - VisualStudio.Editor.SendKeys("using ActionOfT = System.Action<"); - VisualStudio.Editor.Verify.CurrentLineText("using ActionOfT = System.Action<$$>", assertCaretPosition: true); - - SetUpEditor(@" -//class -$$ -"); - - VisualStudio.Editor.SendKeys("class GenericClass<", '>'); - VisualStudio.Editor.Verify.CurrentLineText("class GenericClass<>$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void SingleQuote_InsertionAndCompletion(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("char c = '"); - VisualStudio.Editor.Verify.CurrentLineText("char c = '$$'", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.Delete, VirtualKey.Backspace); - VisualStudio.Editor.SendKeys("'\u6666", "'"); - - VisualStudio.Editor.Verify.CurrentLineText("char c = '\u6666'$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Nested_AllKinds(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class Bar -{ - T Goo(T t) { return t; } - void M() - { - $$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys( - "var arr=new object[,]{{Goo(0"); - - if (showCompletionInArgumentLists) - { - Assert.False(VisualStudio.Editor.IsCompletionActive()); - } - - VisualStudio.Editor.SendKeys( - VirtualKey.Tab, - VirtualKey.Tab, - ",{Goo(Goo(\"hello", - VirtualKey.Tab, - VirtualKey.Tab, - VirtualKey.Tab, - VirtualKey.Tab, - VirtualKey.Tab, - ';'); - - VisualStudio.Editor.Verify.CurrentLineText("var arr = new object[,] { { Goo(0) }, { Goo(Goo(\"hello\")) } };$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionInSingleLineComments(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - // $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("{([\"'"); - VisualStudio.Editor.Verify.CurrentLineText("// {([\"'$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionInMultiLineComments(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - /* - $$ - */ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("{([\"'"); - VisualStudio.Editor.Verify.CurrentLineText("{([\"'$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionStringVerbatimStringOrCharLiterals(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - $$ -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("string s = \"{([<'"); - VisualStudio.Editor.Verify.CurrentLineText("string s = \"{([<'$$\"", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.End, ';', VirtualKey.Enter); - - VisualStudio.Editor.SendKeys("string y = @\"{([<'"); - VisualStudio.Editor.Verify.CurrentLineText("string y = @\"{([<'$$\"", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.End, ';', VirtualKey.Enter); - - VisualStudio.Editor.SendKeys("char ch = '{([<\""); - VisualStudio.Editor.Verify.CurrentLineText("char ch = '{([<\"$$'", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionInXmlDocComments(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -$$ -class C { }"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys( - "///", - "{([<\"'"); - - VisualStudio.Editor.Verify.CurrentLineText("/// {([<\"'$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionInDisabledPreprocesser(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { -#if false -$$ -#endif -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("void Goo("); - VisualStudio.Editor.Verify.CurrentLineText("void Goo($$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionAfterRegionPreprocesser(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -#region $$ - -#endregion -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("{([<\"'"); - VisualStudio.Editor.Verify.CurrentLineText("#region {([<\"'$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionAfterEndregionPreprocesser(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -#region - -#endregion $$ -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("{([<\"'"); - VisualStudio.Editor.Verify.CurrentLineText("#endregion {([<\"'$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionAfterIfPreprocesser(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -#if $$ -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("{([<\"'"); - VisualStudio.Editor.Verify.CurrentLineText("#if {([<\"'$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Negative_NoCompletionAfterPragmaPreprocesser(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -#pragma $$ -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("{([<\"'"); - VisualStudio.Editor.Verify.CurrentLineText("#pragma {([<\"'$$", assertCaretPosition: true); - } - - [WorkItem(651954, "DevDiv")] - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void InteractionWithOverrideStubGeneration(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class A -{ - public virtual void Goo() { } -} -class B : A -{ - // type ""override Goo("" - $$ -} -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("override "); - Assert.True(VisualStudio.Editor.IsCompletionActive()); - - VisualStudio.Editor.SendKeys("Goo("); - var actualText = VisualStudio.Editor.GetText(); - Assert.Contains(@" -class B : A -{ - // type ""override Goo("" - public override void Goo() - { - base.Goo(); - } -}", actualText); - } - - [WorkItem(531107, "DevDiv")] - [WpfTheory, CombinatorialData] - [Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void InteractionWithCompletionList(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -using System.Collections.Generic; -class C -{ - void M() - { - List li = $$ - } -} -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("new Li"); - Assert.True(VisualStudio.Editor.IsCompletionActive()); - - if (showCompletionInArgumentLists) - { - VisualStudio.Editor.SendKeys("(", ")"); - } - else - { - VisualStudio.Editor.SendKeys("(", VirtualKey.Tab); - } - - VisualStudio.Editor.Verify.CurrentLineText("List li = new List()$$", assertCaretPosition: true); - } - - [WorkItem(823958, "DevDiv")] - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void AutoBraceCompleteDoesNotFormatBracePairInInitializers(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C -{ - void M() - { - var x = $$ - } -} -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("new int[]{"); - VisualStudio.Editor.Verify.CurrentLineText("var x = new int[] {$$}", assertCaretPosition: true); - } - - [WorkItem(823958, "DevDiv")] - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void AutoBraceCompleteDoesNotFormatBracePairInObjectCreationExpression(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C -{ - void M() - { - var x = $$ - } -} -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("new {"); - VisualStudio.Editor.Verify.CurrentLineText("var x = new {$$}", assertCaretPosition: true); - } - - [WorkItem(823958, "DevDiv")] - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void AutoBraceCompleteFormatsBracePairInClassDeclarationAndAutoProperty(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class $$ -"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("C{"); - VisualStudio.Editor.Verify.CurrentLineText("class C { $$}", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys( - VirtualKey.Enter, - "int Prop {"); - VisualStudio.Editor.Verify.TextContains(@" -class C -{ - int Prop { $$} -}", -assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - [Trait(Traits.Feature, Traits.Features.CompleteStatement)] - [WorkItem("https://github.com/dotnet/roslyn/issues/18104")] - public void CompleteStatementTriggersCompletion(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class Program -{ - static void Main(string[] args) - { - Main$$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("(ar"); - VisualStudio.Editor.Verify.CurrentLineText("Main(ar$$)", assertCaretPosition: true); - - if (showCompletionInArgumentLists) - { - Assert.True(VisualStudio.Editor.IsCompletionActive()); - } - - VisualStudio.Editor.SendKeys(";"); - VisualStudio.Editor.Verify.CurrentLineText("Main(args);$$", assertCaretPosition: true); - } - - [WpfTheory, CombinatorialData, Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public void Braces_InsertionOnNewLine(bool showCompletionInArgumentLists) - { - SetUpEditor(@" -class C { - void Goo() { - $$ - } -}"); - - VisualStudio.Workspace.SetTriggerCompletionInArgumentLists(showCompletionInArgumentLists); - - VisualStudio.Editor.SendKeys("if (true)", - VirtualKey.Enter, - "{"); - VisualStudio.Editor.Verify.CurrentLineText("{ $$}", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -class C { - void Goo() { - if (true) - { - - } - } -}"); - - VisualStudio.Editor.SendKeys("}"); - VisualStudio.Editor.Verify.TextContains(@" -class C { - void Goo() { - if (true) - { - }$$ - } -}", assertCaretPosition: true); - } - } -} diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpExtractMethod.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpExtractMethod.cs index 99f3f2dc7b3ae..1859a7484703a 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpExtractMethod.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpExtractMethod.cs @@ -11,6 +11,7 @@ using Microsoft.CodeAnalysis.Text; using Microsoft.VisualStudio.IntegrationTest.Utilities; using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; +using Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess; using Roslyn.Test.Utilities; using Xunit; using Xunit.Abstractions; @@ -76,7 +77,7 @@ public int Method() MarkupTestFile.GetSpans(expectedMarkup, out var expectedText, out ImmutableArray spans); VisualStudio.Editor.Verify.TextContains(expectedText); - AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(VisualStudio.InlineRenameDialog.ValidRenameTag)); + AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(InlineRenameDialog_OutOfProc.ValidRenameTag)); VisualStudio.Editor.SendKeys("SayHello", VirtualKey.Enter); VisualStudio.Editor.Verify.TextContains(@"private static void SayHello() @@ -116,7 +117,7 @@ public int Method() MarkupTestFile.GetSpans(expectedMarkup, out var expectedText, out ImmutableArray spans); Assert.Equal(expectedText, VisualStudio.Editor.GetText()); - AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(VisualStudio.InlineRenameDialog.ValidRenameTag)); + AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(InlineRenameDialog_OutOfProc.ValidRenameTag)); VisualStudio.Editor.SendKeys("SayHello", VirtualKey.Enter); VisualStudio.Editor.Verify.TextContains(@"private static int SayHello(int a, int b) @@ -157,7 +158,7 @@ public int Method() MarkupTestFile.GetSpans(expectedMarkup, out var expectedText, out ImmutableArray spans); Assert.Equal(expectedText, VisualStudio.Editor.GetText()); - AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(VisualStudio.InlineRenameDialog.ValidRenameTag)); + AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(InlineRenameDialog_OutOfProc.ValidRenameTag)); } } } diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpFormatting.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpFormatting.cs deleted file mode 100644 index 42ffb27cc6722..0000000000000 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpFormatting.cs +++ /dev/null @@ -1,367 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -#nullable disable - -using System.Collections.Immutable; -using System.Threading; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Shared.TestHooks; -using Microsoft.CodeAnalysis.Test.Utilities; -using Microsoft.CodeAnalysis.Text; -using Microsoft.VisualStudio.IntegrationTest.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; -using Roslyn.Test.Utilities; -using Xunit; -using Xunit.Abstractions; -using ProjectUtils = Microsoft.VisualStudio.IntegrationTest.Utilities.Common.ProjectUtils; - -namespace Roslyn.VisualStudio.IntegrationTests.CSharp -{ - [Collection(nameof(SharedIntegrationHostFixture))] - public class CSharpFormatting : AbstractEditorTest - { - protected override string LanguageName => LanguageNames.CSharp; - - public CSharpFormatting(VisualStudioInstanceFactory instanceFactory) - : base(instanceFactory, nameof(CSharpFormatting)) - { - } - - [WpfFact(Skip = "https://github.com/dotnet/roslyn/issues/67244")] - [Trait(Traits.Feature, Traits.Features.Formatting)] - public void AlignOpenBraceWithMethodDeclaration() - { - using (var telemetry = VisualStudio.EnableTestTelemetryChannel()) - { - SetUpEditor(@" -$$class C -{ - void Main() - { - } -}"); - - VisualStudio.Editor.FormatDocument(); - VisualStudio.Editor.Verify.TextContains(@" -class C -{ - void Main() - { - } -}"); - telemetry.VerifyFired("vs/ide/vbcs/commandhandler/formatcommand"); - } - } - - [WpfFact, Trait(Traits.Feature, Traits.Features.Formatting)] - public void FormatOnSemicolon() - { - SetUpEditor(@" -public class C -{ - void Goo() - { - var x = from a in new List() - where x % 2 = 0 - select x ;$$ - } -}"); - - VisualStudio.Editor.SendKeys(VirtualKey.Backspace, ";"); - VisualStudio.Editor.Verify.TextContains(@" -public class C -{ - void Goo() - { - var x = from a in new List() - where x % 2 = 0 - select x; - } -}"); - } - - [WpfFact, Trait(Traits.Feature, Traits.Features.Formatting)] - public void FormatSelection() - { - SetUpEditor(@" -public class C { - public void M( ) {$$ - } -}"); - - VisualStudio.Editor.SelectTextInCurrentDocument("public void M( ) {"); - VisualStudio.Editor.FormatSelection(); - VisualStudio.Editor.Verify.TextContains(@" -public class C { - public void M() - { - } -}"); - } - - [WpfFact, Trait(Traits.Feature, Traits.Features.Formatting)] - public void PasteCodeWithLambdaBody() - { - SetUpEditor(@" -using System; -class Program -{ - static void Main() - { - Action a = () => - { - using (null) - { - $$ - } - }; - } -}"); - VisualStudio.Editor.Paste(@" Action b = () => - { - - };"); - - VisualStudio.Editor.Verify.TextContains(@" -using System; -class Program -{ - static void Main() - { - Action a = () => - { - using (null) - { - Action b = () => - { - - }; - } - }; - } -}"); - // Undo should only undo the formatting - VisualStudio.Editor.Undo(); - VisualStudio.Editor.Verify.TextContains(@" -using System; -class Program -{ - static void Main() - { - Action a = () => - { - using (null) - { - Action b = () => - { - - }; - } - }; - } -}"); - } - - [WpfFact, Trait(Traits.Feature, Traits.Features.Formatting)] - public void PasteCodeWithLambdaBody2() - { - SetUpEditor(@" -using System; -class Program -{ - static void Main() - { - Action a = () => - { - using (null) - { - $$ - } - }; - } -}"); - VisualStudio.Editor.Paste(@" Action b = n => - { - Console.Writeline(n); - };"); - - VisualStudio.Editor.Verify.TextContains(@" -using System; -class Program -{ - static void Main() - { - Action a = () => - { - using (null) - { - Action b = n => - { - Console.Writeline(n); - }; - } - }; - } -}"); - } - - [WpfFact, Trait(Traits.Feature, Traits.Features.Formatting)] - public void PasteCodeWithLambdaBody3() - { - SetUpEditor(@" -using System; -class Program -{ - static void Main() - { - Action a = () => - { - using (null) - { - $$ - } - }; - } -}"); - VisualStudio.Editor.Paste(@" D d = delegate(int x) -{ - return 2 * x; -};"); - - VisualStudio.Editor.Verify.TextContains(@" -using System; -class Program -{ - static void Main() - { - Action a = () => - { - using (null) - { - D d = delegate (int x) - { - return 2 * x; - }; - } - }; - } -}"); - } - - [WpfFact, Trait(Traits.Feature, Traits.Features.Formatting)] - public void ShiftEnterWithIntelliSenseAndBraceMatching() - { - SetUpEditor(@" -class Program -{ - object M(object bar) - { - return M$$ - } -}"); - VisualStudio.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Workspace); - VisualStudio.Editor.SendKeys("(ba", new KeyPress(VirtualKey.Enter, ShiftState.Shift), "// comment"); - VisualStudio.Editor.Verify.TextContains(@" -class Program -{ - object M(object bar) - { - return M(bar); - // comment - } -}"); - } - - [WpfFact] - [Trait(Traits.Feature, Traits.Features.EditorConfig)] - [Trait(Traits.Feature, Traits.Features.Formatting)] - [WorkItem("https://github.com/dotnet/roslyn/issues/15003")] - public void ApplyEditorConfigAndFormatDocument() - { - var markup = @" -class C -{ - public int X1 - { - get - { - $$return 3; - } - } -}"; - var expectedTextTwoSpaceIndent = @" -class C -{ - public int X1 - { - get - { - return 3; - } - } -}"; - - VisualStudio.SolutionExplorer.OpenFile(new ProjectUtils.Project(ProjectName), "Class1.cs"); - - MarkupTestFile.GetSpans(markup, out var expectedTextFourSpaceIndent, out ImmutableArray _); - SetUpEditor(markup); - - /* - * The first portion of this test verifies that Format Document uses the default indentation settings when - * no .editorconfig is available. - */ - - VisualStudio.Workspace.WaitForAllAsyncOperations( - Helper.HangMitigatingTimeout, - FeatureAttribute.Workspace, - FeatureAttribute.SolutionCrawlerLegacy, - FeatureAttribute.DiagnosticService, - FeatureAttribute.ErrorSquiggles); - VisualStudio.Editor.FormatDocumentViaCommand(); - - Assert.Equal(expectedTextFourSpaceIndent, VisualStudio.Editor.GetText()); - - /* - * The second portion of this test adds a .editorconfig file to configure the indentation behavior, and - * verifies that the next Format Document operation adheres to the formatting. - */ - - var editorConfig = @"root = true - -[*.cs] -indent_size = 2 -"; - - VisualStudio.SolutionExplorer.AddFile(new ProjectUtils.Project(ProjectName), ".editorconfig", editorConfig, open: false); - - VisualStudio.Workspace.WaitForAllAsyncOperations( - Helper.HangMitigatingTimeout, - FeatureAttribute.Workspace, - FeatureAttribute.SolutionCrawlerLegacy, - FeatureAttribute.DiagnosticService, - FeatureAttribute.ErrorSquiggles); - VisualStudio.Editor.FormatDocumentViaCommand(); - - Assert.Equal(expectedTextTwoSpaceIndent, VisualStudio.Editor.GetText()); - - /* - * The third portion of this test modifies the existing .editorconfig file with a new indentation behavior, - * and verifies that the next Format Document operation adheres to the updated formatting. - */ - - VisualStudio.SolutionExplorer.SetFileContents(new ProjectUtils.Project(ProjectName), ".editorconfig", editorConfig.Replace("2", "4")); - - VisualStudio.Workspace.WaitForAllAsyncOperations( - Helper.HangMitigatingTimeout, - FeatureAttribute.Workspace, - FeatureAttribute.SolutionCrawlerLegacy, - FeatureAttribute.DiagnosticService, - FeatureAttribute.ErrorSquiggles); - VisualStudio.Editor.FormatDocumentViaCommand(); - - Assert.Equal(expectedTextFourSpaceIndent, VisualStudio.Editor.GetText()); - } - } -} diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpRename.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpRename.cs deleted file mode 100644 index 709a6e5d76225..0000000000000 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpRename.cs +++ /dev/null @@ -1,628 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -#nullable disable - -using System.Collections.Immutable; -using System.Threading.Tasks; -using EnvDTE; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Shared.TestHooks; -using Microsoft.CodeAnalysis.Test.Utilities; -using Microsoft.CodeAnalysis.Text; -using Microsoft.VisualStudio.IntegrationTest.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; -using Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess; -using Roslyn.Test.Utilities; -using Xunit; -using Xunit.Abstractions; -using ProjectUtils = Microsoft.VisualStudio.IntegrationTest.Utilities.Common.ProjectUtils; - -namespace Roslyn.VisualStudio.IntegrationTests.CSharp -{ - [Collection(nameof(SharedIntegrationHostFixture))] - [Trait(Traits.Feature, Traits.Features.Rename)] - public class CSharpRename : AbstractEditorTest - { - protected override string LanguageName => LanguageNames.CSharp; - - private InlineRenameDialog_OutOfProc InlineRenameDialog => VisualStudio.InlineRenameDialog; - - public CSharpRename(VisualStudioInstanceFactory instanceFactory) - : base(instanceFactory, nameof(CSharpRename)) - { - } - - public override async Task InitializeAsync() - { - await base.InitializeAsync(); - - // reset relevant global options to default values: - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameInComments, language: null, value: false); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameInStrings, language: null, value: false); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameOverloads, language: null, value: false); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameFile, language: null, value: true); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_PreviewChanges, language: null, value: false); - } - - [WpfFact(Skip = "https://github.com/dotnet/roslyn/issues/67245")] - public void VerifyLocalVariableRename() - { - var markup = @" -using System; -using System.Collections.Generic; -using System.Linq; - -class Program -{ - static void Main(string[] args) - { - int [|x|]$$ = 0; - [|x|] = 5; - TestMethod([|x|]); - } - - static void TestMethod(int y) - { - - } -}"; - using (var telemetry = VisualStudio.EnableTestTelemetryChannel()) - { - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -using System; -using System.Collections.Generic; -using System.Linq; - -class Program -{ - static void Main(string[] args) - { - int y = 0; - y = 5; - TestMethod(y); - } - - static void TestMethod(int y) - { - - } -}"); - telemetry.VerifyFired("vs/ide/vbcs/rename/inlinesession/session", "vs/ide/vbcs/rename/commitcore"); - } - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRename() - { - var markup = @" -using System; - -class [|$$ustom|]Attribute : Attribute -{ -} -"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys("Custom", VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -using System; - -class CustomAttribute : Attribute -{ -}"); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRenameWhileRenameClasss() - { - var markup = @" -using System; - -class [|$$stom|]Attribute : Attribute -{ -} -"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys("Custom"); - VisualStudio.Editor.Verify.TextContains(@" -using System; - -class Custom$$Attribute : Attribute -{ -} -", true); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRenameWhileRenameAttribute() - { - var markup = @" -using System; - -[[|$$stom|]] -class Bar -{ -} - -class stomAttribute : Attribute -{ -} -"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out _, out ImmutableArray _); - _ = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - - VisualStudio.Editor.SendKeys("Custom"); - VisualStudio.Editor.Verify.TextContains(@" -using System; - -[Custom$$] -class Bar -{ -} - -class CustomAttribute : Attribute -{ -} -", true); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRenameWhileRenameAttributeClass() - { - var markup = @" -using System; - -[stom] -class Bar -{ -} - -class [|$$stom|]Attribute : Attribute -{ -} -"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out _, out ImmutableArray _); - _ = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - - VisualStudio.Editor.SendKeys("Custom"); - VisualStudio.Editor.Verify.TextContains(@" -using System; - -[Custom] -class Bar -{ -} - -class Custom$$Attribute : Attribute -{ -} -", true); - } - - [WpfFact] - public void VerifyLocalVariableRenameWithCommentsUpdated() - { - // "variable" is intentionally misspelled as "varixable" and "this" is misspelled as - // "thix" below to ensure we don't change instances of "x" in comments that are part of - // larger words - var markup = @" -using System; -using System.Collections.Generic; -using System.Linq; - -class Program -{ - /// - /// creates a varixable named [|x|] xx - /// - /// - static void Main(string[] args) - { - // thix varixable is named [|x|] xx - int [|x|]$$ = 0; - [|x|] = 5; - TestMethod([|x|]); - } - - static void TestMethod(int y) - { - /* - * [|x|] - * xx - */ - } -}"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - InlineRenameDialog.ToggleIncludeComments(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -using System; -using System.Collections.Generic; -using System.Linq; - -class Program -{ - /// - /// creates a varixable named y xx - /// - /// - static void Main(string[] args) - { - // thix varixable is named y xx - int y = 0; - y = 5; - TestMethod(y); - } - - static void TestMethod(int y) - { - /* - * y - * xx - */ - } -}"); - } - - [WpfFact] - public void VerifyLocalVariableRenameWithStringsUpdated() - { - var markup = @" -class Program -{ - static void Main(string[] args) - { - int [|x|]$$ = 0; - [|x|] = 5; - var s = ""[|x|] xx [|x|]""; - var sLiteral = - @"" - [|x|] - xx - [|x|] - ""; - char c = 'x'; - char cUnit = '\u0078'; - } -}"; - SetUpEditor(markup); - - InlineRenameDialog.Invoke(); - InlineRenameDialog.ToggleIncludeStrings(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -class Program -{ - static void Main(string[] args) - { - int y = 0; - y = 5; - var s = ""y xx y""; - var sLiteral = - @"" - y - xx - y - ""; - char c = 'x'; - char cUnit = '\u0078'; - } -}"); - } - - [WpfFact] - public void VerifyOverloadsUpdated() - { - var markup = @" -interface I -{ - void [|TestMethod|]$$(int y); - void [|TestMethod|](string y); -} - -class B : I -{ - public virtual void [|TestMethod|](int y) - { } - - public virtual void [|TestMethod|](string y) - { } -}"; - SetUpEditor(markup); - - InlineRenameDialog.Invoke(); - InlineRenameDialog.ToggleIncludeOverloads(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -interface I -{ - void y(int y); - void y(string y); -} - -class B : I -{ - public virtual void y(int y) - { } - - public virtual void y(string y) - { } -}"); - } - - [WpfFact] - public void VerifyMultiFileRename() - { - SetUpEditor(@" -class $$Program -{ -}"); - var project = new ProjectUtils.Project(ProjectName); - VisualStudio.SolutionExplorer.AddFile(project, "Class2.cs", @""); - VisualStudio.SolutionExplorer.OpenFile(project, "Class2.cs"); - - const string class2Markup = @" -class SomeOtherClass -{ - void M() - { - [|Program|] p = new [|Program|](); - } -}"; - MarkupTestFile.GetSpans(class2Markup, out var code, out ImmutableArray renameSpans); - - VisualStudio.Editor.SetText(code); - VisualStudio.Editor.PlaceCaret("Program"); - - InlineRenameDialog.Invoke(); - - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -class SomeOtherClass -{ - void M() - { - y p = new y(); - } -}"); - - VisualStudio.SolutionExplorer.OpenFile(project, "Class1.cs"); - VisualStudio.Editor.Verify.TextContains(@" -class y -{ -}"); - } - - [WpfFact] - public void VerifyRenameCancellation() - { - SetUpEditor(@" -class $$Program -{ -}"); - - var project = new ProjectUtils.Project(ProjectName); - VisualStudio.SolutionExplorer.AddFile(project, "Class2.cs", @""); - VisualStudio.SolutionExplorer.OpenFile(project, "Class2.cs"); - VisualStudio.Editor.SetText(@" -class SomeOtherClass -{ - void M() - { - Program p = new Program(); - } -}"); - VisualStudio.Editor.PlaceCaret("Program"); - - InlineRenameDialog.Invoke(); - - VisualStudio.Editor.SendKeys(VirtualKey.Y); - VisualStudio.Editor.Verify.TextContains(@"class SomeOtherClass -{ - void M() - { - y p = new y(); - } -}"); - - VisualStudio.SolutionExplorer.OpenFile(project, "Class1.cs"); - VisualStudio.Editor.Verify.TextContains(@" -class y -{ -}"); - - VisualStudio.Editor.SendKeys(VirtualKey.Escape); - VisualStudio.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Rename); - - VisualStudio.Editor.Verify.TextContains(@" -class Program -{ -}"); - - VisualStudio.SolutionExplorer.OpenFile(project, "Class2.cs"); - VisualStudio.Editor.Verify.TextContains(@" -class SomeOtherClass -{ - void M() - { - Program p = new Program(); - } -}"); - } - - [WpfFact] - public void VerifyCrossProjectRename() - { - SetUpEditor(@" -$$class RenameRocks -{ - static void Main(string[] args) - { - Class2 c = null; - c.ToString(); - } -}"); - var project1 = new ProjectUtils.Project(ProjectName); - var project2 = new ProjectUtils.Project("Project2"); - - VisualStudio.SolutionExplorer.AddProject(project2, WellKnownProjectTemplates.ClassLibrary, LanguageName); - VisualStudio.SolutionExplorer.AddProjectReference(fromProjectName: project1, toProjectName: new ProjectUtils.ProjectReference("Project2")); - - VisualStudio.SolutionExplorer.AddFile(project2, "Class2.cs", @""); - VisualStudio.SolutionExplorer.OpenFile(project2, "Class2.cs"); - - VisualStudio.Editor.SetText(@" -public class Class2 { static void Main(string [] args) { } }"); - - VisualStudio.SolutionExplorer.OpenFile(project1, "Class1.cs"); - VisualStudio.Editor.PlaceCaret("Class2"); - - InlineRenameDialog.Invoke(); - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - - VisualStudio.Editor.Verify.TextContains(@" -class RenameRocks -{ - static void Main(string[] args) - { - y c = null; - c.ToString(); - } -}"); - - VisualStudio.SolutionExplorer.OpenFile(project2, "y.cs"); - VisualStudio.Editor.Verify.TextContains(@" -public class y { static void Main(string [] args) { } }"); - } - - [WpfFact] - public void VerifyRenameUndo() - { - VerifyCrossProjectRename(); - - VisualStudio.Editor.SendKeys(Ctrl(VirtualKey.Z)); - - VisualStudio.Editor.Verify.TextContains(@" -public class Class2 { static void Main(string [] args) { } }"); - - VisualStudio.SolutionExplorer.OpenFile(new ProjectUtils.Project(ProjectName), "Class1.cs"); - VisualStudio.Editor.Verify.TextContains(@" -class RenameRocks -{ - static void Main(string[] args) - { - Class2 c = null; - c.ToString(); - } -}"); - } - - [WpfFact] - public void VerifyRenameInStandaloneFiles() - { - VisualStudio.SolutionExplorer.CloseSolution(); - VisualStudio.SolutionExplorer.AddStandaloneFile("StandaloneFile1.cs"); - VisualStudio.Editor.SetText(@" -class Program -{ - void Goo() - { - var ids = 1; - ids = 2; - } -}"); - VisualStudio.Editor.PlaceCaret("ids"); - - InlineRenameDialog.Invoke(); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - - VisualStudio.Editor.Verify.TextContains(@" -class Program -{ - void Goo() - { - var y = 1; - y = 2; - } -}"); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/39617")] - public void VerifyRenameCaseChange() - { - var project = new ProjectUtils.Project(ProjectName); - VisualStudio.SolutionExplorer.AddFile(project, "Program.cs", -@" -class Program -{ - static void Main(string[] args) - { - } -}"); - - VisualStudio.SolutionExplorer.OpenFile(project, "Program.cs"); - VisualStudio.Editor.PlaceCaret("Program"); - - InlineRenameDialog.Invoke(); - - VisualStudio.Editor.SendKeys(VirtualKey.Home, VirtualKey.Delete, VirtualKey.P, VirtualKey.Enter); - - AssertEx.EqualOrDiff( - @" -class program -{ - static void Main(string[] args) - { - } -}", - VisualStudio.SolutionExplorer.GetFileContents(project, "program.cs")); - } - } -} diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicAutomaticBraceCompletion.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicAutomaticBraceCompletion.cs deleted file mode 100644 index 39f08788ba3ee..0000000000000 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicAutomaticBraceCompletion.cs +++ /dev/null @@ -1,384 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -#nullable disable - -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Shared.TestHooks; -using Microsoft.CodeAnalysis.Test.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; -using Roslyn.Test.Utilities; -using Xunit; - -namespace Roslyn.VisualStudio.IntegrationTests.VisualBasic -{ - [Collection(nameof(SharedIntegrationHostFixture))] - [Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] - public class BasicAutomaticBraceCompletion : AbstractEditorTest - { - protected override string LanguageName => LanguageNames.VisualBasic; - - public BasicAutomaticBraceCompletion(VisualStudioInstanceFactory instanceFactory) - : base(instanceFactory, nameof(BasicAutomaticBraceCompletion)) - { - } - - [WpfTheory, CombinatorialData] - public void Braces_InsertionAndTabCompleting(bool argumentCompletion) - { - VisualStudio.Workspace.SetArgumentCompletionSnippetsOption(argumentCompletion); - - // Disable new rename UI for now, it's causing these tests to fail. - // https://github.com/dotnet/roslyn/issues/63576 - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_UseNewUI, language: null, false); - - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim x = {"); - VisualStudio.Editor.Verify.CurrentLineText("Dim x = {$$}", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys( - "New Object", - VirtualKey.Escape, - VirtualKey.Tab); - - if (argumentCompletion) - { - VisualStudio.Editor.Verify.CurrentLineText("Dim x = {New Object($$)}", assertCaretPosition: true); - VisualStudio.Workspace.WaitForAllAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.SignatureHelp); - - VisualStudio.Editor.SendKeys(VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("Dim x = {New Object()$$}", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("Dim x = {New Object()}$$", assertCaretPosition: true); - } - else - { - VisualStudio.Editor.Verify.CurrentLineText("Dim x = {New Object}$$", assertCaretPosition: true); - } - } - - [WpfFact] - public void Braces_Overtyping() - { - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim x = {"); - VisualStudio.Editor.SendKeys('}'); - VisualStudio.Editor.Verify.CurrentLineText("Dim x = {}$$", assertCaretPosition: true); - } - - [WpfFact] - public void ParenthesesTypeoverAfterStringLiterals() - { - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Console.Write("); - VisualStudio.Editor.Verify.CurrentLineText("Console.Write($$)", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys('"'); - VisualStudio.Editor.Verify.CurrentLineText("Console.Write(\"$$\")", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys('"'); - VisualStudio.Editor.Verify.CurrentLineText("Console.Write(\"\"$$)", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(')'); - VisualStudio.Editor.Verify.CurrentLineText("Console.Write(\"\")$$", assertCaretPosition: true); - } - - [WpfFact] - public void Braces_OnReturnNoFormattingOnlyIndentationBeforeCloseBrace() - { - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim x = {"); - VisualStudio.Editor.SendKeys(VirtualKey.Enter); - VisualStudio.Editor.Verify.CurrentLineText(" $$}", assertCaretPosition: true, trimWhitespace: false); - VisualStudio.Editor.Verify.TextContains(@" -Class C - Sub Goo() - Dim x = { - $$} - End Sub -End Class", -assertCaretPosition: true); - } - - [WpfFact] - public void Paren_InsertionAndTabCompleting() - { - SetUpEditor(@" -Class C - $$ -End Class"); - - VisualStudio.Editor.SendKeys("Sub Goo("); - VisualStudio.Editor.Verify.CurrentLineText("Sub Goo($$)", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys("x As Long"); - VisualStudio.Editor.SendKeys(VirtualKey.Escape); - VisualStudio.Editor.SendKeys(VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("Sub Goo(x As Long)$$", assertCaretPosition: true); - } - - [WpfFact] - public void Paren_Overtyping() - { - SetUpEditor(@" -Class C - $$ -End Class"); - - VisualStudio.Editor.SendKeys("Sub Goo("); - VisualStudio.Editor.Verify.CurrentLineText("Sub Goo($$)", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.Escape); - VisualStudio.Editor.SendKeys(')'); - VisualStudio.Editor.Verify.CurrentLineText("Sub Goo()$$", assertCaretPosition: true); - } - - [WpfFact] - public void Bracket_Insertion() - { - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim [Dim"); - VisualStudio.Editor.Verify.CurrentLineText("Dim [Dim$$]", assertCaretPosition: true); - } - - [WpfFact] - public void Bracket_Overtyping() - { - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim [Dim"); - VisualStudio.Editor.Verify.CurrentLineText("Dim [Dim$$]", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys("] As Long"); - VisualStudio.Editor.Verify.CurrentLineText("Dim [Dim] As Long$$", assertCaretPosition: true); - } - - [WpfFact] - public void DoubleQuote_InsertionAndTabCompletion() - { - // Disable new rename UI for now, it's causing these tests to fail. - // https://github.com/dotnet/roslyn/issues/63576 - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_UseNewUI, language: null, false); - - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim str = \""); - VisualStudio.Editor.Verify.CurrentLineText("Dim str = \"$$\"", assertCaretPosition: true); - - VisualStudio.Editor.SendKeys(VirtualKey.Tab); - VisualStudio.Editor.Verify.CurrentLineText("Dim str = \"\"$$", assertCaretPosition: true); - } - - [WpfFact] - public void Nested_AllKinds_1() - { - SetUpEditor(@" -Class C - Sub New([dim] As String) - End Sub - - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys( - "Dim y = {New C([dim", - VirtualKey.Escape, - "]:=\"hello({[\")}", - VirtualKey.Enter); - var actualText = VisualStudio.Editor.GetText(); - Assert.Contains("Dim y = {New C([dim]:=\"hello({[\")}", actualText); - } - - [WpfFact] - public void Nested_AllKinds_2() - { - SetUpEditor(@" -Class C - Sub New([dim] As String) - End Sub - - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys( - "Dim y = {New C([dim", - VirtualKey.Escape, - VirtualKey.Tab, - ":=\"hello({[", - VirtualKey.Tab, - VirtualKey.Tab, - VirtualKey.Tab, - VirtualKey.Enter); - var actualText = VisualStudio.Editor.GetText(); - Assert.Contains("Dim y = {New C([dim]:=\"hello({[\")}", actualText); - } - - [WpfFact] - public void Negative_NoCompletionInComments() - { - SetUpEditor(@" -Class C - Sub Goo() - ' $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("{([\""); - VisualStudio.Editor.Verify.CurrentLineText("' {([\"$$", assertCaretPosition: true); - } - - [WpfFact] - public void Negative_NoCompletionInStringLiterals() - { - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim s = \"{(["); - VisualStudio.Editor.Verify.CurrentLineText("Dim s = \"{([$$\"", assertCaretPosition: true); - } - - [WpfFact] - public void Negative_NoCompletionInXmlDocComment() - { - SetUpEditor(@" -$$ -Class C -End Class"); - - VisualStudio.Editor.SendKeys("'''"); - VisualStudio.Editor.SendKeys('{'); - VisualStudio.Editor.SendKeys('('); - VisualStudio.Editor.SendKeys('['); - VisualStudio.Editor.SendKeys('"'); - VisualStudio.Editor.Verify.CurrentLineText("''' {([\"$$", assertCaretPosition: true); - } - - [WpfFact] - public void Negative_NoCompletionInXmlDocCommentAtEndOfTag() - { - SetUpEditor(@" -Class C - ''' - ''' $$ - ''' - Sub Goo() - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("("); - VisualStudio.Editor.Verify.CurrentLineText("''' ($$", assertCaretPosition: true); - } - - [WorkItem(652015, "DevDiv")] - [WpfFact] - public void LineCommittingIssue() - { - SetUpEditor(@" -Class C - Sub Goo() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Dim x=\"\" '"); - VisualStudio.Editor.Verify.CurrentLineText("Dim x=\"\" '$$", assertCaretPosition: true); - } - - [WorkItem(653399, "DevDiv")] - [WpfFact] - public void VirtualWhitespaceIssue() - { - SetUpEditor(@" -Class C - Sub Goo()$$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys(VirtualKey.Enter); - VisualStudio.Editor.SendKeys('('); - VisualStudio.Editor.SendKeys(VirtualKey.Backspace); - - VisualStudio.Editor.Verify.CurrentLineText(" $$", assertCaretPosition: true, trimWhitespace: false); - } - - [WorkItem(659684, "DevDiv")] - [WpfFact] - public void CompletionWithIntelliSenseWindowUp() - { - SetUpEditor(@" -Class C - Sub Goo() - End Sub - Sub Test() - $$ - End Sub -End Class"); - - VisualStudio.Editor.SendKeys("Goo("); - VisualStudio.Editor.Verify.CurrentLineText("Goo($$)", assertCaretPosition: true); - } - - [WorkItem(657451, "DevDiv")] - [WpfFact] - public void CompletionAtTheEndOfFile() - { - SetUpEditor(@" -Class C - $$"); - - VisualStudio.Editor.SendKeys("Sub Goo("); - VisualStudio.Editor.Verify.CurrentLineText("Sub Goo($$)", assertCaretPosition: true); - } - } -} diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicExtractMethod.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicExtractMethod.cs index 1cb39192cf1af..b21c59a579e2b 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicExtractMethod.cs +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicExtractMethod.cs @@ -9,6 +9,7 @@ using Microsoft.CodeAnalysis.Text; using Microsoft.VisualStudio.IntegrationTest.Utilities; using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; +using Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess; using Roslyn.Test.Utilities; using Xunit; using Xunit.Abstractions; @@ -80,7 +81,7 @@ End Function MarkupTestFile.GetSpans(expectedMarkup, out var expectedText, out ImmutableArray spans); VisualStudio.Editor.Verify.TextContains(expectedText); - AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(VisualStudio.InlineRenameDialog.ValidRenameTag)); + AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(InlineRenameDialog_OutOfProc.ValidRenameTag)); VisualStudio.Editor.SendKeys("SayHello", VirtualKey.Enter); VisualStudio.Editor.Verify.TextContains(@" Private Sub SayHello() @@ -123,7 +124,7 @@ End Sub MarkupTestFile.GetSpans(expectedMarkup, out var expectedText, out ImmutableArray spans); Assert.Equal(expectedText, VisualStudio.Editor.GetText()); - AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(VisualStudio.InlineRenameDialog.ValidRenameTag)); + AssertEx.SetEqual(spans, VisualStudio.Editor.GetTagSpans(InlineRenameDialog_OutOfProc.ValidRenameTag)); } } } diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicFormatting.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicFormatting.cs deleted file mode 100644 index 4bd7d257d9d9a..0000000000000 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicFormatting.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Text; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Shared.TestHooks; -using Microsoft.CodeAnalysis.Test.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; -using Roslyn.Test.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace Roslyn.VisualStudio.IntegrationTests.VisualBasic -{ - [Collection(nameof(SharedIntegrationHostFixture))] - [Trait(Traits.Feature, Traits.Features.Formatting)] - public class BasicFormatting : AbstractEditorTest - { - protected override string LanguageName => LanguageNames.VisualBasic; - - public BasicFormatting(VisualStudioInstanceFactory instanceFactory) - : base(instanceFactory, nameof(BasicFormatting)) - { - } - - [WpfFact] - public void VerifyFormattingIndent() - { - var testCode = new StringBuilder() - .AppendLine("$$Module A") - .AppendLine(" Sub Main(args As String())") - .AppendLine(" ") - .AppendLine(" End Sub") - .AppendLine("End Module") - .ToString(); - - SetUpEditor(testCode); - - VisualStudio.Editor.FormatDocument(); - VisualStudio.Editor.Verify.TextContains( -@"Module A - Sub Main(args As String()) - - End Sub -End Module"); - } - - [WpfFact] - public void VerifyCaseCorrection() - { - SetUpEditor(@" -$$module A -end module"); - VisualStudio.Editor.FormatDocument(); - VisualStudio.Editor.Verify.TextContains(@" -Module A -End Module"); - } - - [WpfFact(Skip = "https://github.com/dotnet/roslyn/issues/18065")] - public void ShiftEnterWithIntelliSenseAndBraceMatching() - { - SetUpEditor(@" -Module Program - Function Main(ooo As Object) As Object - Return Main$$ - End Function -End Module"); - VisualStudio.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Workspace); - VisualStudio.Editor.SendKeys("(o", new KeyPress(VirtualKey.Enter, ShiftState.Shift), "'comment"); - VisualStudio.Editor.Verify.TextContains(@" -Module Program - Function Main(ooo As Object) As Object - Return Main(ooo) - 'comment - End Function -End Module"); - } - } -} diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicRename.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicRename.cs deleted file mode 100644 index 94f063fbd7944..0000000000000 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicRename.cs +++ /dev/null @@ -1,376 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Collections.Immutable; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Test.Utilities; -using Microsoft.CodeAnalysis.Text; -using Microsoft.VisualStudio.IntegrationTest.Utilities; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; -using Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess; -using Roslyn.Test.Utilities; -using Xunit; - -namespace Roslyn.VisualStudio.IntegrationTests.VisualBasic -{ - [Collection(nameof(SharedIntegrationHostFixture))] - [Trait(Traits.Feature, Traits.Features.Rename)] - public class BasicRename : AbstractEditorTest - { - protected override string LanguageName => LanguageNames.VisualBasic; - - private InlineRenameDialog_OutOfProc InlineRenameDialog => VisualStudio.InlineRenameDialog; - - public BasicRename(VisualStudioInstanceFactory instanceFactory) - : base(instanceFactory, nameof(BasicRename)) - { - } - - public override async Task InitializeAsync() - { - await base.InitializeAsync(); - - // reset relevant global options to default values: - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameInComments, language: null, value: false); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameInStrings, language: null, value: false); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameOverloads, language: null, value: false); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_RenameFile, language: null, value: true); - VisualStudio.Workspace.SetGlobalOption(WellKnownGlobalOption.InlineRenameSessionOptions_PreviewChanges, language: null, value: false); - } - - [WpfFact] - public void VerifyLocalVariableRename() - { - var markup = @" -Imports System -Imports System.Collections.Generic -Imports System.Linq - -Module Program - Sub Main(args As String()) - Dim [|x|]$$ As Integer = 0 - [|x|] = 5 - TestMethod([|x|]) - End Sub - Sub TestMethod(y As Integer) - - End Sub -End Module"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -Imports System -Imports System.Collections.Generic -Imports System.Linq - -Module Program - Sub Main(args As String()) - Dim y As Integer = 0 - y = 5 - TestMethod(y) - End Sub - Sub TestMethod(y As Integer) - - End Sub -End Module"); - } - - [WpfFact] - public void VerifyLocalVariableRenameWithCommentsUpdated() - { - // "variable" is intentionally misspelled as "varixable" and "this" is misspelled as - // "thix" below to ensure we don't change instances of "x" in comments that are part of - // larger words - var markup = @" -Imports System -Imports System.Collections.Generic -Imports System.Linq - -Module Program - ''' - ''' creates a varixable named [|x|] xx - ''' - ''' - Sub Main(args As String()) - ' thix varixable is named [|x|] xx - Dim [|x|]$$ As Integer = 0 - [|x|] = 5 - TestMethod([|x|]) -End Module"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - InlineRenameDialog.ToggleIncludeComments(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -Imports System -Imports System.Collections.Generic -Imports System.Linq - -Module Program - ''' - ''' creates a varixable named y xx - ''' - ''' - Sub Main(args As String()) - ' thix varixable is named y xx - Dim y As Integer = 0 - y = 5 - TestMethod(y) -End Module"); - } - - [WpfFact] - public void VerifyLocalVariableRenameWithStringsUpdated() - { - var markup = @" -Imports System -Imports System.Collections.Generic -Imports System.Linq - -Module Program - Sub Main(args As String()) - Dim [|x|]$$ As Integer = 0 - [|x|] = 5 - Dim s = ""[|x|] xx [|x|]"" - End Sub -End Module"; - SetUpEditor(markup); - - InlineRenameDialog.Invoke(); - InlineRenameDialog.ToggleIncludeStrings(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -Imports System -Imports System.Collections.Generic -Imports System.Linq - -Module Program - Sub Main(args As String()) - Dim y As Integer = 0 - y = 5 - Dim s = ""y xx y"" - End Sub -End Module"); - } - - [WpfFact] - public void VerifyOverloadsUpdated() - { - var markup = @" -Interface I - Sub [|TestMethod|]$$(y As Integer) - Sub [|TestMethod|](y As String) -End Interface - -Public MustInherit Class A - Implements I - Public MustOverride Sub [|TestMethod|](y As Integer) Implements I.[|TestMethod|] - Public MustOverride Sub [|TestMethod|](y As String) Implements I.[|TestMethod|] -End Class"; - SetUpEditor(markup); - - InlineRenameDialog.Invoke(); - InlineRenameDialog.ToggleIncludeOverloads(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys(VirtualKey.Y, VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -Interface I - Sub y(y As Integer) - Sub y(y As String) -End Interface - -Public MustInherit Class A - Implements I - Public MustOverride Sub y(y As Integer) Implements I.y - Public MustOverride Sub y(y As String) Implements I.y -End Class"); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRename() - { - var markup = @" -Import System; - -Public Class [|$$ustom|]Attribute - Inherits Attribute -End Class"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys("Custom", VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -Import System; - -Public Class CustomAttribute - Inherits Attribute -End Class"); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRenameWhileRenameClasss() - { - var markup = @" -Import System; - -Public Class [|$$ustom|]Attribute - Inherits Attribute -End Class"; - - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys("Custom"); - VisualStudio.Editor.Verify.TextContains(@" -Import System; - -Public Class Custom$$Attribute - Inherits Attribute -End Class", true); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRenameWhileRenameAttribute() - { - var markup = @" -Import System; - -<[|$$ustom|]> -Class Bar -End Class - -Public Class ustomAttribute - Inherits Attribute -End Class"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out _, out ImmutableArray _); - _ = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - - VisualStudio.Editor.SendKeys("Custom"); - VisualStudio.Editor.Verify.TextContains(@" -Import System; - - -Class Bar -End Class - -Public Class CustomAttribute - Inherits Attribute -End Class", true); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeRenameWhileRenameAttributeClass() - { - var markup = @" -Import System; - - -Class Bar -End Class - -Public Class [|$$ustom|]Attribute - Inherits Attribute -End Class"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out _, out ImmutableArray _); - _ = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - - VisualStudio.Editor.SendKeys("Custom"); - VisualStudio.Editor.Verify.TextContains(@" -Import System; - - -Class Bar -End Class - -Public Class Custom$$Attribute - Inherits Attribute -End Class", true); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeCapitalizedRename() - { - var markup = @" -Import System; - -Public Class [|$$ustom|]ATTRIBUTE - Inherits Attribute -End Class"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys("Custom", VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -Import System; - -Public Class CustomAttribute - Inherits Attribute -End Class"); - } - - [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] - public void VerifyAttributeNotCapitalizedRename() - { - var markup = @" -Import System; - -Public Class [|$$ustom|]attribute - Inherits Attribute -End Class"; - SetUpEditor(markup); - InlineRenameDialog.Invoke(); - - MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); - var tags = VisualStudio.Editor.GetTagSpans(InlineRenameDialog.ValidRenameTag); - AssertEx.SetEqual(renameSpans, tags); - - VisualStudio.Editor.SendKeys("Custom", VirtualKey.Enter); - VisualStudio.Editor.Verify.TextContains(@" -Import System; - -Public Class CustomAttribute - Inherits Attribute -End Class"); - } - } -} diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpAddMissingUsingsOnPaste.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpAddMissingUsingsOnPaste.cs index b5c807ddc8b24..ec0fea0edcd4e 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpAddMissingUsingsOnPaste.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpAddMissingUsingsOnPaste.cs @@ -53,7 +53,7 @@ static void Main(string[] args) var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); globalOptions.SetGlobalOption(AddImportOnPasteOptionsStorage.AddImportsOnPaste, LanguageNames.CSharp, false); - await PasteAsync(@"Task DoThingAsync() => Task.CompletedTask;", HangMitigatingCancellationToken); + await TestServices.Editor.PasteAsync(@"Task DoThingAsync() => Task.CompletedTask;", HangMitigatingCancellationToken); AssertEx.EqualOrDiff(@" using System; @@ -101,7 +101,7 @@ static void Main(string[] args) var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); globalOptions.SetGlobalOption(AddImportOnPasteOptionsStorage.AddImportsOnPaste, LanguageNames.CSharp, true); - await PasteAsync(@"Task DoThingAsync() => Task.CompletedTask;", HangMitigatingCancellationToken); + await TestServices.Editor.PasteAsync(@"Task DoThingAsync() => Task.CompletedTask;", HangMitigatingCancellationToken); AssertEx.EqualOrDiff( @" @@ -148,7 +148,7 @@ static void Main(string[] args) var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); globalOptions.SetGlobalOption(AddImportOnPasteOptionsStorage.AddImportsOnPaste, LanguageNames.CSharp, true); - await PasteAsync(@"Task DoThingAsync() => Task.CompletedTask;", HangMitigatingCancellationToken); + await TestServices.Editor.PasteAsync(@"Task DoThingAsync() => Task.CompletedTask;", HangMitigatingCancellationToken); AssertEx.EqualOrDiff(@" namespace MyNs @@ -166,17 +166,5 @@ static void Main(string[] args) } }", await TestServices.Editor.GetTextAsync(HangMitigatingCancellationToken)); } - - private async Task PasteAsync(string text, CancellationToken cancellationToken) - { - var provider = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); - var waiter = (IAsynchronousOperationWaiter)provider.GetListener(FeatureAttribute.AddImportsOnPaste); - - await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.Workspace, FeatureAttribute.SolutionCrawlerLegacy }, cancellationToken); - Clipboard.SetText(text); - await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd97CmdID.Paste, cancellationToken); - - await waiter.ExpeditedWaitAsync(); - } } } diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpAutomaticBraceCompletion.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpAutomaticBraceCompletion.cs new file mode 100644 index 0000000000000..706227deb25bd --- /dev/null +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpAutomaticBraceCompletion.cs @@ -0,0 +1,852 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Editor.InlineRename; +using Microsoft.CodeAnalysis.Options; +using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.VisualStudio; +using Roslyn.Test.Utilities; +using Roslyn.VisualStudio.IntegrationTests; +using Roslyn.VisualStudio.IntegrationTests.InProcess; +using WindowsInput.Native; +using Xunit; + +namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp +{ + [Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] + public class CSharpAutomaticBraceCompletion : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.CSharp; + + public CSharpAutomaticBraceCompletion() + : base(nameof(CSharpAutomaticBraceCompletion)) + { + } + + [IdeTheory, CombinatorialData] + public async Task Braces_InsertionAndTabCompleting(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + void Goo() { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("if (true) {", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" if (true) { $$}", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" if (true) { }$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Braces_Overtyping(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + void Goo() { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("if (true) {", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" if (true) { $$}", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("}", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" if (true) { }$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + /// + /// This is a muscle-memory test for users who rely on the following sequence: + /// + /// Enter + /// { + /// Enter + /// } + /// + /// + [IdeFact] + public async Task Braces_Overtyping_Method() + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("public void A()", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.RETURN, '{', VirtualKeyCode.RETURN, '}' }, HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" }$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + /// + /// This is a muscle-memory test for users who rely on the following sequence: + /// + /// Enter + /// { + /// Enter + /// } + /// + /// + [IdeFact] + public async Task Braces_Overtyping_Property() + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("public int X", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.RETURN, '{', VirtualKeyCode.RETURN, '}' }, HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" }$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + /// + /// This is a muscle-memory test for users who rely on the following sequence: + /// + /// Enter + /// { + /// Enter + /// } + /// + /// + [IdeFact] + public async Task Braces_Overtyping_CollectionInitializer() + { + await SetUpEditorAsync(@" +using System.Collections.Generic; +class C { + void Method() { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("var x = new List()", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.RETURN, '{', VirtualKeyCode.RETURN, '}' }, HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" }$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + /// + /// This is a muscle-memory test for users who rely on the following sequence: + /// + /// Enter + /// { + /// Enter + /// } + /// + /// + [IdeFact] + public async Task Braces_Overtyping_ObjectInitializer() + { + await SetUpEditorAsync(@" +class C { + void Method() { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("var x = new object()", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.RETURN, '{', VirtualKeyCode.RETURN, '}' }, HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" }$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Braces_OnReturnNoFormattingOnlyIndentationBeforeCloseBrace(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + void Goo() { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "if (true) {", + VirtualKeyCode.RETURN, + "var a = 1;", + }, + HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.TextContainsAsync(@" +class C { + void Goo() { + if (true) + { + var a = 1;$$ + } + } +}", +assertCaretPosition: true, +HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Braces_OnReturnOvertypingTheClosingBrace(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + void Goo() { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "if (true) {", + VirtualKeyCode.RETURN, + "var a = 1;", + '}', + }, + HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.TextContainsAsync(@" +class C { + void Goo() { + if (true) + { + var a = 1; + }$$ + } +}", +assertCaretPosition: true, +HangMitigatingCancellationToken); + } + + [WorkItem(653540, "DevDiv")] + [IdeTheory, CombinatorialData] + public async Task Braces_OnReturnWithNonWhitespaceSpanInside(bool showCompletionInArgumentLists) + { + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "class A { int i;", + VirtualKeyCode.RETURN, + }, + HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.TextContainsAsync(@"class A { int i; +$$}", +assertCaretPosition: true, +HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Paren_InsertionAndTabCompleting(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("void Goo(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" void Goo($$)", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "int x", VirtualKeyCode.TAB }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" void Goo(int x)$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Paren_Overtyping(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "void Goo(", + VirtualKeyCode.ESCAPE, + ")", + }, + HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" void Goo()$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task SquareBracket_Insertion(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("int [", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" int[$$] ", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task SquareBracket_Overtyping(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "int [", ']' }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" int[]$$ ", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task DoubleQuote_InsertionAndTabCompletion(bool showCompletionInArgumentLists) + + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "string str = \"", VirtualKeyCode.TAB }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" string str = \"\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task DoubleQuote_InsertionAndOvertyping(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "string str = \"Hi Roslyn!", '"' }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" string str = \"Hi Roslyn!\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task DoubleQuote_FixedInterpolatedVerbatimString(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C +{ + void M() + { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("var v = @$\"", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" var v = $@\"$$\"", assertCaretPosition: true, HangMitigatingCancellationToken); + + // Backspace removes quotes + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.BACK, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" var v = $@$$", assertCaretPosition: true, HangMitigatingCancellationToken); + + // Undo puts them back + await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd97CmdID.Undo, HangMitigatingCancellationToken); + // Incorrect assertion: https://github.com/dotnet/roslyn/issues/33672 + await TestServices.EditorVerifier.CurrentLineTextAsync(" var v = $@\"\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + + // First, the FixInterpolatedVerbatimString action is undone (@$ reordering) + await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd97CmdID.Undo, HangMitigatingCancellationToken); + // Incorrect assertion: https://github.com/dotnet/roslyn/issues/33672 + await TestServices.EditorVerifier.CurrentLineTextAsync(" var v = @$\"\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + + // Then the automatic quote completion is undone + await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd97CmdID.Undo, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" var v = @$\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task AngleBracket_PossibleGenerics_InsertionAndCompletion(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + //field + $$ +}", HangMitigatingCancellationToken); + + // Disable new rename UI for now, it's causing these tests to fail. + // https://github.com/dotnet/roslyn/issues/63576 + var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); + globalOptions.SetGlobalOption(InlineRenameUIOptionsStorage.UseInlineAdornment, false); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "System.Action<", VirtualKeyCode.TAB }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" System.Action<>$$", assertCaretPosition: true, HangMitigatingCancellationToken); + + await SetUpEditorAsync(@" +class C { + //method decl + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "void GenericMethod<", VirtualKeyCode.TAB }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" void GenericMethod<>$$", assertCaretPosition: true, HangMitigatingCancellationToken); + + await SetUpEditorAsync(@" +class C { + //delegate + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("delegate void Del<", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" delegate void Del<$$>", assertCaretPosition: true, HangMitigatingCancellationToken); + + await SetUpEditorAsync(@" +//using directive +$$ +", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("using ActionOfT = System.Action<", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("using ActionOfT = System.Action<$$>", assertCaretPosition: true, HangMitigatingCancellationToken); + + await SetUpEditorAsync(@" +//class +$$ +", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "class GenericClass<", '>' }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("class GenericClass<>$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task SingleQuote_InsertionAndCompletion(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("char c = '", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" char c = '$$'", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.DELETE, VirtualKeyCode.BACK }, HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "'\u6666", "'" }, HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" char c = '\u6666'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Nested_AllKinds(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class Bar +{ + T Goo(T t) { return t; } + void M() + { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + "var arr=new object[,]{{Goo(0", HangMitigatingCancellationToken); + + if (showCompletionInArgumentLists) + { + Assert.False(await TestServices.Editor.IsCompletionActiveAsync(HangMitigatingCancellationToken)); + } + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + VirtualKeyCode.TAB, + VirtualKeyCode.TAB, + ",{Goo(Goo(\"hello", + VirtualKeyCode.TAB, + VirtualKeyCode.TAB, + VirtualKeyCode.TAB, + VirtualKeyCode.TAB, + VirtualKeyCode.TAB, + ';', + }, + HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" var arr = new object[,] { { Goo(0) }, { Goo(Goo(\"hello\")) } };$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionInSingleLineComments(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + // $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("{([\"'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" // {([\"'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionInMultiLineComments(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + /* + $$ + */ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("{([\"'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" {([\"'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionStringVerbatimStringOrCharLiterals(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + $$ +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("string s = \"{([<'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" string s = \"{([<'$$\"", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.END, ';', VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("string y = @\"{([<'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" string y = @\"{([<'$$\"", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.END, ';', VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("char ch = '{([<\"", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" char ch = '{([<\"$$'", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionInXmlDocComments(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +$$ +class C { }", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "///", + "{([<\"'", + }, + HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync("/// {([<\"'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionInDisabledPreprocesser(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { +#if false +$$ +#endif +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("void Goo(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("void Goo($$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionAfterRegionPreprocesser(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +#region $$ + +#endregion +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("{([<\"'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("#region {([<\"'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionAfterEndregionPreprocesser(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +#region + +#endregion $$ +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("{([<\"'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("#endregion {([<\"'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionAfterIfPreprocesser(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +#if $$ +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("{([<\"'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("#if {([<\"'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Negative_NoCompletionAfterPragmaPreprocesser(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +#pragma $$ +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("{([<\"'", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("#pragma {([<\"'$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(651954, "DevDiv")] + [IdeTheory, CombinatorialData] + public async Task InteractionWithOverrideStubGeneration(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class A +{ + public virtual void Goo() { } +} +class B : A +{ + // type ""override Goo("" + $$ +} +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("override ", HangMitigatingCancellationToken); + Assert.True(await TestServices.Editor.IsCompletionActiveAsync(HangMitigatingCancellationToken)); + + await TestServices.Input.SendWithoutActivateAsync("Goo(", HangMitigatingCancellationToken); + var actualText = await TestServices.Editor.GetTextAsync(HangMitigatingCancellationToken); + Assert.Contains(@" +class B : A +{ + // type ""override Goo("" + public override void Goo() + { + base.Goo(); + } +}", actualText); + } + + [WorkItem(531107, "DevDiv")] + [IdeTheory, CombinatorialData] + public async Task InteractionWithCompletionList(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +using System.Collections.Generic; +class C +{ + void M() + { + List li = $$ + } +} +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("new Li", HangMitigatingCancellationToken); + Assert.True(await TestServices.Editor.IsCompletionActiveAsync(HangMitigatingCancellationToken)); + + if (showCompletionInArgumentLists) + { + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "(", ")" }, HangMitigatingCancellationToken); + } + else + { + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "(", VirtualKeyCode.TAB }, HangMitigatingCancellationToken); + } + + await TestServices.EditorVerifier.CurrentLineTextAsync(" List li = new List()$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(823958, "DevDiv")] + [IdeTheory, CombinatorialData] + public async Task AutoBraceCompleteDoesNotFormatBracePairInInitializers(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C +{ + void M() + { + var x = $$ + } +} +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("new int[]{", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" var x = new int[] {$$}", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(823958, "DevDiv")] + [IdeTheory, CombinatorialData] + public async Task AutoBraceCompleteDoesNotFormatBracePairInObjectCreationExpression(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C +{ + void M() + { + var x = $$ + } +} +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("new {", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" var x = new {$$}", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(823958, "DevDiv")] + [IdeTheory, CombinatorialData] + public async Task AutoBraceCompleteFormatsBracePairInClassDeclarationAndAutoProperty(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class $$ +", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("C{", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("class C { $$}", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + VirtualKeyCode.RETURN, + "int Prop {", + }, + HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +class C +{ + int Prop { $$} +}", +assertCaretPosition: true, +HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + [Trait(Traits.Feature, Traits.Features.CompleteStatement)] + [WorkItem("https://github.com/dotnet/roslyn/issues/18104")] + public async Task CompleteStatementTriggersCompletion(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class Program +{ + static void Main(string[] args) + { + Main$$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("(ar", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Main(ar$$)", assertCaretPosition: true, HangMitigatingCancellationToken); + + if (showCompletionInArgumentLists) + { + Assert.True(await TestServices.Editor.IsCompletionActiveAsync(HangMitigatingCancellationToken)); + } + + await TestServices.Input.SendWithoutActivateAsync(";", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Main(args);$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeTheory, CombinatorialData] + public async Task Braces_InsertionOnNewLine(bool showCompletionInArgumentLists) + { + await SetUpEditorAsync(@" +class C { + void Goo() { + $$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Workspace.SetTriggerCompletionInArgumentListsAsync(LanguageNames.CSharp, showCompletionInArgumentLists, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "if (true)", + VirtualKeyCode.RETURN, + "{", + }, + HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" { $$}", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +class C { + void Goo() { + if (true) + { + + } + } +}", cancellationToken: HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("}", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +class C { + void Goo() { + if (true) + { + }$$ + } +}", assertCaretPosition: true, HangMitigatingCancellationToken); + } + } +} diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpCodeActions.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpCodeActions.cs index 199f5a2e81a93..62a53b274babc 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpCodeActions.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpCodeActions.cs @@ -505,6 +505,7 @@ await TestServices.Workspace.WaitForAllAsyncOperationsAsync( FeatureAttribute.EventHookup, FeatureAttribute.Rename, FeatureAttribute.RenameTracking, + FeatureAttribute.InlineRenameFlyout, FeatureAttribute.SolutionCrawlerLegacy, FeatureAttribute.DiagnosticService, FeatureAttribute.ErrorSquiggles, @@ -570,6 +571,7 @@ await TestServices.Workspace.WaitForAllAsyncOperationsAsync( FeatureAttribute.EventHookup, FeatureAttribute.Rename, FeatureAttribute.RenameTracking, + FeatureAttribute.InlineRenameFlyout, FeatureAttribute.SolutionCrawlerLegacy, FeatureAttribute.DiagnosticService, FeatureAttribute.ErrorSquiggles, @@ -1403,6 +1405,7 @@ await TestServices.Workspace.WaitForAllAsyncOperationsAsync( FeatureAttribute.EventHookup, FeatureAttribute.Rename, FeatureAttribute.RenameTracking, + FeatureAttribute.InlineRenameFlyout, FeatureAttribute.SolutionCrawlerLegacy, FeatureAttribute.DiagnosticService, FeatureAttribute.ErrorSquiggles, diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpFormatting.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpFormatting.cs new file mode 100644 index 0000000000000..fa38540b38e92 --- /dev/null +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpFormatting.cs @@ -0,0 +1,372 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Shared.TestHooks; +using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.CodeAnalysis.Text; +using Microsoft.VisualStudio; +using Roslyn.Test.Utilities; +using Roslyn.VisualStudio.IntegrationTests; +using Roslyn.VisualStudio.IntegrationTests.InProcess; +using WindowsInput.Native; +using Xunit; + +namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp +{ + [Trait(Traits.Feature, Traits.Features.Formatting)] + public class CSharpFormatting : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.CSharp; + + public CSharpFormatting() + : base(nameof(CSharpFormatting)) + { + } + + [IdeFact] + public async Task AlignOpenBraceWithMethodDeclaration() + { + await using (var telemetry = await TestServices.Telemetry.EnableTestTelemetryChannelAsync(HangMitigatingCancellationToken)) + { + await SetUpEditorAsync(@" +$$class C +{ + void Main() + { + } +}", HangMitigatingCancellationToken); + + await TestServices.Editor.FormatDocumentAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +class C +{ + void Main() + { + } +}", cancellationToken: HangMitigatingCancellationToken); + await telemetry.VerifyFiredAsync(new[] { "vs/ide/vbcs/commandhandler/formatcommand" }, HangMitigatingCancellationToken); + } + } + + [IdeFact] + public async Task FormatOnSemicolon() + { + await SetUpEditorAsync(@" +public class C +{ + void Goo() + { + var x = from a in new List() + where x % 2 = 0 + select x ;$$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendAsync(new InputKey[] { VirtualKeyCode.BACK, ';' }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +public class C +{ + void Goo() + { + var x = from a in new List() + where x % 2 = 0 + select x; + } +}", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task FormatSelection() + { + await SetUpEditorAsync(@" +public class C { + public void M( ) {$$ + } +}", HangMitigatingCancellationToken); + + await TestServices.Editor.SelectTextInCurrentDocumentAsync("public void M( ) {", HangMitigatingCancellationToken); + await TestServices.Editor.FormatSelectionAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +public class C { + public void M() + { + } +}", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task PasteCodeWithLambdaBody() + { + await SetUpEditorAsync(@" +using System; +class Program +{ + static void Main() + { + Action a = () => + { + using (null) + { + $$ + } + }; + } +}", HangMitigatingCancellationToken); + await TestServices.Editor.PasteAsync(@" Action b = () => + { + + };", HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.TextContainsAsync(@" +using System; +class Program +{ + static void Main() + { + Action a = () => + { + using (null) + { + Action b = () => + { + + }; + } + }; + } +}", cancellationToken: HangMitigatingCancellationToken); + // Undo should only undo the formatting + await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd97CmdID.Undo, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +using System; +class Program +{ + static void Main() + { + Action a = () => + { + using (null) + { + Action b = () => + { + + }; + } + }; + } +}", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task PasteCodeWithLambdaBody2() + { + await SetUpEditorAsync(@" +using System; +class Program +{ + static void Main() + { + Action a = () => + { + using (null) + { + $$ + } + }; + } +}", HangMitigatingCancellationToken); + await TestServices.Editor.PasteAsync(@" Action b = n => + { + Console.Writeline(n); + };", HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.TextContainsAsync(@" +using System; +class Program +{ + static void Main() + { + Action a = () => + { + using (null) + { + Action b = n => + { + Console.Writeline(n); + }; + } + }; + } +}", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task PasteCodeWithLambdaBody3() + { + await SetUpEditorAsync(@" +using System; +class Program +{ + static void Main() + { + Action a = () => + { + using (null) + { + $$ + } + }; + } +}", HangMitigatingCancellationToken); + await TestServices.Editor.PasteAsync(@" D d = delegate(int x) +{ + return 2 * x; +};", HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.TextContainsAsync(@" +using System; +class Program +{ + static void Main() + { + Action a = () => + { + using (null) + { + D d = delegate (int x) + { + return 2 * x; + }; + } + }; + } +}", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task ShiftEnterWithIntelliSenseAndBraceMatching() + { + await SetUpEditorAsync(@" +class Program +{ + object M(object bar) + { + return M$$ + } +}", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForAsyncOperationsAsync(FeatureAttribute.Workspace, HangMitigatingCancellationToken); + await TestServices.Input.SendAsync(new InputKey[] { "(ba", (VirtualKeyCode.RETURN, VirtualKeyCode.SHIFT), "// comment" }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +class Program +{ + object M(object bar) + { + return M(bar); + // comment + } +}", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + [Trait(Traits.Feature, Traits.Features.EditorConfig)] + [WorkItem("https://github.com/dotnet/roslyn/issues/15003")] + public async Task ApplyEditorConfigAndFormatDocument() + { + var markup = @" +class C +{ + public int X1 + { + get + { + $$return 3; + } + } +}"; + var expectedTextTwoSpaceIndent = @" +class C +{ + public int X1 + { + get + { + return 3; + } + } +}"; + + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Class1.cs", HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var expectedTextFourSpaceIndent, out ImmutableArray _); + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + + /* + * The first portion of this test verifies that Format Document uses the default indentation settings when + * no .editorconfig is available. + */ + + await TestServices.Workspace.WaitForAllAsyncOperationsAsync( + new[] + { + FeatureAttribute.Workspace, + FeatureAttribute.SolutionCrawlerLegacy, + FeatureAttribute.DiagnosticService, + FeatureAttribute.ErrorSquiggles + }, + HangMitigatingCancellationToken); + await TestServices.Editor.FormatDocumentAsync(HangMitigatingCancellationToken); + + Assert.Equal(expectedTextFourSpaceIndent, await TestServices.Editor.GetTextAsync(HangMitigatingCancellationToken)); + + /* + * The second portion of this test adds a .editorconfig file to configure the indentation behavior, and + * verifies that the next Format Document operation adheres to the formatting. + */ + + var editorConfig = @"root = true + +[*.cs] +indent_size = 2 +"; + + await TestServices.SolutionExplorer.AddFileAsync(ProjectName, ".editorconfig", editorConfig, open: false, HangMitigatingCancellationToken); + + await TestServices.Workspace.WaitForAllAsyncOperationsAsync( + new[] + { + FeatureAttribute.Workspace, + FeatureAttribute.SolutionCrawlerLegacy, + FeatureAttribute.DiagnosticService, + FeatureAttribute.ErrorSquiggles + }, + HangMitigatingCancellationToken); + await TestServices.Editor.FormatDocumentAsync(HangMitigatingCancellationToken); + + Assert.Equal(expectedTextTwoSpaceIndent, await TestServices.Editor.GetTextAsync(HangMitigatingCancellationToken)); + + /* + * The third portion of this test modifies the existing .editorconfig file with a new indentation behavior, + * and verifies that the next Format Document operation adheres to the updated formatting. + */ + + await TestServices.SolutionExplorer.SetFileContentsAsync(ProjectName, ".editorconfig", editorConfig.Replace("2", "4"), HangMitigatingCancellationToken); + + await TestServices.Workspace.WaitForAllAsyncOperationsAsync( + new[] + { + FeatureAttribute.Workspace, + FeatureAttribute.SolutionCrawlerLegacy, + FeatureAttribute.DiagnosticService, + FeatureAttribute.ErrorSquiggles + }, + HangMitigatingCancellationToken); + await TestServices.Editor.FormatDocumentAsync(HangMitigatingCancellationToken); + + Assert.Equal(expectedTextFourSpaceIndent, await TestServices.Editor.GetTextAsync(HangMitigatingCancellationToken)); + } + } +} diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpRename.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpRename.cs new file mode 100644 index 0000000000000..93f017de33dd6 --- /dev/null +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/CSharp/CSharpRename.cs @@ -0,0 +1,645 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Editor.InlineRename; +using Microsoft.CodeAnalysis.InlineRename; +using Microsoft.CodeAnalysis.Options; +using Microsoft.CodeAnalysis.Shared.TestHooks; +using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.CodeAnalysis.Text; +using Microsoft.VisualStudio.IntegrationTest.Utilities; +using Roslyn.Test.Utilities; +using Roslyn.VisualStudio.IntegrationTests; +using Roslyn.VisualStudio.IntegrationTests.InProcess; +using WindowsInput.Native; +using Xunit; + +namespace Roslyn.VisualStudio.NewIntegrationTests.CSharp +{ + [Trait(Traits.Feature, Traits.Features.Rename)] + public class CSharpRename : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.CSharp; + + public CSharpRename() + : base(nameof(CSharpRename)) + { + } + + public override async Task InitializeAsync() + { + await base.InitializeAsync(); + + // reset relevant global options to default values: + var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); + globalOptions.SetGlobalOption(InlineRenameUIOptionsStorage.UseInlineAdornment, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameInComments, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameInStrings, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameOverloads, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameFile, true); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.PreviewChanges, false); + } + + [IdeFact] + public async Task VerifyLocalVariableRename() + { + var markup = @" +using System; +using System.Collections.Generic; +using System.Linq; + +class Program +{ + static void Main(string[] args) + { + int [|x|]$$ = 0; + [|x|] = 5; + TestMethod([|x|]); + } + + static void TestMethod(int y) + { + + } +}"; + await using (var telemetry = await TestServices.Telemetry.EnableTestTelemetryChannelAsync(HangMitigatingCancellationToken)) + { + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +using System; +using System.Collections.Generic; +using System.Linq; + +class Program +{ + static void Main(string[] args) + { + int y$$ = 0; + y = 5; + TestMethod(y); + } + + static void TestMethod(int y) + { + + } +}", HangMitigatingCancellationToken); + await telemetry.VerifyFiredAsync(new[] { "vs/ide/vbcs/rename/inlinesession/session", "vs/ide/vbcs/rename/commitcore" }, HangMitigatingCancellationToken); + } + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRename() + { + var markup = @" +using System; + +class [|$$ustom|]Attribute : Attribute +{ +} +"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "Custom", VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +using System; + +class Custom$$Attribute : Attribute +{ +} +", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRenameWhileRenameClasss() + { + var markup = @" +using System; + +class [|$$stom|]Attribute : Attribute +{ +} +"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync("Custom", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +using System; + +class Custom$$Attribute : Attribute +{ +} +", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRenameWhileRenameAttribute() + { + var markup = @" +using System; + +[[|$$stom|]] +class Bar +{ +} + +class [|stom|]Attribute : Attribute +{ +} +"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync("Custom", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +using System; + +[Custom$$] +class Bar +{ +} + +class CustomAttribute : Attribute +{ +} +", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRenameWhileRenameAttributeClass() + { + var markup = @" +using System; + +[[|stom|]] +class Bar +{ +} + +class [|$$stom|]Attribute : Attribute +{ +} +"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync("Custom", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +using System; + +[Custom] +class Bar +{ +} + +class Custom$$Attribute : Attribute +{ +} +", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyLocalVariableRenameWithCommentsUpdated() + { + // "variable" is intentionally misspelled as "varixable" and "this" is misspelled as + // "thix" below to ensure we don't change instances of "x" in comments that are part of + // larger words + var markup = @" +using System; +using System.Collections.Generic; +using System.Linq; + +class Program +{ + /// + /// creates a varixable named [|x|] xx + /// + /// + static void Main(string[] args) + { + // thix varixable is named [|x|] xx + int [|x|]$$ = 0; + [|x|] = 5; + TestMethod([|x|]); + } + + static void TestMethod(int y) + { + /* + * [|x|] + * xx + */ + } +}"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + await TestServices.InlineRename.ToggleIncludeCommentsAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +using System; +using System.Collections.Generic; +using System.Linq; + +class Program +{ + /// + /// creates a varixable named y xx + /// + /// + static void Main(string[] args) + { + // thix varixable is named y xx + int y$$ = 0; + y = 5; + TestMethod(y); + } + + static void TestMethod(int y) + { + /* + * y + * xx + */ + } +}", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyLocalVariableRenameWithStringsUpdated() + { + var markup = @" +class Program +{ + static void Main(string[] args) + { + int [|x|]$$ = 0; + [|x|] = 5; + var s = ""[|x|] xx [|x|]""; + var sLiteral = + @"" + [|x|] + xx + [|x|] + ""; + char c = 'x'; + char cUnit = '\u0078'; + } +}"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + await TestServices.InlineRename.ToggleIncludeStringsAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class Program +{ + static void Main(string[] args) + { + int y$$ = 0; + y = 5; + var s = ""y xx y""; + var sLiteral = + @"" + y + xx + y + ""; + char c = 'x'; + char cUnit = '\u0078'; + } +}", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyOverloadsUpdated() + { + var markup = @" +interface I +{ + void [|TestMethod|]$$(int y); + void [|TestMethod|](string y); +} + +class B : I +{ + public virtual void [|TestMethod|](int y) + { } + + public virtual void [|TestMethod|](string y) + { } +}"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + await TestServices.InlineRename.ToggleIncludeOverloadsAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +interface I +{ + void y$$(int y); + void y(string y); +} + +class B : I +{ + public virtual void y(int y) + { } + + public virtual void y(string y) + { } +}", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyMultiFileRename() + { + await SetUpEditorAsync(@" +class $$Program +{ +}", HangMitigatingCancellationToken); + await TestServices.SolutionExplorer.AddFileAsync(ProjectName, "Class2.cs", @"", cancellationToken: HangMitigatingCancellationToken); + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Class2.cs", HangMitigatingCancellationToken); + + const string class2Markup = @" +class SomeOtherClass +{ + void M() + { + [|Program|] p = new [|Program|](); + } +}"; + MarkupTestFile.GetSpans(class2Markup, out var code, out ImmutableArray renameSpans); + + await TestServices.Editor.SetTextAsync(code, HangMitigatingCancellationToken); + await TestServices.Editor.PlaceCaretAsync("Program", charsOffset: 0, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class SomeOtherClass +{ + void M() + { + y$$ p = new y(); + } +}", HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Class1.cs", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class y$$ +{ +}", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyRenameCancellation() + { + await SetUpEditorAsync(@" +class $$Program +{ +}", HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.AddFileAsync(ProjectName, "Class2.cs", @"", cancellationToken: HangMitigatingCancellationToken); + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Class2.cs", HangMitigatingCancellationToken); + await TestServices.Editor.SetTextAsync(@" +class SomeOtherClass +{ + void M() + { + Program p = new Program(); + } +}", HangMitigatingCancellationToken); + await TestServices.Editor.PlaceCaretAsync("Program", charsOffset: 0, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.VK_Y, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class SomeOtherClass +{ + void M() + { + y$$ p = new y(); + } +}", HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Class1.cs", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class y$$ +{ +}", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.ESCAPE, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class Program$$ +{ +}", HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Class2.cs", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class SomeOtherClass +{ + void M() + { + Program$$ p = new Program(); + } +}", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyCrossProjectRename() + { + await SetUpEditorAsync(@" +$$class RenameRocks +{ + static void Main(string[] args) + { + Class2 c = null; + c.ToString(); + } +}", HangMitigatingCancellationToken); + var project1 = ProjectName; + var project2 = "Project2"; + + await TestServices.SolutionExplorer.AddProjectAsync(project2, WellKnownProjectTemplates.ClassLibrary, LanguageName, HangMitigatingCancellationToken); + await TestServices.SolutionExplorer.AddProjectReferenceAsync(projectName: project1, projectToReferenceName: project2, HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.AddFileAsync(project2, "Class2.cs", @"", cancellationToken: HangMitigatingCancellationToken); + await TestServices.SolutionExplorer.OpenFileAsync(project2, "Class2.cs", HangMitigatingCancellationToken); + + await TestServices.Editor.SetTextAsync(@" +public class Class2 { static void Main(string [] args) { } }", HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.OpenFileAsync(project1, "Class1.cs", HangMitigatingCancellationToken); + await TestServices.Editor.PlaceCaretAsync("Class2", charsOffset: 0, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class RenameRocks +{ + static void Main(string[] args) + { + y$$ c = null; + c.ToString(); + } +}", HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.OpenFileAsync(project2, "y.cs", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +public class y { static void Main(string [] args) { } }$$", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyRenameUndo() + { + await VerifyCrossProjectRename(); + + await TestServices.Input.SendWithoutActivateAsync((VirtualKeyCode.VK_Z, VirtualKeyCode.CONTROL), HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +public class Class2 { static void Main(string [] args) { } }$$", HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Class1.cs", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class RenameRocks +{ + static void Main(string[] args) + { + Class2$$ c = null; + c.ToString(); + } +}", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyRenameInStandaloneFiles() + { + await TestServices.SolutionExplorer.CloseSolutionAsync(HangMitigatingCancellationToken); + await TestServices.SolutionExplorer.AddStandaloneFileAsync("StandaloneFile1.cs", HangMitigatingCancellationToken); + await TestServices.Editor.SetTextAsync(@" +class Program +{ + void Goo() + { + var ids = 1; + ids = 2; + } +}", HangMitigatingCancellationToken); + await TestServices.Editor.PlaceCaretAsync("ids", charsOffset: 0, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +class Program +{ + void Goo() + { + var y$$ = 1; + y = 2; + } +}", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/39617")] + public async Task VerifyRenameCaseChange() + { + await TestServices.SolutionExplorer.AddFileAsync(ProjectName, "Program.cs", +@" +class Program +{ + static void Main(string[] args) + { + } +}", cancellationToken: HangMitigatingCancellationToken); + + await TestServices.SolutionExplorer.OpenFileAsync(ProjectName, "Program.cs", HangMitigatingCancellationToken); + await TestServices.Editor.PlaceCaretAsync("Program", charsOffset: 0, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.HOME, VirtualKeyCode.DELETE, VirtualKeyCode.VK_P, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.TextEqualsAsync( + @" +class p$$rogram +{ + static void Main(string[] args) + { + } +}", HangMitigatingCancellationToken); + } + } +} diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorInProcess.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorInProcess.cs index de195b6a462f1..3e329c4f8b3c9 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorInProcess.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorInProcess.cs @@ -17,6 +17,7 @@ using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.CodeFixesAndRefactorings; using Microsoft.CodeAnalysis.Editor; +using Microsoft.CodeAnalysis.Editor.Implementation.InlineRename.HighlightTags; using Microsoft.CodeAnalysis.Editor.Implementation.Suggestions; using Microsoft.CodeAnalysis.Editor.Shared.Extensions; using Microsoft.CodeAnalysis.GoToBase; @@ -207,6 +208,18 @@ public async Task DeleteTextAsync(string text, CancellationToken cancellationTok await TestServices.Input.SendAsync(VirtualKeyCode.DELETE, cancellationToken); } + public async Task PasteAsync(string text, CancellationToken cancellationToken) + { + var provider = await TestServices.Shell.GetComponentModelServiceAsync(cancellationToken); + var waiter = (IAsynchronousOperationWaiter)provider.GetListener(FeatureAttribute.AddImportsOnPaste); + + await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.Workspace, FeatureAttribute.SolutionCrawlerLegacy }, cancellationToken); + Clipboard.SetText(text); + await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd97CmdID.Paste, cancellationToken); + + await waiter.ExpeditedWaitAsync(); + } + public async Task GetLightBulbPreviewClassificationsAsync(string menuText, CancellationToken cancellationToken) { await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); @@ -400,18 +413,31 @@ public async Task SetUseSuggestionModeAsync(bool forDebuggerTextView, bool value } } - public async Task>> GetErrorTagsAsync(CancellationToken cancellationToken) + public Task>> GetErrorTagsAsync(CancellationToken cancellationToken) + { + return GetTagsAsync(cancellationToken); + } + + public async Task>> GetRenameTagsAsync(CancellationToken cancellationToken) + { + await TestServices.Workspace.WaitForRenameAsync(cancellationToken); + var tags = await GetTagsAsync(cancellationToken); + return tags.WhereAsArray(tag => tag.Tag.Type == RenameFieldBackgroundAndBorderTag.TagId); + } + + public async Task>> GetTagsAsync(CancellationToken cancellationToken) + where TTag : ITag { await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); var view = await GetActiveTextViewAsync(cancellationToken); var viewTagAggregatorFactory = await GetComponentModelServiceAsync(cancellationToken); - var aggregator = viewTagAggregatorFactory.CreateTagAggregator(view); + var aggregator = viewTagAggregatorFactory.CreateTagAggregator(view); var tags = aggregator .GetTags(new SnapshotSpan(view.TextSnapshot, 0, view.TextSnapshot.Length)) .Cast>(); - return tags.SelectAsArray(tag => (new TagSpan(tag.Span.GetSpans(view.TextBuffer).Single(), (IErrorTag)tag.Tag))); + return tags.SelectAsArray(tag => (new TagSpan(tag.Span.GetSpans(view.TextBuffer).Single(), (TTag)tag.Tag))); } private static bool IsDebuggerTextView(ITextView textView) @@ -655,6 +681,20 @@ public async Task DismissCompletionSessionsAsync(CancellationToken cancellationT broker.DismissAllSessions(view); } + public async Task IsCompletionActiveAsync(CancellationToken cancellationToken) + { + await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + + await WaitForCompletionSetAsync(cancellationToken); + + var view = await GetActiveTextViewAsync(cancellationToken); + if (view is null) + return false; + + var broker = await TestServices.Shell.GetComponentModelServiceAsync(cancellationToken); + return broker.IsCompletionActive(view); + } + public async Task ShowLightBulbAsync(CancellationToken cancellationToken) { await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); @@ -1079,6 +1119,16 @@ await TestServices.Workspace.WaitForAllAsyncOperationsAsync( }); } + public Task FormatDocumentAsync(CancellationToken cancellationToken) + { + return TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd2KCmdID.FORMATDOCUMENT, cancellationToken); + } + + public Task FormatSelectionAsync(CancellationToken cancellationToken) + { + return TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd2KCmdID.FORMATSELECTION, cancellationToken); + } + private async Task WaitForCompletionSetAsync(CancellationToken cancellationToken) { await TestServices.Workspace.WaitForAsyncOperationsAsync(FeatureAttribute.CompletionSet, cancellationToken); diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorVerifierInProcess.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorVerifierInProcess.cs index 5af9e9ab2f6c5..07ff3200a9135 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorVerifierInProcess.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EditorVerifierInProcess.cs @@ -67,6 +67,17 @@ private async Task CurrentLineTextAndAssertCaretPositionAsync( Assert.Equal(expectedTextBeforeCaret.Length + expectedTextAfterCaret.Length, lineText.Length); } + public async Task TextEqualsAsync( + string expectedText, + CancellationToken cancellationToken) + { + var view = await TestServices.Editor.GetActiveTextViewAsync(cancellationToken); + var editorText = view.TextSnapshot.GetText(); + var caretPosition = await TestServices.Editor.GetCaretPositionAsync(cancellationToken); + editorText = editorText.Insert(caretPosition, "$$"); + AssertEx.EqualOrDiff(expectedText, editorText); + } + public async Task TextContainsAsync( string expectedText, bool assertCaretPosition = false, diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EncapsulateFieldInProcess.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EncapsulateFieldInProcess.cs index 87c1861d3e89d..f346139c758d4 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EncapsulateFieldInProcess.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/EncapsulateFieldInProcess.cs @@ -16,9 +16,6 @@ internal partial class EncapsulateFieldInProcess internal Task InvokeAsync(CancellationToken cancellationToken) { - // Cancellation is not currently supported by SendAsync - _ = cancellationToken; - return TestServices.Input.SendAsync(new InputKey[] { (VirtualKeyCode.VK_R, VirtualKeyCode.CONTROL), (VirtualKeyCode.VK_E, VirtualKeyCode.CONTROL) }, cancellationToken); } } diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/InlineRenameInProcess.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/InlineRenameInProcess.cs new file mode 100644 index 0000000000000..cbde0a2029a08 --- /dev/null +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/InlineRenameInProcess.cs @@ -0,0 +1,41 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.Shared.TestHooks; +using Microsoft.VisualStudio; +using Microsoft.VisualStudio.Extensibility.Testing; +using WindowsInput.Native; + +namespace Roslyn.VisualStudio.IntegrationTests.InProcess +{ + [TestService] + internal partial class InlineRenameInProcess + { + public async Task InvokeAsync(CancellationToken cancellationToken) + { + await TestServices.Shell.ExecuteCommandAsync(VSConstants.VSStd2KCmdID.RENAME, cancellationToken); + await TestServices.Workspace.WaitForRenameAsync(cancellationToken); + } + + public async Task ToggleIncludeCommentsAsync(CancellationToken cancellationToken) + { + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { (VirtualKeyCode.VK_C, VirtualKeyCode.MENU) }, cancellationToken); + await TestServices.Workspace.WaitForRenameAsync(cancellationToken); + } + + public async Task ToggleIncludeStringsAsync(CancellationToken cancellationToken) + { + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { (VirtualKeyCode.VK_S, VirtualKeyCode.MENU) }, cancellationToken); + await TestServices.Workspace.WaitForRenameAsync(cancellationToken); + } + + public async Task ToggleIncludeOverloadsAsync(CancellationToken cancellationToken) + { + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { (VirtualKeyCode.VK_O, VirtualKeyCode.MENU) }, cancellationToken); + await TestServices.Workspace.WaitForRenameAsync(cancellationToken); + } + } +} diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/SolutionExplorerInProcess.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/SolutionExplorerInProcess.cs index eb8a650da42c4..a96d0b9af77b4 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/SolutionExplorerInProcess.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/SolutionExplorerInProcess.cs @@ -432,6 +432,39 @@ public async Task AddFileAsync(string projectName, string fileName, string? cont } } + /// + /// Adds a new standalone file to the Miscellaneous Files workspace. + /// + /// The name of the file to add. + public async Task AddStandaloneFileAsync(string fileName, CancellationToken cancellationToken) + { + await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + + string itemTemplate; + + var extension = Path.GetExtension(fileName).ToLowerInvariant(); + switch (extension) + { + case ".cs": + itemTemplate = @"General\C# Class"; + break; + case ".csx": + itemTemplate = @"Script\Visual C# Script"; + break; + case ".vb": + itemTemplate = @"General\Visual Basic Class"; + break; + case ".txt": + itemTemplate = @"General\Text File"; + break; + default: + throw new NotSupportedException($"File type '{extension}' is not yet supported."); + } + + var dte = await GetRequiredGlobalServiceAsync(cancellationToken); + dte.ItemOperations.NewFile(itemTemplate, fileName); + } + public async Task RenameFileAsync(string projectName, string oldFileName, string newFileName, CancellationToken cancellationToken) { await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/StateResetInProcess.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/StateResetInProcess.cs index fa47925a67142..aaa86e5b317e3 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/StateResetInProcess.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/StateResetInProcess.cs @@ -9,11 +9,17 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.AddImportOnPaste; using Microsoft.CodeAnalysis.Completion; +using Microsoft.CodeAnalysis.CSharp.CodeStyle; +using Microsoft.CodeAnalysis.Editor.InlineRename; using Microsoft.CodeAnalysis.Editor.Options; using Microsoft.CodeAnalysis.Editor.VisualBasic.LineCommit; using Microsoft.CodeAnalysis.Host; +using Microsoft.CodeAnalysis.InheritanceMargin; +using Microsoft.CodeAnalysis.InlineRename; using Microsoft.CodeAnalysis.MetadataAsSource; using Microsoft.CodeAnalysis.Options; +using Microsoft.CodeAnalysis.SolutionCrawler; +using Microsoft.CodeAnalysis.Structure; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Extensibility.Testing; using Microsoft.VisualStudio.IntegrationTest.Utilities; @@ -44,9 +50,23 @@ public async Task ResetGlobalOptionsAsync(CancellationToken cancellationToken) configurationService.Clear(); var globalOptions = await GetComponentModelServiceAsync(cancellationToken); + ResetOption(globalOptions, CSharpCodeStyleOptions.NamespaceDeclarations); + ResetOption(globalOptions, InheritanceMarginOptionsStorage.InheritanceMarginCombinedWithIndicatorMargin); + ResetOption(globalOptions, InlineRenameSessionOptionsStorage.PreviewChanges); + ResetOption(globalOptions, InlineRenameSessionOptionsStorage.RenameFile); + ResetOption(globalOptions, InlineRenameSessionOptionsStorage.RenameInComments); + ResetOption(globalOptions, InlineRenameSessionOptionsStorage.RenameInStrings); + ResetOption(globalOptions, InlineRenameSessionOptionsStorage.RenameOverloads); + ResetOption(globalOptions, InlineRenameUIOptionsStorage.UseInlineAdornment); ResetOption(globalOptions, MetadataAsSourceOptionsStorage.NavigateToDecompiledSources); ResetOption(globalOptions, WorkspaceConfigurationOptionsStorage.EnableOpeningSourceGeneratedFilesInWorkspace); + ResetPerLanguageOption(globalOptions, BlockStructureOptionsStorage.CollapseSourceLinkEmbeddedDecompiledFilesWhenFirstOpened); + ResetPerLanguageOption(globalOptions, CompletionOptionsStorage.TriggerInArgumentLists); + ResetPerLanguageOption(globalOptions, InheritanceMarginOptionsStorage.InheritanceMarginIncludeGlobalImports); + ResetPerLanguageOption(globalOptions, InheritanceMarginOptionsStorage.ShowInheritanceMargin); ResetPerLanguageOption(globalOptions, NavigationBarViewOptionsStorage.ShowNavigationBar); + ResetPerLanguageOption(globalOptions, SolutionCrawlerOptionsStorage.BackgroundAnalysisScopeOption); + ResetPerLanguageOption(globalOptions, SolutionCrawlerOptionsStorage.CompilerDiagnosticsScopeOption); ResetPerLanguageOption(globalOptions, VisualStudioNavigationOptionsStorage.NavigateToObjectBrowser); ResetPerLanguageOption(globalOptions, AddImportOnPasteOptionsStorage.AddImportsOnPaste); ResetPerLanguageOption(globalOptions, LineCommitOptionsStorage.PrettyListing); diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/WorkspaceInProcess.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/WorkspaceInProcess.cs index 324bfd23d56ef..d9706b4083b99 100644 --- a/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/WorkspaceInProcess.cs +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/InProcess/WorkspaceInProcess.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeStyle; +using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Editor.Shared.Utilities; using Microsoft.CodeAnalysis.Editor.VisualBasic.LineCommit; using Microsoft.CodeAnalysis.Host; @@ -65,6 +66,14 @@ public async Task SetPrettyListingAsync(string languageName, bool value, Cancell globalOptions.SetGlobalOption(LineCommitOptionsStorage.PrettyListing, languageName, value); } + public async Task SetTriggerCompletionInArgumentListsAsync(string languageName, bool value, CancellationToken cancellationToken) + { + await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + + var globalOptions = await GetComponentModelServiceAsync(cancellationToken); + globalOptions.SetGlobalOption(CompletionOptionsStorage.TriggerInArgumentLists, languageName, value); + } + public async Task SetFileScopedNamespaceAsync(bool value, CancellationToken cancellationToken) { await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); @@ -142,6 +151,18 @@ public async Task WaitForAllAsyncOperationsAsync(string[] featureNames, Cancella await listenerProvider.WaitAllAsync(workspace, featureNames).WithCancellation(cancellationToken); } + public async Task WaitForRenameAsync(CancellationToken cancellationToken) + { + await WaitForAllAsyncOperationsAsync( + new[] + { + FeatureAttribute.Rename, + FeatureAttribute.RenameTracking, + FeatureAttribute.InlineRenameFlyout, + }, + cancellationToken); + } + /// /// This event listener is an adapter to expose asynchronous file save operations to Roslyn via its standard /// workspace event waiters. diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicAutomaticBraceCompletion.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicAutomaticBraceCompletion.cs new file mode 100644 index 0000000000000..c0fef93a976eb --- /dev/null +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicAutomaticBraceCompletion.cs @@ -0,0 +1,401 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Completion; +using Microsoft.CodeAnalysis.Editor.InlineRename; +using Microsoft.CodeAnalysis.Options; +using Microsoft.CodeAnalysis.Shared.TestHooks; +using Microsoft.CodeAnalysis.Test.Utilities; +using Roslyn.Test.Utilities; +using Roslyn.VisualStudio.IntegrationTests; +using Roslyn.VisualStudio.IntegrationTests.InProcess; +using WindowsInput.Native; +using Xunit; + +namespace Roslyn.VisualStudio.NewIntegrationTests.VisualBasic +{ + [Trait(Traits.Feature, Traits.Features.AutomaticCompletion)] + public class BasicAutomaticBraceCompletion : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.VisualBasic; + + public BasicAutomaticBraceCompletion() + : base(nameof(BasicAutomaticBraceCompletion)) + { + } + + [IdeTheory, CombinatorialData] + public async Task Braces_InsertionAndTabCompleting(bool argumentCompletion) + { + var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); + globalOptions.SetGlobalOption(CompletionViewOptionsStorage.EnableArgumentCompletionSnippets, LanguageNames.VisualBasic, argumentCompletion); + + // Disable new rename UI for now, it's causing these tests to fail. + // https://github.com/dotnet/roslyn/issues/63576 + globalOptions.SetGlobalOption(InlineRenameUIOptionsStorage.UseInlineAdornment, false); + + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim x = {", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim x = {$$}", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "New Object", + VirtualKeyCode.ESCAPE, + VirtualKeyCode.TAB, + }, + HangMitigatingCancellationToken); + + if (argumentCompletion) + { + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim x = {New Object($$)}", assertCaretPosition: true, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForAllAsyncOperationsAsync(new[] { FeatureAttribute.SignatureHelp }, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim x = {New Object()$$}", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim x = {New Object()}$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + else + { + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim x = {New Object}$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + } + + [IdeFact] + public async Task Braces_Overtyping() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim x = {", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync('}', HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim x = {}$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task ParenthesesTypeoverAfterStringLiterals() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Console.Write(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Console.Write($$)", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync('"', HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Console.Write(\"$$\")", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync('"', HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Console.Write(\"\"$$)", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(')', HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Console.Write(\"\")$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Braces_OnReturnNoFormattingOnlyIndentationBeforeCloseBrace() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim x = {", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" $$}", assertCaretPosition: true, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +Class C + Sub Goo() + Dim x = { + $$} + End Sub +End Class", +assertCaretPosition: true, +HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Paren_InsertionAndTabCompleting() + { + await SetUpEditorAsync(@" +Class C + $$ +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Sub Goo(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Sub Goo($$)", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("x As Long", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.ESCAPE, HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Sub Goo(x As Long)$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Paren_Overtyping() + { + await SetUpEditorAsync(@" +Class C + $$ +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Sub Goo(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Sub Goo($$)", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.ESCAPE, HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(')', HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Sub Goo()$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Bracket_Insertion() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim [Dim", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim [Dim$$]", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Bracket_Overtyping() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim [Dim", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim [Dim$$]", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("] As Long", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim [Dim] As Long$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task DoubleQuote_InsertionAndTabCompletion() + { + // Disable new rename UI for now, it's causing these tests to fail. + // https://github.com/dotnet/roslyn/issues/63576 + var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); + globalOptions.SetGlobalOption(InlineRenameUIOptionsStorage.UseInlineAdornment, false); + + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim str = \"", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim str = \"$$\"", assertCaretPosition: true, HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.TAB, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim str = \"\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Nested_AllKinds_1() + { + await SetUpEditorAsync(@" +Class C + Sub New([dim] As String) + End Sub + + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "Dim y = {New C([dim", + VirtualKeyCode.ESCAPE, + "]:=\"hello({[\")}", + VirtualKeyCode.RETURN, + }, + HangMitigatingCancellationToken); + var actualText = await TestServices.Editor.GetTextAsync(HangMitigatingCancellationToken); + Assert.Contains("Dim y = {New C([dim]:=\"hello({[\")}", actualText); + } + + [IdeFact] + public async Task Nested_AllKinds_2() + { + await SetUpEditorAsync(@" +Class C + Sub New([dim] As String) + End Sub + + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync( + new InputKey[] + { + "Dim y = {New C([dim", + VirtualKeyCode.ESCAPE, + VirtualKeyCode.TAB, + ":=\"hello({[", + VirtualKeyCode.TAB, + VirtualKeyCode.TAB, + VirtualKeyCode.TAB, + VirtualKeyCode.RETURN, + }, + HangMitigatingCancellationToken); + var actualText = await TestServices.Editor.GetTextAsync(HangMitigatingCancellationToken); + Assert.Contains("Dim y = {New C([dim]:=\"hello({[\")}", actualText); + } + + [IdeFact] + public async Task Negative_NoCompletionInComments() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + ' $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("{([\"", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" ' {([\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Negative_NoCompletionInStringLiterals() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim s = \"{([", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim s = \"{([$$\"", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Negative_NoCompletionInXmlDocComment() + { + await SetUpEditorAsync(@" +$$ +Class C +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("'''", HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync('{', HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync('(', HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync('[', HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync('"', HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync("''' {([\"$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task Negative_NoCompletionInXmlDocCommentAtEndOfTag() + { + await SetUpEditorAsync(@" +Class C + ''' + ''' $$ + ''' + Sub Goo() + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" ''' ($$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(652015, "DevDiv")] + [IdeFact] + public async Task LineCommittingIssue() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Dim x=\"\" '", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Dim x=\"\" '$$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(653399, "DevDiv")] + [IdeFact] + public async Task VirtualWhitespaceIssue() + { + await SetUpEditorAsync(@" +Class C + Sub Goo()$$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.RETURN, HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync('(', HangMitigatingCancellationToken); + await TestServices.Input.SendWithoutActivateAsync(VirtualKeyCode.BACK, HangMitigatingCancellationToken); + + await TestServices.EditorVerifier.CurrentLineTextAsync(" $$", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(659684, "DevDiv")] + [IdeFact] + public async Task CompletionWithIntelliSenseWindowUp() + { + await SetUpEditorAsync(@" +Class C + Sub Goo() + End Sub + Sub Test() + $$ + End Sub +End Class", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Goo(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Goo($$)", assertCaretPosition: true, HangMitigatingCancellationToken); + } + + [WorkItem(657451, "DevDiv")] + [IdeFact] + public async Task CompletionAtTheEndOfFile() + { + await SetUpEditorAsync(@" +Class C + $$", HangMitigatingCancellationToken); + + await TestServices.Input.SendWithoutActivateAsync("Sub Goo(", HangMitigatingCancellationToken); + await TestServices.EditorVerifier.CurrentLineTextAsync(" Sub Goo($$)", assertCaretPosition: true, HangMitigatingCancellationToken); + } + } +} diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicFormatting.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicFormatting.cs new file mode 100644 index 0000000000000..a7497149e1c5b --- /dev/null +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicFormatting.cs @@ -0,0 +1,81 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Text; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Shared.TestHooks; +using Microsoft.CodeAnalysis.Test.Utilities; +using Roslyn.VisualStudio.IntegrationTests; +using Roslyn.VisualStudio.IntegrationTests.InProcess; +using WindowsInput.Native; +using Xunit; + +namespace Roslyn.VisualStudio.NewIntegrationTests.VisualBasic +{ + [Trait(Traits.Feature, Traits.Features.Formatting)] + public class BasicFormatting : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.VisualBasic; + + public BasicFormatting() + : base(nameof(BasicFormatting)) + { + } + + [IdeFact] + public async Task VerifyFormattingIndent() + { + var testCode = new StringBuilder() + .AppendLine("$$Module A") + .AppendLine(" Sub Main(args As String())") + .AppendLine(" ") + .AppendLine(" End Sub") + .AppendLine("End Module") + .ToString(); + + await SetUpEditorAsync(testCode, HangMitigatingCancellationToken); + + await TestServices.Editor.FormatDocumentAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync( +@"Module A + Sub Main(args As String()) + + End Sub +End Module", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyCaseCorrection() + { + await SetUpEditorAsync(@" +$$module A +end module", HangMitigatingCancellationToken); + await TestServices.Editor.FormatDocumentAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +Module A +End Module", cancellationToken: HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task ShiftEnterWithIntelliSenseAndBraceMatching() + { + await SetUpEditorAsync(@" +Module Program + Function Main(ooo As Object) As Object + Return Main$$ + End Function +End Module", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForAsyncOperationsAsync(FeatureAttribute.Workspace, HangMitigatingCancellationToken); + await TestServices.Input.SendAsync(new InputKey[] { "(o", (VirtualKeyCode.RETURN, VirtualKeyCode.SHIFT), "'comment" }, HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextContainsAsync(@" +Module Program + Function Main(ooo As Object) As Object + Return Main(ooo) + 'comment + End Function +End Module", cancellationToken: HangMitigatingCancellationToken); + } + } +} diff --git a/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicRename.cs b/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicRename.cs new file mode 100644 index 0000000000000..adadde27151ae --- /dev/null +++ b/src/VisualStudio/IntegrationTest/New.IntegrationTests/VisualBasic/BasicRename.cs @@ -0,0 +1,415 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Immutable; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Editor.InlineRename; +using Microsoft.CodeAnalysis.InlineRename; +using Microsoft.CodeAnalysis.Options; +using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.CodeAnalysis.Text; +using Roslyn.Test.Utilities; +using Roslyn.VisualStudio.IntegrationTests; +using Roslyn.VisualStudio.IntegrationTests.InProcess; +using WindowsInput.Native; +using Xunit; +using Xunit.Sdk; + +namespace Roslyn.VisualStudio.NewIntegrationTests.VisualBasic +{ + [Trait(Traits.Feature, Traits.Features.Rename)] + public class BasicRename : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.VisualBasic; + + public BasicRename() + : base(nameof(BasicRename)) + { + } + + public override async Task InitializeAsync() + { + await base.InitializeAsync(); + + // reset relevant global options to default values: + var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync(HangMitigatingCancellationToken); + globalOptions.SetGlobalOption(InlineRenameUIOptionsStorage.UseInlineAdornment, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameInComments, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameInStrings, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameOverloads, false); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.RenameFile, true); + globalOptions.SetGlobalOption(InlineRenameSessionOptionsStorage.PreviewChanges, false); + } + + [IdeFact] + public async Task VerifyLocalVariableRename() + { + var markup = @" +Imports System +Imports System.Collections.Generic +Imports System.Linq + +Module Program + Sub Main(args As String()) + Dim [|x|]$$ As Integer = 0 + [|x|] = 5 + TestMethod([|x|]) + End Sub + Sub TestMethod(y As Integer) + + End Sub +End Module"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System +Imports System.Collections.Generic +Imports System.Linq + +Module Program + Sub Main(args As String()) + Dim y$$ As Integer = 0 + y = 5 + TestMethod(y) + End Sub + Sub TestMethod(y As Integer) + + End Sub +End Module", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyLocalVariableRenameWithCommentsUpdated() + { + // "variable" is intentionally misspelled as "varixable" and "this" is misspelled as + // "thix" below to ensure we don't change instances of "x" in comments that are part of + // larger words + var markup = @" +Imports System +Imports System.Collections.Generic +Imports System.Linq + +Module Program + ''' + ''' creates a varixable named [|x|] xx + ''' + ''' + Sub Main(args As String()) + ' thix varixable is named [|x|] xx + Dim [|x|]$$ As Integer = 0 + [|x|] = 5 + TestMethod([|x|]) +End Module"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + await TestServices.InlineRename.ToggleIncludeCommentsAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System +Imports System.Collections.Generic +Imports System.Linq + +Module Program + ''' + ''' creates a varixable named y xx + ''' + ''' + Sub Main(args As String()) + ' thix varixable is named y xx + Dim y$$ As Integer = 0 + y = 5 + TestMethod(y) +End Module", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyLocalVariableRenameWithStringsUpdated() + { + var markup = @" +Imports System +Imports System.Collections.Generic +Imports System.Linq + +Module Program + Sub Main(args As String()) + Dim [|x|]$$ As Integer = 0 + [|x|] = 5 + Dim s = ""[|x|] xx [|x|]"" + End Sub +End Module"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + await TestServices.InlineRename.ToggleIncludeStringsAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System +Imports System.Collections.Generic +Imports System.Linq + +Module Program + Sub Main(args As String()) + Dim y$$ As Integer = 0 + y = 5 + Dim s = ""y xx y"" + End Sub +End Module", HangMitigatingCancellationToken); + } + + [IdeFact] + public async Task VerifyOverloadsUpdated() + { + var markup = @" +Interface I + Sub [|TestMethod|]$$(y As Integer) + Sub [|TestMethod|](y As String) +End Interface + +Public MustInherit Class A + Implements I + Public MustOverride Sub [|TestMethod|](y As Integer) Implements I.[|TestMethod|] + Public MustOverride Sub [|TestMethod|](y As String) Implements I.[|TestMethod|] +End Class"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + await TestServices.InlineRename.ToggleIncludeOverloadsAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { VirtualKeyCode.VK_Y, VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Interface I + Sub y$$(y As Integer) + Sub y(y As String) +End Interface + +Public MustInherit Class A + Implements I + Public MustOverride Sub y(y As Integer) Implements I.y + Public MustOverride Sub y(y As String) Implements I.y +End Class", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRename() + { + var markup = @" +Imports System + +Public Class [|$$ustom|]Attribute + Inherits Attribute +End Class"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "Custom", VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System + +Public Class Custom$$Attribute + Inherits Attribute +End Class", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRenameWhileRenameClasss() + { + var markup = @" +Imports System + +Public Class [|$$ustom|]Attribute + Inherits Attribute +End Class"; + + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync("Custom", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System + +Public Class Custom$$Attribute + Inherits Attribute +End Class", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRenameWhileRenameAttribute() + { + var markup = @" +Imports System + +<[|$$ustom|]> +Class Bar +End Class + +Public Class [|ustom|]Attribute + Inherits Attribute +End Class"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync("Custom", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System + + +Class Bar +End Class + +Public Class CustomAttribute + Inherits Attribute +End Class", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeRenameWhileRenameAttributeClass() + { + var markup = @" +Imports System + +<[|ustom|]> +Class Bar +End Class + +Public Class [|$$ustom|]Attribute + Inherits Attribute +End Class"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync("Custom", HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System + + +Class Bar +End Class + +Public Class Custom$$Attribute + Inherits Attribute +End Class", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeCapitalizedRename() + { + var markup = @" +Imports System + +Public Class [|$$ustom|]ATTRIBUTE + Inherits Attribute +End Class"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "Custom", VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System + +Public Class CustomAttribute$$ + Inherits Attribute +End Class", HangMitigatingCancellationToken); + } + + [IdeFact, WorkItem("https://github.com/dotnet/roslyn/issues/21657")] + public async Task VerifyAttributeNotCapitalizedRename() + { + var markup = @" +Imports System + +Public Class [|$$ustom|]attribute + Inherits Attribute +End Class"; + await SetUpEditorAsync(markup, HangMitigatingCancellationToken); + await TestServices.InlineRename.InvokeAsync(HangMitigatingCancellationToken); + + MarkupTestFile.GetSpans(markup, out var _, out ImmutableArray renameSpans); + var tags = await TestServices.Editor.GetRenameTagsAsync(HangMitigatingCancellationToken); + var tagSpans = tags.SelectAsArray(tag => new TextSpan(tag.Span.Start, tag.Span.Length)); + AssertEx.SetEqual(renameSpans, tagSpans); + + await TestServices.Input.SendWithoutActivateAsync(new InputKey[] { "Custom", VirtualKeyCode.RETURN }, HangMitigatingCancellationToken); + await TestServices.Workspace.WaitForRenameAsync(HangMitigatingCancellationToken); + try + { + // This is the expected behavior + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System + +Public Class CustomAttribute$$ + Inherits Attribute +End Class", HangMitigatingCancellationToken); + } + catch (XunitException) + { + // But sometimes we get this instead + await TestServices.EditorVerifier.TextEqualsAsync(@" +Imports System + +Public Class CustomA$$ttribute + Inherits Attribute +End Class", HangMitigatingCancellationToken); + } + } + } +} diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs index beed7eb372548..7e35aa086e6da 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs @@ -36,7 +36,6 @@ using Microsoft.VisualStudio.Utilities; using Roslyn.Utilities; using UIAutomationClient; -using ThreadHelper = Microsoft.VisualStudio.Shell.ThreadHelper; namespace Microsoft.VisualStudio.IntegrationTest.Utilities.InProcess { @@ -61,13 +60,6 @@ protected override bool HasActiveTextView() protected override IWpfTextView GetActiveTextView() => GetActiveTextViewHost().TextView; - private static IVsTextView GetActiveVsTextView() - { - var (textView, hr) = TryGetActiveVsTextView(); - Marshal.ThrowExceptionForHR(hr); - return textView; - } - private static (IVsTextView textView, int hr) TryGetActiveVsTextView() { var vsTextManager = GetGlobalService(); @@ -160,17 +152,6 @@ public void SetUseSuggestionMode(bool value) } } - public string GetActiveBufferName() - { - return GetDTE().ActiveDocument.Name; - } - - public void WaitForActiveView(string expectedView) - { - using var cts = new CancellationTokenSource(Helper.HangMitigatingTimeout); - Retry(_ => GetActiveBufferName(), (actual, _) => actual == expectedView, TimeSpan.FromMilliseconds(100), cts.Token); - } - public void Activate() => GetDTE().ActiveDocument.Activate(); @@ -246,16 +227,6 @@ public string GetLineTextAfterCaret() return text[(bufferPosition.Position - line.Start)..]; }); - public string GetSelectedText() - => ExecuteOnActiveView(view => - { - var subjectBuffer = view.GetBufferContainingCaret(); - Contract.ThrowIfNull(subjectBuffer); - - var selectedSpan = view.Selection.SelectedSpans[0]; - return subjectBuffer.CurrentSnapshot.GetText(selectedSpan); - }); - public void MoveCaret(int position) => ExecuteOnActiveView(view => { @@ -278,9 +249,6 @@ public bool IsSignatureHelpActive() return broker.IsSignatureHelpActive(view); }); - public string[] GetErrorTags() - => GetTags(); - public string[] GetHighlightTags() => GetTags(tag => tag.Type == KeywordHighlightTag.TagId); @@ -432,60 +400,11 @@ public void DialogSendKeys(string dialogAutomationName, object[] keys) _sendKeys.Send(keys); } - public void SendKeysToNavigateTo(object[] keys) - { - var dialogAutomationElement = FindNavigateTo(); - if (dialogAutomationElement == null) - { - throw new InvalidOperationException($"Expected the NavigateTo dialog to be open, but it is not."); - } - - dialogAutomationElement.SetFocus(); - _sendKeys.Send(keys); - } - public void PressDialogButton(string dialogAutomationName, string buttonAutomationName) { DialogHelpers.PressButton(GetDTE().MainWindow.HWnd, dialogAutomationName, buttonAutomationName); } - private static IUIAutomationElement FindNavigateTo() - { - var vsAutomationElement = Helper.Automation.ElementFromHandle(GetDTE().MainWindow.HWnd); - return vsAutomationElement.FindDescendantByAutomationId("PART_SearchBox"); - } - - private T Retry(Func action, Func stoppingCondition, TimeSpan delay, CancellationToken cancellationToken) - { - do - { - cancellationToken.ThrowIfCancellationRequested(); - - T retval; - try - { - retval = action(cancellationToken); - } - catch (COMException) - { - // Devenv can throw COMExceptions if it's busy when we make DTE calls. - - Thread.Sleep(delay); - continue; - } - - if (stoppingCondition(retval, cancellationToken)) - { - return retval; - } - else - { - Thread.Sleep(delay); - } - } - while (true); - } - public void AddWinFormButton(string buttonName) { using (var waitHandle = new ManualResetEvent(false)) @@ -658,12 +577,6 @@ void ComponentChanged(object sender, ComponentChangedEventArgs e) return properties[propertyName].GetValue(button) as string; } - public void FormatDocumentViaCommand() - => ExecuteCommand(WellKnownCommandNames.Edit_FormatDocument); - - public void Paste() - => ExecuteCommand(WellKnownCommandNames.Edit_Paste); - public void Undo() => ExecuteCommand(WellKnownCommandNames.Edit_Undo); @@ -713,13 +626,6 @@ public int[] GetTagSpans(string tagId) return matchingTags.Select(t => t.Span.GetSpans(view.TextBuffer).Single().Span.ToTextSpan()).SelectMany(t => new List { t.Start, t.Length }).ToArray(); }); - public void SendExplicitFocus() - => InvokeOnUIThread(cancellationToken => - { - var view = GetActiveVsTextView(); - view.SendExplicitFocus(); - }); - public void WaitForEditorOperations(TimeSpan timeout) { var joinableTaskCollection = InvokeOnUIThread(cancellationToken => diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc_NavigationBar.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc_NavigationBar.cs deleted file mode 100644 index 31ce476ac41c2..0000000000000 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc_NavigationBar.cs +++ /dev/null @@ -1,152 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using Microsoft.CodeAnalysis.UnitTests; -using Microsoft.VisualStudio.Editor; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.VisualStudio.Text.Editor; -using Microsoft.VisualStudio.TextManager.Interop; -using Roslyn.Utilities; -using IObjectWithSite = Microsoft.VisualStudio.OLE.Interop.IObjectWithSite; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - -namespace Microsoft.VisualStudio.IntegrationTest.Utilities.InProcess -{ - internal partial class Editor_InProc - { - public string[] GetNavBarItems(int comboBoxIndex) - => ExecuteOnActiveView(v => - GetNavigationBarComboBoxes(v)[comboBoxIndex] - .Items - .OfType() - .Select(i => i?.ToString() ?? "") - .ToArray()); - - private List GetNavigationBarComboBoxes(IWpfTextView textView) - { - var margin = GetNavbar(textView); - var combos = margin.GetFieldValue>("_combos"); - return combos; - } - - private static UIElement? GetNavbar(IWpfTextView textView) - { - // Visual Studio 2019 - var editorAdaptersFactoryService = GetComponentModelService(); - var viewAdapter = editorAdaptersFactoryService.GetViewAdapter(textView); - Contract.ThrowIfNull(viewAdapter); - - // Make sure we have the top pane - // - // The docs are wrong. When a secondary view exists, it is the secondary view which is on top. The primary - // view is only on top when there is no secondary view. - var codeWindow = TryGetCodeWindow(viewAdapter); - Contract.ThrowIfNull(codeWindow); - - if (ErrorHandler.Succeeded(codeWindow.GetSecondaryView(out var secondaryViewAdapter))) - { - viewAdapter = secondaryViewAdapter; - } - - var textViewHost = editorAdaptersFactoryService.GetWpfTextViewHost(viewAdapter); - Contract.ThrowIfNull(textViewHost); - - var dropDownMargin = textViewHost.GetTextViewMargin("DropDownMargin"); - if (dropDownMargin != null) - { - return ((Decorator)dropDownMargin.VisualElement).Child; - } - - // Visual Studio 2017 - var control = textView.VisualElement; - while (control != null) - { - if (control.GetType().Name == "WpfMultiViewHost") - { - break; - } - - control = VisualTreeHelper.GetParent(control) as FrameworkElement; - } - - var topMarginControl = control.GetPropertyValue("TopMarginControl"); - var vsDropDownBarAdapterMargin = topMarginControl.Content as UIElement; - return vsDropDownBarAdapterMargin; - } - - private static IVsCodeWindow? TryGetCodeWindow(IVsTextView textView) - { - if (textView == null) - { - throw new ArgumentNullException(nameof(textView)); - } - - if (textView is not IObjectWithSite objectWithSite) - { - return null; - } - - var riid = typeof(IOleServiceProvider).GUID; - objectWithSite.GetSite(ref riid, out var ppvSite); - if (ppvSite == IntPtr.Zero) - { - return null; - } - - IOleServiceProvider? oleServiceProvider = null; - try - { - oleServiceProvider = Marshal.GetObjectForIUnknown(ppvSite) as IOleServiceProvider; - } - finally - { - Marshal.Release(ppvSite); - } - - if (oleServiceProvider == null) - { - return null; - } - - var guidService = typeof(SVsWindowFrame).GUID; - riid = typeof(IVsWindowFrame).GUID; - if (ErrorHandler.Failed(oleServiceProvider.QueryService(ref guidService, ref riid, out var ppvObject)) || ppvObject == IntPtr.Zero) - { - return null; - } - - IVsWindowFrame? frame = null; - try - { - frame = (IVsWindowFrame)Marshal.GetObjectForIUnknown(ppvObject); - } - finally - { - Marshal.Release(ppvObject); - } - - riid = typeof(IVsCodeWindow).GUID; - if (ErrorHandler.Failed(frame.QueryViewInterface(ref riid, out ppvObject)) || ppvObject == IntPtr.Zero) - { - return null; - } - - try - { - return Marshal.GetObjectForIUnknown(ppvObject) as IVsCodeWindow; - } - finally - { - Marshal.Release(ppvObject); - } - } - } -} diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/ErrorList_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/ErrorList_InProc.cs index 8da1e026a2591..d566902322ead 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/ErrorList_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/ErrorList_InProc.cs @@ -20,9 +20,6 @@ internal class ErrorList_InProc : InProcComponent public static ErrorList_InProc Create() => new ErrorList_InProc(); - public void ShowErrorList() - => ExecuteCommand("View.ErrorList"); - public void WaitForNoErrorsInErrorList(TimeSpan timeout) { var stopwatch = Stopwatch.StartNew(); diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Shell_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Shell_InProc.cs index a4c01ef4dc64a..d43d22de2dc36 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Shell_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Shell_InProc.cs @@ -12,9 +12,6 @@ internal class Shell_InProc : InProcComponent { public static Shell_InProc Create() => new Shell_InProc(); - public IntPtr GetHWnd() - => GetDTE().MainWindow.HWnd; - public bool IsUIContextActive(Guid context) { return UIContext.FromUIContextGuid(context).IsActive; diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs index 511f23b1a2acc..c502b73db515c 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/SolutionExplorer_InProc.cs @@ -571,45 +571,6 @@ public void AddFile(string projectName, string fileName, string? contents = null } } - /// - /// Adds a new standalone file to the Miscellaneous Files workspace. - /// - /// The name of the file to add. - public void AddStandaloneFile(string fileName) - { - string itemTemplate; - - var extension = Path.GetExtension(fileName).ToLowerInvariant(); - switch (extension) - { - case ".cs": - itemTemplate = @"General\C# Class"; - break; - case ".csx": - itemTemplate = @"Script\Visual C# Script"; - break; - case ".vb": - itemTemplate = @"General\Visual Basic Class"; - break; - case ".txt": - itemTemplate = @"General\Text File"; - break; - default: - throw new NotSupportedException($"File type '{extension}' is not yet supported."); - } - - GetDTE().ItemOperations.NewFile(itemTemplate, fileName); - } - - public void SetFileContents(string projectName, string relativeFilePath, string contents) - { - var project = GetProject(projectName); - var projectPath = Path.GetDirectoryName(project.FullName); - var filePath = Path.Combine(projectPath, relativeFilePath); - - File.WriteAllText(filePath, contents); - } - public string GetFileContents(string projectName, string relativeFilePath) { var project = GetProject(projectName); diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.Verifier.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.Verifier.cs index 8a0288c88c6cf..ebe2b928410f7 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.Verifier.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.Verifier.cs @@ -3,9 +3,6 @@ // See the LICENSE file in the project root for more information. using System; -using Microsoft.CodeAnalysis.Shared.TestHooks; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Common; -using Roslyn.Test.Utilities; using Roslyn.Utilities; using Xunit; @@ -185,20 +182,6 @@ public void Dialog( { _textViewWindow.VerifyDialog(dialogName, isOpen); } - - public void ErrorTags(params string[] expectedTags) - { - _instance.Workspace.WaitForAllAsyncOperations( - Helper.HangMitigatingTimeout, - FeatureAttribute.Workspace, - FeatureAttribute.SolutionCrawlerLegacy, - FeatureAttribute.DiagnosticService, - FeatureAttribute.ErrorSquiggles); - var actualTags = _textViewWindow.GetErrorTags(); - AssertEx.EqualOrDiff( - string.Join(Environment.NewLine, expectedTags), - string.Join(Environment.NewLine, actualTags)); - } } } } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs index e6196ad9f71dc..68699e9e17a92 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs @@ -2,19 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Threading; -using System.Windows; using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.CodeAnalysis.Text; using Microsoft.VisualStudio.IntegrationTest.Utilities.Common; using Microsoft.VisualStudio.IntegrationTest.Utilities.InProcess; using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; -using UIAutomationClient; using Xunit; namespace Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess @@ -55,9 +50,6 @@ public string GetCurrentLineText() public string GetLineTextBeforeCaret() => _editorInProc.GetLineTextBeforeCaret(); - public string GetSelectedText() - => _editorInProc.GetSelectedText(); - public string GetLineTextAfterCaret() => _editorInProc.GetLineTextAfterCaret(); @@ -66,7 +58,7 @@ public void MoveCaret(int position) public ImmutableArray GetTagSpans(string tagId) { - if (tagId == _instance.InlineRenameDialog.ValidRenameTag) + if (tagId == InlineRenameDialog_OutOfProc.ValidRenameTag) { _instance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Rename); } @@ -123,13 +115,6 @@ public Signature GetCurrentSignature() return _editorInProc.GetCurrentSignature(); } - public void InvokeNavigateTo(params object[] keys) - { - _instance.ExecuteCommand(WellKnownCommandNames.Edit_GoToAll); - NavigateToSendKeys(keys); - _instance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.NavigateTo); - } - public void SelectTextInCurrentDocument(string text) { PlaceCaret(text, charsOffset: -1, occurrence: 0, extendSelection: false, selectBlock: false); @@ -140,12 +125,6 @@ public void SelectTextInCurrentDocument(string text) public int GetColumn() => _editorInProc.GetColumn(); - public void DeleteText(string text) - { - SelectTextInCurrentDocument(text); - SendKeys(VirtualKey.Delete); - } - public void ReplaceText(string oldText, string newText) => _editorInProc.ReplaceText(oldText, newText); @@ -187,43 +166,12 @@ public void PressDialogButton(string dialogAutomationName, string buttonAutomati public void DialogSendKeys(string dialogAutomationName, params object[] keys) => _editorInProc.DialogSendKeys(dialogAutomationName, keys); - public void FormatDocument() - { - VisualStudioInstance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Workspace); - SendKeys(new KeyPress(VirtualKey.K, ShiftState.Ctrl), new KeyPress(VirtualKey.D, ShiftState.Ctrl)); - } - - public void FormatDocumentViaCommand() - { - VisualStudioInstance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Workspace); - _editorInProc.FormatDocumentViaCommand(); - } - - public void FormatSelection() - { - VisualStudioInstance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Workspace); - SendKeys(new KeyPress(VirtualKey.K, ShiftState.Ctrl), new KeyPress(VirtualKey.F, ShiftState.Ctrl)); - } - - public void Paste(string text) - { - var thread = new Thread(() => Clipboard.SetText(text)); - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - thread.Join(); - - _editorInProc.Paste(); - } - public void Undo() => _editorInProc.Undo(); public void Redo() => _editorInProc.Redo(); - public void NavigateToSendKeys(params object[] keys) - => _editorInProc.SendKeysToNavigateTo(keys); - public ClassifiedToken[] GetLightbulbPreviewClassification(string menuText) => _editorInProc.GetLightbulbPreviewClassifications(menuText); @@ -233,18 +181,6 @@ public void SetUseSuggestionMode(bool value) _editorInProc.SetUseSuggestionMode(value); } - public void WaitForActiveView(string viewName) - => _editorInProc.WaitForActiveView(viewName); - - public string[] GetErrorTags() - => _editorInProc.GetErrorTags(); - - public string[] GetProjectNavBarItems() - { - _instance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.NavigationBar); - return _editorInProc.GetNavBarItems(0); - } - public TextSpan[] GetKeywordHighlightTags() => Deserialize(_editorInProc.GetHighlightTags()); @@ -267,11 +203,5 @@ private static TextSpan[] Deserialize(string[] v) return TextSpan.FromBounds(int.Parse(start), int.Parse(end)); }).ToArray(); } - - public void SendExplicitFocus() - => _editorInProc.SendExplicitFocus(); - - public void WaitForEditorOperations(TimeSpan timeout) - => _editorInProc.WaitForEditorOperations(timeout); } } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/ErrorList_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/ErrorList_OutOfProc.cs index e8292a4c001f3..862f002814846 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/ErrorList_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/ErrorList_OutOfProc.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.VisualStudio.IntegrationTest.Utilities.InProcess; namespace Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess @@ -22,15 +21,6 @@ public ErrorList_OutOfProc(VisualStudioInstance visualStudioInstance) Verify = new Verifier(this, _instance); } - public void ShowErrorList() - { - _instance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.SolutionCrawlerLegacy); - _instance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.DiagnosticService); - _instance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.ErrorSquiggles); - _instance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.ErrorList); - _inProc.ShowErrorList(); - } - public int GetErrorListErrorCount() => _inProc.GetErrorCount(); } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/InlineRenameDialog_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/InlineRenameDialog_OutOfProc.cs index b46f969088198..11e2fbfb139d8 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/InlineRenameDialog_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/InlineRenameDialog_OutOfProc.cs @@ -3,42 +3,11 @@ // See the LICENSE file in the project root for more information. using Microsoft.CodeAnalysis.Editor.Implementation.InlineRename.HighlightTags; -using Microsoft.CodeAnalysis.Shared.TestHooks; -using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; namespace Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess { - public class InlineRenameDialog_OutOfProc : OutOfProcComponent + public static class InlineRenameDialog_OutOfProc { - public string ValidRenameTag => RenameFieldBackgroundAndBorderTag.TagId; - - public InlineRenameDialog_OutOfProc(VisualStudioInstance visualStudioInstance) - : base(visualStudioInstance) - { - } - - public void Invoke() - { - VisualStudioInstance.ExecuteCommand("Refactor.Rename"); - VisualStudioInstance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Rename); - } - - public void ToggleIncludeComments() - { - VisualStudioInstance.Editor.SendKeys(new KeyPress(VirtualKey.C, ShiftState.Alt)); - VisualStudioInstance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Rename); - } - - public void ToggleIncludeStrings() - { - VisualStudioInstance.Editor.SendKeys(new KeyPress(VirtualKey.S, ShiftState.Alt)); - VisualStudioInstance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Rename); - } - - public void ToggleIncludeOverloads() - { - VisualStudioInstance.Editor.SendKeys(new KeyPress(VirtualKey.O, ShiftState.Alt)); - VisualStudioInstance.Workspace.WaitForAsyncOperations(Helper.HangMitigatingTimeout, FeatureAttribute.Rename); - } + public static string ValidRenameTag => RenameFieldBackgroundAndBorderTag.TagId; } } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Shell_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Shell_OutOfProc.cs index 9f0f2461a23ce..f055c1ab3b06f 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Shell_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Shell_OutOfProc.cs @@ -17,9 +17,6 @@ public Shell_OutOfProc(VisualStudioInstance visualStudioInstance) _inProc = CreateInProcComponent(visualStudioInstance); } - public IntPtr GetHWnd() - => _inProc.GetHWnd(); - public bool IsUIContextActive(Guid context) => _inProc.IsUIContextActive(context); } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs index 7fc409efed678..510ff14f99142 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/SolutionExplorer_OutOfProc.cs @@ -21,9 +21,6 @@ public SolutionExplorer_OutOfProc(VisualStudioInstance visualStudioInstance) _inProc = CreateInProcComponent(visualStudioInstance); } - public string DirectoryName - => _inProc.DirectoryName; - public void CloseSolution(bool saveFirst = false) => _inProc.CloseSolution(saveFirst); @@ -33,9 +30,6 @@ public void CloseSolution(bool saveFirst = false) public void CreateSolution(string solutionName, bool saveExistingSolutionIfExists = false) => _inProc.CreateSolution(solutionName, saveExistingSolutionIfExists); - public void CreateSolution(string solutionName, XElement solutionElement) - => _inProc.CreateSolution(solutionName, solutionElement.ToString()); - public void AddProject(ProjectUtils.Project projectName, string projectTemplate, string languageName) { _inProc.AddProject(projectName.Name, projectTemplate, languageName); @@ -60,9 +54,6 @@ public void CleanUpOpenSolution() public void AddFile(ProjectUtils.Project project, string fileName, string? contents = null, bool open = false) => _inProc.AddFile(project.Name, fileName, contents, open); - public void SetFileContents(ProjectUtils.Project project, string fileName, string contents) - => _inProc.SetFileContents(project.Name, fileName, contents); - public string GetFileContents(ProjectUtils.Project project, string fileName) => _inProc.GetFileContents(project.Name, fileName); @@ -113,8 +104,5 @@ public void SelectItem(string itemName) /// public void SelectItemAtPath(params string[] path) => _inProc.SelectItemAtPath(path); - - public void AddStandaloneFile(string fileName) - => _inProc.AddStandaloneFile(fileName); } } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs index f5d7ac92ddceb..7e0478bfa7af7 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/VisualStudioWorkspace_OutOfProc.cs @@ -55,12 +55,6 @@ public void SetEnableDecompilationOption(bool value) SetGlobalOption(WellKnownGlobalOption.MetadataAsSourceOptions_NavigateToDecompiledSources, language: null, value); } - public void SetArgumentCompletionSnippetsOption(bool value) - { - SetGlobalOption(WellKnownGlobalOption.CompletionViewOptions_EnableArgumentCompletionSnippets, LanguageNames.CSharp, value); - SetGlobalOption(WellKnownGlobalOption.CompletionViewOptions_EnableArgumentCompletionSnippets, LanguageNames.VisualBasic, value); - } - public void SetTriggerCompletionInArgumentLists(bool value) => SetGlobalOption(WellKnownGlobalOption.CompletionOptions_TriggerInArgumentLists, LanguageNames.CSharp, value); diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstance.cs b/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstance.cs index 6bb5f942181ec..bb85b8ebcc47a 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstance.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/VisualStudioInstance.cs @@ -52,8 +52,6 @@ public class VisualStudioInstance public ImmediateWindow_OutOfProc ImmediateWindow { get; } - public InlineRenameDialog_OutOfProc InlineRenameDialog { get; set; } - public LocalsWindow_OutOfProc LocalsWindow { get; set; } public MoveToNamespaceDialog_OutOfProc MoveToNamespaceDialog { get; } public PickMembersDialog_OutOfProc PickMembersDialog { get; set; } @@ -131,7 +129,6 @@ public VisualStudioInstance(Process hostProcess, DTE dte, ImmutableHashSet CompletionOptionsStorage.ShowItemsFromUnimportedNamespaces, WellKnownGlobalOption.CompletionOptions_TriggerInArgumentLists => CompletionOptionsStorage.TriggerInArgumentLists, - WellKnownGlobalOption.CompletionViewOptions_EnableArgumentCompletionSnippets => CompletionViewOptionsStorage.EnableArgumentCompletionSnippets, - WellKnownGlobalOption.InlineRenameSessionOptions_RenameInComments => InlineRenameSessionOptionsStorage.RenameInComments, - WellKnownGlobalOption.InlineRenameSessionOptions_RenameInStrings => InlineRenameSessionOptionsStorage.RenameInStrings, - WellKnownGlobalOption.InlineRenameSessionOptions_RenameOverloads => InlineRenameSessionOptionsStorage.RenameOverloads, - WellKnownGlobalOption.InlineRenameSessionOptions_RenameFile => InlineRenameSessionOptionsStorage.RenameFile, - WellKnownGlobalOption.InlineRenameSessionOptions_PreviewChanges => InlineRenameSessionOptionsStorage.PreviewChanges, WellKnownGlobalOption.MetadataAsSourceOptions_NavigateToDecompiledSources => MetadataAsSourceOptionsStorage.NavigateToDecompiledSources, - WellKnownGlobalOption.WorkspaceConfigurationOptions_EnableOpeningSourceGeneratedFilesInWorkspace => WorkspaceConfigurationOptionsStorage.EnableOpeningSourceGeneratedFilesInWorkspace, - WellKnownGlobalOption.SolutionCrawlerOptions_BackgroundAnalysisScopeOption => SolutionCrawlerOptionsStorage.BackgroundAnalysisScopeOption, - WellKnownGlobalOption.SolutionCrawlerOptions_CompilerDiagnosticsScopeOption => SolutionCrawlerOptionsStorage.CompilerDiagnosticsScopeOption, - WellKnownGlobalOption.InlineRenameSessionOptions_UseNewUI => InlineRenameUIOptionsStorage.UseInlineAdornment, _ => throw ExceptionUtilities.Unreachable() };