diff --git a/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj b/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj index 8b076dbba59f1724bf7438d489b310a4c004a65f..90108038b7d6e1d750bba9f32cf8e7f9ef56d188 100644 --- a/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj +++ b/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj @@ -201,9 +201,9 @@ - - - + + + diff --git a/src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersTests.cs b/src/EditorFeatures/CSharpTest/GenerateFromMembers/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersTests.cs similarity index 88% rename from src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersTests.cs rename to src/EditorFeatures/CSharpTest/GenerateFromMembers/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersTests.cs index 3172c1ae58dea142e68d614002a1dda0fdf47dbe..ae94b81d0d5cb3ed5da13690b198953407257474 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersTests.cs +++ b/src/EditorFeatures/CSharpTest/GenerateFromMembers/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersTests.cs @@ -1,22 +1,21 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; +using Microsoft.CodeAnalysis.AddConstructorParametersFromMembers; using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.AddConstructorParameters; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; +using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings; using Roslyn.Test.Utilities; using Xunit; -namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings.GenerateFromMembers.AddConstructorParameters +namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.GenerateFromMembers.AddConstructorParameters { - public class AddConstructorParametersTests : AbstractCSharpCodeActionTest + public class AddConstructorParametersFromMembersTests : AbstractCSharpCodeActionTest { protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspace workspace) - { - return new AddConstructorParametersCodeRefactoringProvider(); - } + => new AddConstructorParametersFromMembersCodeRefactoringProvider(); - [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestAdd1() { await TestAsync( @@ -48,7 +47,7 @@ public Program(int i, string s) index: 0); } - [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestAddOptional1() { await TestAsync( @@ -80,7 +79,7 @@ public Program(int i, string s = null) index: 1); } - [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestAddToConstructorWithMostMatchingParameters1() { await TestAsync( @@ -124,7 +123,7 @@ public Program(int i, string s, bool b) : this(i) index: 0); } - [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, WorkItem(308077, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/308077"), Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestAddOptionalToConstructorWithMostMatchingParameters1() { await TestAsync( @@ -168,7 +167,7 @@ public Program(int i, string s, bool b = default(bool)) : this(i) index: 1); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestSmartTagDisplayText1() { await TestSmartTagTextAsync( @@ -188,7 +187,7 @@ public Program(bool b) index: 0); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestSmartTagDisplayText2() { await TestSmartTagTextAsync( @@ -208,7 +207,7 @@ public Program(bool b) index: 1); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTuple() { await TestAsync( @@ -236,7 +235,7 @@ public Program((int, string) i, (string, int) s) index: 0, parseOptions: TestOptions.Regular, withScriptOption: true); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTupleWithNames() { await TestAsync( @@ -264,7 +263,7 @@ public Program((int a, string b) i, (string c, int d) s) index: 0, parseOptions: TestOptions.Regular, withScriptOption: true); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTupleWithDifferentNames() { await TestMissingAsync( @@ -281,7 +280,7 @@ public Program((int e, string f) i) parseOptions: TestOptions.Regular, withScriptOption: true); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTupleOptional() { await TestAsync( @@ -309,7 +308,7 @@ public Program((int, string) i, (string, int) s = default((string, int))) index: 1, parseOptions: TestOptions.Regular, withScriptOption: true); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTupleOptionalWithNames() { await TestAsync( @@ -337,7 +336,7 @@ public Program((int a, string b) i, (string c, int d) s = default((string c, int index: 1, parseOptions: TestOptions.Regular, withScriptOption: true); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTupleOptionalWithDifferentNames() { await TestMissingAsync( @@ -354,7 +353,7 @@ public Program((int e, string f) i) parseOptions: TestOptions.Regular, withScriptOption: true); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTupleWithNullable() { await TestAsync( @@ -382,7 +381,7 @@ public Program((int?, bool?) i, (byte?, long?) s) index: 0, parseOptions: TestOptions.Regular, withScriptOption: true); } - [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParameters)] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsAddConstructorParametersFromMembers)] public async Task TestTupleWithGenericss() { await TestAsync( diff --git a/src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.cs b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.cs similarity index 97% rename from src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.cs rename to src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.cs index b7282f9cf72a8d0bdf2796285ef7d14c60190d71..73391bb0e2e7d9058308eb14ae928cd54454fc8c 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.cs +++ b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.cs @@ -2,21 +2,20 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.GenerateConstructorFromMembers; using Microsoft.CodeAnalysis.CodeStyle; using Microsoft.CodeAnalysis.CSharp.CodeStyle; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; +using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings; +using Microsoft.CodeAnalysis.GenerateConstructorFromMembers; using Roslyn.Test.Utilities; using Xunit; -namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings.GenerateFromMembers.GenerateConstructorFromMembers +namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.GenerateConstructorFromMembers { public class GenerateConstructorFromMembersTests : AbstractCSharpCodeActionTest { protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspace workspace) - { - return new GenerateConstructorFromMembersCodeRefactoringProvider(); - } + => new GenerateConstructorFromMembersCodeRefactoringProvider(); [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateConstructorFromMembers)] public async Task TestSingleField() diff --git a/src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.cs b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.cs similarity index 97% rename from src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.cs rename to src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.cs index 8f85b4055887898ca091ff1b1572632404842273..7d7f0e0dfefe53856df14c9965b74e29358dc85a 100644 --- a/src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.cs +++ b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.cs @@ -2,21 +2,20 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeRefactorings; -using Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.GenerateEqualsAndGetHashCode; +using Microsoft.CodeAnalysis.GenerateEqualsAndGetHashCodeFromMembers; using Microsoft.CodeAnalysis.CodeStyle; using Microsoft.CodeAnalysis.CSharp.CodeStyle; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; +using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings; using Roslyn.Test.Utilities; using Xunit; -namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings.GenerateFromMembers.GenerateEqualsAndGetHashCode +namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.GenerateEqualsAndGetHashCodeFromMembers { public class GenerateEqualsAndGetHashCodeTests : AbstractCSharpCodeActionTest { protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspace workspace) - { - return new GenerateEqualsAndGetHashCodeCodeRefactoringProvider(); - } + => new GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider(); [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] public async Task TestEqualsSingleField() diff --git a/src/EditorFeatures/Core/Shared/Tagging/EventSources/TaggerEventSources.SemanticChangedEventSource.cs b/src/EditorFeatures/Core/Shared/Tagging/EventSources/TaggerEventSources.SemanticChangedEventSource.cs index bde54c756fe3a5ba70e00322a0158089a259a745..8c99e9cb77f74d90b520e0273656ee467a8d1fe8 100644 --- a/src/EditorFeatures/Core/Shared/Tagging/EventSources/TaggerEventSources.SemanticChangedEventSource.cs +++ b/src/EditorFeatures/Core/Shared/Tagging/EventSources/TaggerEventSources.SemanticChangedEventSource.cs @@ -48,7 +48,10 @@ private void OnSubjectBufferChanged(object sender, TextContentChangedEventArgs e { // Whenever this subject buffer has changed, we always consider that to be a // semantic change. - this.RaiseChanged(); + if (e.Changes.Any()) + { + RaiseChanged(); + } } private void OnOpenedDocumentSemanticChanged(object sender, Document document) diff --git a/src/EditorFeatures/Test2/Diagnostics/GenerateFromUsage/GenerateConstructorCrossLanguageTests.vb b/src/EditorFeatures/Test2/Diagnostics/GenerateFromUsage/GenerateConstructorCrossLanguageTests.vb index e80bf95ace6429b073317ab8d468d9fbc5fc2525..7604dc58d3e94dca24360b34591e3590431a5ed1 100644 --- a/src/EditorFeatures/Test2/Diagnostics/GenerateFromUsage/GenerateConstructorCrossLanguageTests.vb +++ b/src/EditorFeatures/Test2/Diagnostics/GenerateFromUsage/GenerateConstructorCrossLanguageTests.vb @@ -11,11 +11,11 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.Diagnostics.GenerateConstructo If language = LanguageNames.CSharp Then Return Tuple.Create(Of DiagnosticAnalyzer, CodeFixProvider)( Nothing, - New Microsoft.CodeAnalysis.CSharp.CodeFixes.GenerateConstructor.GenerateConstructorCodeFixProvider()) + New CodeAnalysis.CSharp.GenerateConstructor.GenerateConstructorCodeFixProvider()) Else Return Tuple.Create(Of DiagnosticAnalyzer, CodeFixProvider)( Nothing, - New Microsoft.CodeAnalysis.VisualBasic.CodeFixes.GenerateConstructor.GenerateConstructorCodeFixProvider()) + New CodeAnalysis.VisualBasic.GenerateConstructor.GenerateConstructorCodeFixProvider()) End If End Function diff --git a/src/EditorFeatures/TestUtilities/Traits.cs b/src/EditorFeatures/TestUtilities/Traits.cs index 846871d5b51828df46a12dfa4b29c80682bfe4cd..85443c5db1489d1546d58a6481d7b243ec4b2ec1 100644 --- a/src/EditorFeatures/TestUtilities/Traits.cs +++ b/src/EditorFeatures/TestUtilities/Traits.cs @@ -27,7 +27,7 @@ public static class Features public const string ChangeSignature = nameof(ChangeSignature); public const string Classification = nameof(Classification); public const string ClassView = nameof(ClassView); - public const string CodeActionsAddConstructorParameters = "CodeActions.AddConstructorParameters"; + public const string CodeActionsAddConstructorParametersFromMembers = "CodeActions.AddConstructorParametersFromMembers"; public const string CodeActionsAddDocCommentNodes = "CodeActions.AddDocCommentParamNodes"; public const string CodeActionsAddAsync = "CodeActions.AddAsync"; public const string CodeActionsAddAwait = "CodeActions.AddAwait"; @@ -51,7 +51,7 @@ public static class Features public const string CodeActionsGenerateEndConstruct = "CodeActions.GenerateEndConstruct"; public const string CodeActionsGenerateEnumMember = "CodeActions.GenerateEnumMember"; public const string CodeActionsGenerateEvent = "CodeActions.GenerateEvent"; - public const string CodeActionsGenerateEqualsAndGetHashCode = "CodeActions.GenerateEqualsAndGetHashCode"; + public const string CodeActionsGenerateEqualsAndGetHashCode = "CodeActions.GenerateEqualsAndGetHashCodeFromMembers"; public const string CodeActionsGenerateVariable = "CodeActions.GenerateVariable"; public const string CodeActionsGenerateMethod = "CodeActions.GenerateMethod"; public const string CodeActionsGenerateType = "CodeActions.GenerateType"; diff --git a/src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersTests.vb b/src/EditorFeatures/VisualBasicTest/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersTests.vb similarity index 86% rename from src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersTests.vb rename to src/EditorFeatures/VisualBasicTest/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersTests.vb index bb45c8e66a2cfd88e3ac281a6683265d632316fc..7c03523ded6f35a60d73907eea06402cd1458745 100644 --- a/src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersTests.vb +++ b/src/EditorFeatures/VisualBasicTest/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersTests.vb @@ -1,18 +1,19 @@ ' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +Imports Microsoft.CodeAnalysis.AddConstructorParametersFromMembers Imports Microsoft.CodeAnalysis.CodeRefactorings -Imports Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.AddConstructorParameters +Imports Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings -Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings.GenerateConstructorFromMembers - Public Class AddConstructorParameterTests +Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.AddConstructorParametersFromMembers + Public Class AddConstructorParameterFromMembersTests Inherits AbstractVisualBasicCodeActionTest Protected Overrides Function CreateCodeRefactoringProvider(workspace As Workspace) As CodeRefactoringProvider - Return New AddConstructorParametersCodeRefactoringProvider() + Return New AddConstructorParametersFromMembersCodeRefactoringProvider() End Function - + Public Async Function TestAdd1() As Task Await TestAsync( "Class Program @@ -33,7 +34,7 @@ End Class") End Function - + Public Async Function TestAddOptional1() As Task Await TestAsync( "Class Program @@ -55,7 +56,7 @@ index:=1) End Function - + Public Async Function TestAddToConstructorWithMostMatchingParameters1() As Task Await TestAsync( "Class Program @@ -86,7 +87,7 @@ End Class") End Function - + Public Async Function TestAddOptionalToConstructorWithMostMatchingParameters1() As Task Await TestAsync( "Class Program diff --git a/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj b/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj index 4fa593956c2ab37c34e621761eb545f6032100f1..0fa496015b9b4d334a400daee5ce58220ca54509 100644 --- a/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj +++ b/src/EditorFeatures/VisualBasicTest/BasicEditorServicesTest.vbproj @@ -187,9 +187,9 @@ - - - + + + @@ -695,4 +695,4 @@ - + \ No newline at end of file diff --git a/src/EditorFeatures/VisualBasicTest/Diagnostics/GenerateConstructor/GenerateConstructorTests.vb b/src/EditorFeatures/VisualBasicTest/Diagnostics/GenerateConstructor/GenerateConstructorTests.vb index d1613f89b42d4b1c0fa48a3807942cf880a6ce6a..1d62b3e3d41ad8320c8041db13d30a3de8d08a37 100644 --- a/src/EditorFeatures/VisualBasicTest/Diagnostics/GenerateConstructor/GenerateConstructorTests.vb +++ b/src/EditorFeatures/VisualBasicTest/Diagnostics/GenerateConstructor/GenerateConstructorTests.vb @@ -2,8 +2,8 @@ Imports Microsoft.CodeAnalysis.CodeFixes Imports Microsoft.CodeAnalysis.Diagnostics -Imports Microsoft.CodeAnalysis.VisualBasic.CodeFixes.GenerateConstructor Imports Microsoft.CodeAnalysis.VisualBasic.Diagnostics +Imports Microsoft.CodeAnalysis.VisualBasic.GenerateConstructor Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.GenerateConstructor Public Class GenerateConstructorTests diff --git a/src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.vb b/src/EditorFeatures/VisualBasicTest/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.vb similarity index 96% rename from src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.vb rename to src/EditorFeatures/VisualBasicTest/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.vb index 02a135947969814db228a67396951b4c86274a35..77579cf8fb95464030e86fdcab3c3557cc583bc4 100644 --- a/src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.vb +++ b/src/EditorFeatures/VisualBasicTest/GenerateConstructorFromMembers/GenerateConstructorFromMembersTests.vb @@ -1,9 +1,10 @@ ' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. Imports Microsoft.CodeAnalysis.CodeRefactorings -Imports Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.GenerateConstructorFromMembers +Imports Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings +Imports Microsoft.CodeAnalysis.GenerateConstructorFromMembers -Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings.GenerateConstructorFromMembers +Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.GenerateConstructorFromMembers Public Class GenerateConstructorFromMembersTests Inherits AbstractVisualBasicCodeActionTest diff --git a/src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.vb b/src/EditorFeatures/VisualBasicTest/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.vb similarity index 88% rename from src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.vb rename to src/EditorFeatures/VisualBasicTest/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.vb index 5942cd25d0699c59d9a41867afed16c77ac4405a..25385d287aea80f6e9cd8490056cdad0ce427632 100644 --- a/src/EditorFeatures/VisualBasicTest/CodeActions/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeTests.vb +++ b/src/EditorFeatures/VisualBasicTest/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.vb @@ -1,14 +1,15 @@ ' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. Imports Microsoft.CodeAnalysis.CodeRefactorings -Imports Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.GenerateEqualsAndGetHashCode +Imports Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings +Imports Microsoft.CodeAnalysis.GenerateEqualsAndGetHashCodeFromMembers -Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings.GenerateConstructorFromMembers - Public Class GenerateEqualsAndGetHashCodeTests +Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.GenerateConstructorFromMembers + Public Class GenerateEqualsAndGetHashCodeFromMembersTests Inherits AbstractVisualBasicCodeActionTest Protected Overrides Function CreateCodeRefactoringProvider(workspace As Workspace) As CodeRefactoringProvider - Return New GenerateEqualsAndGetHashCodeCodeRefactoringProvider() + Return New GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider() End Function diff --git a/src/Features/CSharp/Portable/CSharpFeatures.csproj b/src/Features/CSharp/Portable/CSharpFeatures.csproj index 085d48a70432e7ad9e19041de76703371922acf6..f89a2f7919a7ef6f294e5c85c15e04619315c767 100644 --- a/src/Features/CSharp/Portable/CSharpFeatures.csproj +++ b/src/Features/CSharp/Portable/CSharpFeatures.csproj @@ -71,6 +71,7 @@ True CSharpFeaturesResources.resx + @@ -335,10 +336,6 @@ - - - - diff --git a/src/Features/CSharp/Portable/GenerateFromMembers/AddConstructorParameters/CSharpAddConstructorParametersService.cs b/src/Features/CSharp/Portable/GenerateFromMembers/AddConstructorParameters/CSharpAddConstructorParametersService.cs deleted file mode 100644 index 00b25402900afe990d5978e6d5443c7cb08c08d7..0000000000000000000000000000000000000000 --- a/src/Features/CSharp/Portable/GenerateFromMembers/AddConstructorParameters/CSharpAddConstructorParametersService.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Composition; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.GenerateFromMembers.AddConstructorParameters; -using Microsoft.CodeAnalysis.Host.Mef; -using Microsoft.CodeAnalysis.Text; -using Roslyn.Utilities; - -namespace Microsoft.CodeAnalysis.CSharp.GenerateFromMembers.AddConstructorParameters -{ - [ExportLanguageService(typeof(IAddConstructorParametersService), LanguageNames.CSharp), Shared] - internal class CSharpAddConstructorParametersService : - AbstractAddConstructorParametersService - { - protected override async Task> GetSelectedMembersAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken) - { - if (cancellationToken.IsCancellationRequested) - { - return SpecializedCollections.EmptyList(); - } - else - { - return await GenerateFromMembersHelpers.GetSelectedMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - } - } - - protected override IEnumerable GetDeclaredSymbols(SemanticModel semanticModel, MemberDeclarationSyntax memberDeclaration, CancellationToken cancellationToken) - { - return GenerateFromMembersHelpers.GetDeclaredSymbols(semanticModel, memberDeclaration, cancellationToken); - } - } -} diff --git a/src/Features/CSharp/Portable/GenerateFromMembers/GenerateConstructorFromMembers/CSharpGenerateConstructorFromMembersService.cs b/src/Features/CSharp/Portable/GenerateFromMembers/GenerateConstructorFromMembers/CSharpGenerateConstructorFromMembersService.cs deleted file mode 100644 index f2effc950bf71b60e77d6c99178a38df8353c9fa..0000000000000000000000000000000000000000 --- a/src/Features/CSharp/Portable/GenerateFromMembers/GenerateConstructorFromMembers/CSharpGenerateConstructorFromMembersService.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Composition; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers; -using Microsoft.CodeAnalysis.Host.Mef; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.CodeAnalysis.CSharp.GenerateFromMembers.GenerateConstructorFromMembers -{ - [ExportLanguageService(typeof(IGenerateConstructorFromMembersService), LanguageNames.CSharp), Shared] - internal class CSharpGenerateConstructorFromMembersService : - AbstractGenerateConstructorFromMembersService - { - protected override Task> GetSelectedMembersAsync( - Document document, TextSpan textSpan, CancellationToken cancellationToken) - { - return GenerateFromMembersHelpers.GetSelectedMembersAsync(document, textSpan, cancellationToken); - } - - protected override IEnumerable GetDeclaredSymbols( - SemanticModel semanticModel, MemberDeclarationSyntax memberDeclaration, CancellationToken cancellationToken) - { - return GenerateFromMembersHelpers.GetDeclaredSymbols(semanticModel, memberDeclaration, cancellationToken); - } - } -} diff --git a/src/Features/CSharp/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/CSharpGenerateEqualsAndGetHashCodeService.cs b/src/Features/CSharp/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/CSharpGenerateEqualsAndGetHashCodeService.cs deleted file mode 100644 index 790f79e632861ed78038b195da2e5b42aabb9db1..0000000000000000000000000000000000000000 --- a/src/Features/CSharp/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/CSharpGenerateEqualsAndGetHashCodeService.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Composition; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.GenerateFromMembers.GenerateEqualsAndGetHashCode; -using Microsoft.CodeAnalysis.Host.Mef; -using Microsoft.CodeAnalysis.Text; -using Roslyn.Utilities; - -namespace Microsoft.CodeAnalysis.CSharp.GenerateFromMembers.GenerateEqualsAndGetHashCode -{ - [ExportLanguageService(typeof(IGenerateEqualsAndGetHashCodeService), LanguageNames.CSharp), Shared] - internal class CSharpGenerateEqualsAndGetHashCodeService : - AbstractGenerateEqualsAndGetHashCodeService - { - protected override async Task> GetSelectedMembersAsync( - Document document, TextSpan textSpan, CancellationToken cancellationToken) - { - if (cancellationToken.IsCancellationRequested) - { - return SpecializedCollections.EmptyList(); - } - else - { - return await GenerateFromMembersHelpers.GetSelectedMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - } - } - - protected override IEnumerable GetDeclaredSymbols( - SemanticModel semanticModel, MemberDeclarationSyntax memberDeclaration, CancellationToken cancellationToken) - { - return GenerateFromMembersHelpers.GetDeclaredSymbols(semanticModel, memberDeclaration, cancellationToken); - } - } -} diff --git a/src/Features/CSharp/Portable/GenerateFromMembers/GenerateFromMembersHelpers.cs b/src/Features/CSharp/Portable/GenerateFromMembers/GenerateFromMembersHelpers.cs index 4bf7704fc2255716fe176b560e282c0ac8c14b1e..897e37b29d1b4e4fd99e5f3f159f63f0b94c3a1b 100644 --- a/src/Features/CSharp/Portable/GenerateFromMembers/GenerateFromMembersHelpers.cs +++ b/src/Features/CSharp/Portable/GenerateFromMembers/GenerateFromMembersHelpers.cs @@ -1,30 +1,35 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using System.Collections.Immutable; +using System.Composition; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.GenerateFromMembers; +using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Text; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.GenerateFromMembers { - internal static class GenerateFromMembersHelpers + [ExportLanguageService(typeof(IGenerateFromMembersHelperService), LanguageNames.CSharp), Shared] + internal class CSharpGenerateFromMembersHelpersService : IGenerateFromMembersHelperService { - internal static async Task> GetSelectedMembersAsync( + public async Task> GetSelectedMembersAsync( Document document, TextSpan textSpan, CancellationToken cancellationToken) { var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false); - return tree.GetMembersInSpan(textSpan, cancellationToken); + return ImmutableArray.CastUp(tree.GetMembersInSpan(textSpan, cancellationToken)); } - internal static IEnumerable GetDeclaredSymbols(SemanticModel semanticModel, MemberDeclarationSyntax memberDeclaration, CancellationToken cancellationToken) + public IEnumerable GetDeclaredSymbols(SemanticModel semanticModel, SyntaxNode memberDeclaration, CancellationToken cancellationToken) { - if (memberDeclaration is FieldDeclarationSyntax) + if (memberDeclaration is FieldDeclarationSyntax field) { - return ((FieldDeclarationSyntax)memberDeclaration).Declaration.Variables.Select( + return field.Declaration.Variables.Select( v => semanticModel.GetDeclaredSymbol(v, cancellationToken)); } @@ -32,4 +37,4 @@ internal static IEnumerable GetDeclaredSymbols(SemanticModel semanticMo semanticModel.GetDeclaredSymbol(memberDeclaration, cancellationToken)); } } -} +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.CodeAction.cs b/src/Features/Core/Portable/AddConstructorParametersFromMembers/AddConstructorParametersCodeAction.cs similarity index 91% rename from src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.CodeAction.cs rename to src/Features/Core/Portable/AddConstructorParametersFromMembers/AddConstructorParametersCodeAction.cs index 2137299ec55d2743b096a106297804c07fab3d80..6132394cb35f628da7b734ff98124f4730454780 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.CodeAction.cs +++ b/src/Features/Core/Portable/AddConstructorParametersFromMembers/AddConstructorParametersCodeAction.cs @@ -12,19 +12,19 @@ using Microsoft.CodeAnalysis.Shared.Extensions; using Roslyn.Utilities; -namespace Microsoft.CodeAnalysis.GenerateFromMembers.AddConstructorParameters +namespace Microsoft.CodeAnalysis.AddConstructorParametersFromMembers { - internal abstract partial class AbstractAddConstructorParametersService + internal partial class AddConstructorParametersFromMembersCodeRefactoringProvider { private class AddConstructorParametersCodeAction : CodeAction { - private readonly TService _service; + private readonly AddConstructorParametersFromMembersCodeRefactoringProvider _service; private readonly Document _document; private readonly State _state; private readonly IList _parameters; public AddConstructorParametersCodeAction( - TService service, + AddConstructorParametersFromMembersCodeRefactoringProvider service, Document document, State state, IList parameters) diff --git a/src/Features/Core/Portable/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersCodeRefactoringProvider.cs b/src/Features/Core/Portable/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersCodeRefactoringProvider.cs new file mode 100644 index 0000000000000000000000000000000000000000..68384a6bc592e47451cd9cb96f840ff3eabb352c --- /dev/null +++ b/src/Features/Core/Portable/AddConstructorParametersFromMembers/AddConstructorParametersFromMembersCodeRefactoringProvider.cs @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Composition; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeGeneration; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.GenerateFromMembers; +using Microsoft.CodeAnalysis.Internal.Log; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.AddConstructorParametersFromMembers +{ + [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, + Name = PredefinedCodeRefactoringProviderNames.AddConstructorParametersFromMembers), Shared] + [ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.GenerateConstructorFromMembers)] + internal partial class AddConstructorParametersFromMembersCodeRefactoringProvider : AbstractGenerateFromMembersCodeRefactoringProvider + { + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) + { + var document = context.Document; + var textSpan = context.Span; + var cancellationToken = context.CancellationToken; + + if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) + { + return; + } + + var actions = await this.AddConstructorParametersFromMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); + if (!actions.IsDefault) + { + context.RegisterRefactorings(actions); + } + } + + public async Task> AddConstructorParametersFromMembersAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken) + { + using (Logger.LogBlock(FunctionId.Refactoring_GenerateFromMembers_AddConstructorParametersFromMembers, cancellationToken)) + { + var info = await this.GetSelectedMemberInfoAsync(document, textSpan, cancellationToken).ConfigureAwait(false); + if (info != null) + { + var state = State.Generate(this, document, textSpan, info.SelectedMembers, cancellationToken); + if (state != null) + { + return CreateCodeActions(document, state).AsImmutableOrNull(); + } + } + + return default(ImmutableArray); + } + } + + private IEnumerable CreateCodeActions(Document document, State state) + { + var lastParameter = state.DelegatedConstructor.Parameters.Last(); + if (!lastParameter.IsOptional) + { + yield return new AddConstructorParametersCodeAction(this, document, state, state.Parameters); + } + + var parameters = state.Parameters.Select(p => CodeGenerationSymbolFactory.CreateParameterSymbol( + attributes: null, + refKind: p.RefKind, + isParams: p.IsParams, + type: p.Type, + name: p.Name, + isOptional: true, + hasDefaultValue: true)).ToList(); + + yield return new AddConstructorParametersCodeAction(this, document, state, parameters); + } + } +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.State.cs b/src/Features/Core/Portable/AddConstructorParametersFromMembers/State.cs similarity index 88% rename from src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.State.cs rename to src/Features/Core/Portable/AddConstructorParametersFromMembers/State.cs index d212bafe61fdc8b71aee375fabe21aa9dbe485bc..6da11a19d4ae8e7335af30d9eea59943cffa5795 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.State.cs +++ b/src/Features/Core/Portable/AddConstructorParametersFromMembers/State.cs @@ -6,9 +6,9 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; -namespace Microsoft.CodeAnalysis.GenerateFromMembers.AddConstructorParameters +namespace Microsoft.CodeAnalysis.AddConstructorParametersFromMembers { - internal abstract partial class AbstractAddConstructorParametersService + internal partial class AddConstructorParametersFromMembersCodeRefactoringProvider { private class State { @@ -19,7 +19,7 @@ private class State public List Parameters { get; private set; } public static State Generate( - TService service, + AddConstructorParametersFromMembersCodeRefactoringProvider service, Document document, TextSpan textSpan, IList selectedMembers, @@ -35,7 +35,7 @@ private class State } private bool TryInitialize( - TService service, + AddConstructorParametersFromMembersCodeRefactoringProvider service, Document document, TextSpan textSpan, IList selectedMembers, diff --git a/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersCodeRefactoringProvider.cs b/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersCodeRefactoringProvider.cs deleted file mode 100644 index f96b757a0e4e1437770d3eca2b1e8e67c77c79fc..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/AddConstructorParameters/AddConstructorParametersCodeRefactoringProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Composition; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.GenerateFromMembers.AddConstructorParameters; -using Microsoft.CodeAnalysis.Shared.Extensions; - -namespace Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.AddConstructorParameters -{ - [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, - Name = PredefinedCodeRefactoringProviderNames.AddConstructorParametersFromMembers), Shared] - [ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.GenerateConstructorFromMembers)] - internal class AddConstructorParametersCodeRefactoringProvider : CodeRefactoringProvider - { - public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) - { - var document = context.Document; - var textSpan = context.Span; - var cancellationToken = context.CancellationToken; - - if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) - { - return; - } - - var service = document.GetLanguageService(); - var actions = await service.AddConstructorParametersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - if (!actions.IsDefault) - { - context.RegisterRefactorings(actions); - } - } - } -} \ No newline at end of file diff --git a/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs b/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs deleted file mode 100644 index 7c829d833aa1636c6ddd738d226c549747b30b98..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Composition; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers; -using Microsoft.CodeAnalysis.Shared.Extensions; - -namespace Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.GenerateConstructorFromMembers -{ - [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, - Name = PredefinedCodeRefactoringProviderNames.GenerateConstructorFromMembers), Shared] - [ExtensionOrder(Before = PredefinedCodeRefactoringProviderNames.AddConstructorParametersFromMembers)] - internal class GenerateConstructorFromMembersCodeRefactoringProvider : CodeRefactoringProvider - { - public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) - { - var document = context.Document; - var textSpan = context.Span; - var cancellationToken = context.CancellationToken; - - if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) - { - return; - } - - var service = document.GetLanguageService(); - var actions = await service.GenerateConstructorFromMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - if (!actions.IsDefault) - { - context.RegisterRefactorings(actions); - } - } - } -} \ No newline at end of file diff --git a/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeCodeRefactoringProvider.cs b/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeCodeRefactoringProvider.cs deleted file mode 100644 index d2071e886751b6ed98ed3f8ff08bba54b10f086a..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/CodeRefactorings/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeCodeRefactoringProvider.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.GenerateFromMembers.GenerateEqualsAndGetHashCode; -using Microsoft.CodeAnalysis.Shared.Extensions; - -namespace Microsoft.CodeAnalysis.CodeRefactorings.GenerateFromMembers.GenerateEqualsAndGetHashCode -{ - // [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, PredefinedCodeRefactoringProviderNames.GenerateEqualsAndGetHashCode)] - [ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.GenerateConstructorFromMembers, Before = PredefinedCodeRefactoringProviderNames.AddConstructorParametersFromMembers)] - internal class GenerateEqualsAndGetHashCodeCodeRefactoringProvider : CodeRefactoringProvider - { - public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) - { - var document = context.Document; - var textSpan = context.Span; - var cancellationToken = context.CancellationToken; - - if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) - { - return; - } - - var service = document.GetLanguageService(); - var actions = await service.GenerateEqualsAndGetHashCodeAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - if (!actions.IsDefault) - { - context.RegisterRefactorings(actions); - } - } - } -} \ No newline at end of file diff --git a/src/Features/Core/Portable/CodeRefactorings/PredefinedCodeRefactoringProviderNames.cs b/src/Features/Core/Portable/CodeRefactorings/PredefinedCodeRefactoringProviderNames.cs index 9c248610b40f7614905a09c08055f59a538c8129..42d8c28294f21afaa67a680888b2383396626217 100644 --- a/src/Features/Core/Portable/CodeRefactorings/PredefinedCodeRefactoringProviderNames.cs +++ b/src/Features/Core/Portable/CodeRefactorings/PredefinedCodeRefactoringProviderNames.cs @@ -11,7 +11,7 @@ internal static class PredefinedCodeRefactoringProviderNames public const string ExtractMethod = "Extract Method Code Action Provider"; public const string GenerateConstructorFromMembers = "Generate Constructor From Members Code Action Provider"; public const string GenerateDefaultConstructors = "Generate Default Constructors Code Action Provider"; - public const string GenerateEqualsAndGetHashCode = "Generate Equals and GetHashCode Code Action Provider"; + public const string GenerateEqualsAndGetHashCodeFromMembers = "Generate Equals and GetHashCode Code Action Provider"; public const string InlineTemporary = "Inline Temporary Code Action Provider"; public const string IntroduceVariable = "Introduce Variable Code Action Provider"; public const string InvertIf = "Invert If Code Action Provider"; diff --git a/src/Features/Core/Portable/Features.csproj b/src/Features/Core/Portable/Features.csproj index a111c2e8c18a69b51d90a9d081683d8ce1046f29..8072e9cc23b6dc6f28f2a1ca69fddd37c704f046 100644 --- a/src/Features/Core/Portable/Features.csproj +++ b/src/Features/Core/Portable/Features.csproj @@ -125,6 +125,7 @@ + @@ -247,9 +248,9 @@ - - - + + + @@ -508,18 +509,11 @@ - - - - - - - - - - - - + + + + + diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.ConstructorDelegatingCodeAction.cs b/src/Features/Core/Portable/GenerateConstructorFromMembers/ConstructorDelegatingCodeAction.cs similarity index 93% rename from src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.ConstructorDelegatingCodeAction.cs rename to src/Features/Core/Portable/GenerateConstructorFromMembers/ConstructorDelegatingCodeAction.cs index b6a771e8d3a2fb1f58497651b2969d1faa09c02a..25277ec19ff7dd2c2650d712b4c3a13bd41982ba 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.ConstructorDelegatingCodeAction.cs +++ b/src/Features/Core/Portable/GenerateConstructorFromMembers/ConstructorDelegatingCodeAction.cs @@ -10,18 +10,18 @@ using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.Shared.Extensions; -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers +namespace Microsoft.CodeAnalysis.GenerateConstructorFromMembers { - internal abstract partial class AbstractGenerateConstructorFromMembersService + internal partial class GenerateConstructorFromMembersCodeRefactoringProvider { private class ConstructorDelegatingCodeAction : CodeAction { - private readonly TService _service; + private readonly GenerateConstructorFromMembersCodeRefactoringProvider _service; private readonly Document _document; private readonly State _state; public ConstructorDelegatingCodeAction( - TService service, + GenerateConstructorFromMembersCodeRefactoringProvider service, Document document, State state) { @@ -92,4 +92,4 @@ public override string Title } } } -} +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.FieldDelegatingCodeAction.cs b/src/Features/Core/Portable/GenerateConstructorFromMembers/FieldDelegatingCodeAction.cs similarity index 92% rename from src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.FieldDelegatingCodeAction.cs rename to src/Features/Core/Portable/GenerateConstructorFromMembers/FieldDelegatingCodeAction.cs index cfa05557d80b52a6ae4d2dab392b8cd388804905..99ccbf2d2f807ee65654b30630b8243683556a96 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.FieldDelegatingCodeAction.cs +++ b/src/Features/Core/Portable/GenerateConstructorFromMembers/FieldDelegatingCodeAction.cs @@ -10,18 +10,18 @@ using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.Shared.Extensions; -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers +namespace Microsoft.CodeAnalysis.GenerateConstructorFromMembers { - internal abstract partial class AbstractGenerateConstructorFromMembersService + internal partial class GenerateConstructorFromMembersCodeRefactoringProvider { private class FieldDelegatingCodeAction : CodeAction { - private readonly TService _service; + private readonly GenerateConstructorFromMembersCodeRefactoringProvider _service; private readonly Document _document; private readonly State _state; public FieldDelegatingCodeAction( - TService service, + GenerateConstructorFromMembersCodeRefactoringProvider service, Document document, State state) { @@ -88,4 +88,4 @@ public override string Title } } } -} +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs b/src/Features/Core/Portable/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs new file mode 100644 index 0000000000000000000000000000000000000000..1f6434fded802914db59e7bb47b02182017778fc --- /dev/null +++ b/src/Features/Core/Portable/GenerateConstructorFromMembers/GenerateConstructorFromMembersCodeRefactoringProvider.cs @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Composition; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.GenerateFromMembers; +using Microsoft.CodeAnalysis.Internal.Log; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.GenerateConstructorFromMembers +{ + [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, + Name = PredefinedCodeRefactoringProviderNames.GenerateConstructorFromMembers), Shared] + [ExtensionOrder(Before = PredefinedCodeRefactoringProviderNames.AddConstructorParametersFromMembers)] + internal partial class GenerateConstructorFromMembersCodeRefactoringProvider : AbstractGenerateFromMembersCodeRefactoringProvider + { + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) + { + var document = context.Document; + var textSpan = context.Span; + var cancellationToken = context.CancellationToken; + + if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) + { + return; + } + + var actions = await this.GenerateConstructorFromMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); + if (!actions.IsDefault) + { + context.RegisterRefactorings(actions); + } + } + + public async Task> GenerateConstructorFromMembersAsync( + Document document, TextSpan textSpan, CancellationToken cancellationToken) + { + using (Logger.LogBlock(FunctionId.Refactoring_GenerateFromMembers_GenerateConstructorFromMembers, cancellationToken)) + { + var info = await GetSelectedMemberInfoAsync(document, textSpan, cancellationToken).ConfigureAwait(false); + if (info != null) + { + var state = State.Generate(this, document, textSpan, info.ContainingType, info.SelectedMembers, cancellationToken); + if (state != null) + { + return GetCodeActions(document, state).AsImmutableOrNull(); + } + } + + return default(ImmutableArray); + } + } + + private IEnumerable GetCodeActions(Document document, State state) + { + yield return new FieldDelegatingCodeAction(this, document, state); + if (state.DelegatedConstructor != null) + { + yield return new ConstructorDelegatingCodeAction(this, document, state); + } + } + } +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.State.cs b/src/Features/Core/Portable/GenerateConstructorFromMembers/State.cs similarity index 88% rename from src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.State.cs rename to src/Features/Core/Portable/GenerateConstructorFromMembers/State.cs index 2bb0e8b2e28f0cb07e255a7526bb38f941be2137..04171bba6b7e7e7f9fed9b4c002e29bddbe981ce 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.State.cs +++ b/src/Features/Core/Portable/GenerateConstructorFromMembers/State.cs @@ -6,9 +6,9 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers +namespace Microsoft.CodeAnalysis.GenerateConstructorFromMembers { - internal abstract partial class AbstractGenerateConstructorFromMembersService + internal partial class GenerateConstructorFromMembersCodeRefactoringProvider { private class State { @@ -19,7 +19,7 @@ private class State public List Parameters { get; private set; } public static State Generate( - TService service, + GenerateConstructorFromMembersCodeRefactoringProvider service, Document document, TextSpan textSpan, INamedTypeSymbol containingType, @@ -36,7 +36,7 @@ private class State } private bool TryInitialize( - TService service, + GenerateConstructorFromMembersCodeRefactoringProvider service, Document document, TextSpan textSpan, INamedTypeSymbol containingType, diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/AbstractGenerateEqualsAndGetHashCodeService.cs b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.cs similarity index 61% rename from src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/AbstractGenerateEqualsAndGetHashCodeService.cs rename to src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.cs index 06e06bacf6fddbb642adcfd72be12ccf52ed26cf..6c27aa37827f57ad774d6bf238f48ed8b9923a3b 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/AbstractGenerateEqualsAndGetHashCodeService.cs +++ b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Collections.Immutable; @@ -7,25 +7,41 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CodeActions; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.GenerateFromMembers; using Microsoft.CodeAnalysis.Internal.Log; using Microsoft.CodeAnalysis.Text; -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateEqualsAndGetHashCode +namespace Microsoft.CodeAnalysis.GenerateEqualsAndGetHashCodeFromMembers { - internal abstract partial class AbstractGenerateEqualsAndGetHashCodeService : - AbstractGenerateFromMembersService, IGenerateEqualsAndGetHashCodeService - where TService : AbstractGenerateEqualsAndGetHashCodeService - where TMemberDeclarationSyntax : SyntaxNode + // [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, PredefinedCodeRefactoringProviderNames.GenerateEqualsAndGetHashCodeFromMembers)] + [ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.GenerateConstructorFromMembers, + Before = PredefinedCodeRefactoringProviderNames.AddConstructorParametersFromMembers)] + internal partial class GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider : AbstractGenerateFromMembersCodeRefactoringProvider { + public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) + { + var document = context.Document; + var textSpan = context.Span; + var cancellationToken = context.CancellationToken; + + if (document.Project.Solution.Workspace.Kind == WorkspaceKind.MiscellaneousFiles) + { + return; + } + + var actions = await this.GenerateEqualsAndGetHashCodeFromMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); + if (!actions.IsDefault) + { + context.RegisterRefactorings(actions); + } + } + private const string EqualsName = "Equals"; private const string GetHashCodeName = "GetHashCode"; private const string ObjName = nameof(ObjName); - protected AbstractGenerateEqualsAndGetHashCodeService() - { - } - - public async Task> GenerateEqualsAndGetHashCodeAsync( + public async Task> GenerateEqualsAndGetHashCodeFromMembersAsync( Document document, TextSpan textSpan, CancellationToken cancellationToken) @@ -70,18 +86,18 @@ protected AbstractGenerateEqualsAndGetHashCodeService() { if (!hasEquals) { - yield return new GenerateEqualsAndHashCodeAction((TService)this, document, textSpan, containingType, selectedMembers, generateEquals: true); + yield return new GenerateEqualsAndHashCodeAction(this, document, textSpan, containingType, selectedMembers, generateEquals: true); } if (!hasGetHashCode) { - yield return new GenerateEqualsAndHashCodeAction((TService)this, document, textSpan, containingType, selectedMembers, generateGetHashCode: true); + yield return new GenerateEqualsAndHashCodeAction(this, document, textSpan, containingType, selectedMembers, generateGetHashCode: true); } if (!hasEquals && !hasGetHashCode) { - yield return new GenerateEqualsAndHashCodeAction((TService)this, document, textSpan, containingType, selectedMembers, generateEquals: true, generateGetHashCode: true); + yield return new GenerateEqualsAndHashCodeAction(this, document, textSpan, containingType, selectedMembers, generateEquals: true, generateGetHashCode: true); } } } -} +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeCodeRefactoringProvider.CodeAction.cs b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndHashCodeAction.cs similarity index 91% rename from src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeCodeRefactoringProvider.CodeAction.cs rename to src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndHashCodeAction.cs index ea6d1419e5c5445a59572d8033f7eb722b718876..7630fafebc904b36f278ad9d50d79be1da9d6955 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/GenerateEqualsAndGetHashCodeCodeRefactoringProvider.CodeAction.cs +++ b/src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndHashCodeAction.cs @@ -9,22 +9,22 @@ using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Text; -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateEqualsAndGetHashCode +namespace Microsoft.CodeAnalysis.GenerateEqualsAndGetHashCodeFromMembers { - internal abstract partial class AbstractGenerateEqualsAndGetHashCodeService + internal partial class GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider { private class GenerateEqualsAndHashCodeAction : CodeAction { private readonly bool _generateEquals; private readonly bool _generateGetHashCode; - private readonly TService _service; + private readonly GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider _service; private readonly Document _document; private readonly INamedTypeSymbol _containingType; private readonly IList _selectedMembers; private readonly TextSpan _textSpan; public GenerateEqualsAndHashCodeAction( - TService service, + GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider service, Document document, TextSpan textSpan, INamedTypeSymbol containingType, @@ -95,4 +95,4 @@ public override string Title } } } -} +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/AbstractGenerateFromMembersService.cs b/src/Features/Core/Portable/GenerateFromMembers/AbstractGenerateFromMembersService.cs index b4db3962ebb690a682ecd682304ed3935f84a1b8..059a3de16b37a24bfe061f538fdc81e167ca1b77 100644 --- a/src/Features/Core/Portable/GenerateFromMembers/AbstractGenerateFromMembersService.cs +++ b/src/Features/Core/Portable/GenerateFromMembers/AbstractGenerateFromMembersService.cs @@ -1,43 +1,50 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeGeneration; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Text; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.GenerateFromMembers { - internal abstract class AbstractGenerateFromMembersService - where TMemberDeclarationSyntax : SyntaxNode + internal interface IGenerateFromMembersHelperService : ILanguageService { - protected AbstractGenerateFromMembersService() + Task> GetSelectedMembersAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken); + IEnumerable GetDeclaredSymbols(SemanticModel semanticModel, SyntaxNode memberDeclaration, CancellationToken cancellationToken); + } + + internal abstract class AbstractGenerateFromMembersCodeRefactoringProvider : CodeRefactoringProvider + { + protected AbstractGenerateFromMembersCodeRefactoringProvider() { } - protected abstract Task> GetSelectedMembersAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken); - protected abstract IEnumerable GetDeclaredSymbols(SemanticModel semanticModel, TMemberDeclarationSyntax memberDeclaration, CancellationToken cancellationToken); - protected class SelectedMemberInfo { public INamedTypeSymbol ContainingType; - public IList SelectedDeclarations; + public IList SelectedDeclarations; public IList SelectedMembers; } protected async Task GetSelectedMemberInfoAsync( Document document, TextSpan textSpan, CancellationToken cancellationToken) { - var selectedDeclarations = await this.GetSelectedMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); + var helper = document.GetLanguageService(); + + var selectedDeclarations = await helper.GetSelectedMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - if (selectedDeclarations.Count > 0) + if (selectedDeclarations.Length > 0) { var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); var selectedMembers = selectedDeclarations.SelectMany( - d => this.GetDeclaredSymbols(semanticModel, d, cancellationToken)).WhereNotNull().ToList(); + d => helper.GetDeclaredSymbols(semanticModel, d, cancellationToken)).WhereNotNull().ToList(); if (selectedMembers.Count > 0) { var containingType = selectedMembers.First().ContainingType; @@ -146,4 +153,4 @@ where constructorTypes.SequenceEqual(symbolTypes) parameterOptions: SymbolDisplayParameterOptions.IncludeParamsRefOut | SymbolDisplayParameterOptions.IncludeType, miscellaneousOptions: SymbolDisplayMiscellaneousOptions.UseSpecialTypes); } -} +} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.cs b/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.cs deleted file mode 100644 index 327605a92932852caeddf5bafeca2cbf178468b6..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/AbstractAddConstructorParametersService.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CodeActions; -using Microsoft.CodeAnalysis.CodeGeneration; -using Microsoft.CodeAnalysis.Internal.Log; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.CodeAnalysis.GenerateFromMembers.AddConstructorParameters -{ - internal abstract partial class AbstractAddConstructorParametersService : - AbstractGenerateFromMembersService, IAddConstructorParametersService - where TService : AbstractAddConstructorParametersService - where TMemberDeclarationSyntax : SyntaxNode - { - protected AbstractAddConstructorParametersService() - { - } - - public async Task> AddConstructorParametersAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken) - { - using (Logger.LogBlock(FunctionId.Refactoring_GenerateFromMembers_AddConstructorParameters, cancellationToken)) - { - var info = await this.GetSelectedMemberInfoAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - if (info != null) - { - var state = State.Generate((TService)this, document, textSpan, info.SelectedMembers, cancellationToken); - if (state != null) - { - return CreateCodeActions(document, state).AsImmutableOrNull(); - } - } - - return default(ImmutableArray); - } - } - - private IEnumerable CreateCodeActions(Document document, State state) - { - var lastParameter = state.DelegatedConstructor.Parameters.Last(); - if (!lastParameter.IsOptional) - { - yield return new AddConstructorParametersCodeAction((TService)this, document, state, state.Parameters); - } - - var parameters = state.Parameters.Select(p => CodeGenerationSymbolFactory.CreateParameterSymbol( - attributes: null, - refKind: p.RefKind, - isParams: p.IsParams, - type: p.Type, - name: p.Name, - isOptional: true, - hasDefaultValue: true)).ToList(); - - yield return new AddConstructorParametersCodeAction((TService)this, document, state, parameters); - } - } -} diff --git a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/IAddConstructorParametersService.cs b/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/IAddConstructorParametersService.cs deleted file mode 100644 index d81a9f5d181c130e9ddb07e86947f8f1709e6ba7..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/GenerateFromMembers/AddConstructorParameters/IAddConstructorParametersService.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Immutable; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CodeActions; -using Microsoft.CodeAnalysis.Host; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.CodeAnalysis.GenerateFromMembers.AddConstructorParameters -{ - internal interface IAddConstructorParametersService : ILanguageService - { - Task> AddConstructorParametersAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken); - } -} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.cs b/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.cs deleted file mode 100644 index 99a51d7f39a760c13544d92bf48937ae3cee21d2..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/AbstractGenerateConstructorFromMembersService.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CodeActions; -using Microsoft.CodeAnalysis.Internal.Log; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers -{ - internal abstract partial class AbstractGenerateConstructorFromMembersService : - AbstractGenerateFromMembersService, IGenerateConstructorFromMembersService - where TService : AbstractGenerateConstructorFromMembersService - where TMemberDeclarationSyntax : SyntaxNode - { - protected AbstractGenerateConstructorFromMembersService() - { - } - - public async Task> GenerateConstructorFromMembersAsync( - Document document, TextSpan textSpan, CancellationToken cancellationToken) - { - using (Logger.LogBlock(FunctionId.Refactoring_GenerateFromMembers_GenerateConstructor, cancellationToken)) - { - var info = await GetSelectedMemberInfoAsync(document, textSpan, cancellationToken).ConfigureAwait(false); - if (info != null) - { - var state = State.Generate((TService)this, document, textSpan, info.ContainingType, info.SelectedMembers, cancellationToken); - if (state != null) - { - return GetCodeActions(document, state).AsImmutableOrNull(); - } - } - - return default(ImmutableArray); - } - } - - private IEnumerable GetCodeActions(Document document, State state) - { - yield return new FieldDelegatingCodeAction((TService)this, document, state); - if (state.DelegatedConstructor != null) - { - yield return new ConstructorDelegatingCodeAction((TService)this, document, state); - } - } - } -} diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/IGenerateConstructorFromMembersService.cs b/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/IGenerateConstructorFromMembersService.cs deleted file mode 100644 index 8e831b0afa2298aecbfaa252203ad71e6c3bdc9a..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateConstructorFromMembers/IGenerateConstructorFromMembersService.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Immutable; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CodeActions; -using Microsoft.CodeAnalysis.Host; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers -{ - internal interface IGenerateConstructorFromMembersService : ILanguageService - { - Task> GenerateConstructorFromMembersAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken); - } -} \ No newline at end of file diff --git a/src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/IGenerateEqualsAndGetHashCodeService.cs b/src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/IGenerateEqualsAndGetHashCodeService.cs deleted file mode 100644 index fb4072e796a78dbbbf2f0328907b1ecbf0fd6ad6..0000000000000000000000000000000000000000 --- a/src/Features/Core/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/IGenerateEqualsAndGetHashCodeService.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Immutable; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.CodeActions; -using Microsoft.CodeAnalysis.Host; -using Microsoft.CodeAnalysis.Text; - -namespace Microsoft.CodeAnalysis.GenerateFromMembers.GenerateEqualsAndGetHashCode -{ - internal interface IGenerateEqualsAndGetHashCodeService : ILanguageService - { - Task> GenerateEqualsAndGetHashCodeAsync(Document document, TextSpan textSpan, CancellationToken cancellationToken); - } -} \ No newline at end of file diff --git a/src/Features/VisualBasic/Portable/BasicFeatures.vbproj b/src/Features/VisualBasic/Portable/BasicFeatures.vbproj index 9ac2c8625b3b7c7a1d6e48943d9321f1d7e2076d..36b21a149b2b23003e68d1f6319124aad7942f81 100644 --- a/src/Features/VisualBasic/Portable/BasicFeatures.vbproj +++ b/src/Features/VisualBasic/Portable/BasicFeatures.vbproj @@ -320,9 +320,6 @@ - - - diff --git a/src/Features/VisualBasic/Portable/GenerateFromMembers/AddConstructorParameters/VisualBasicAddConstructorParametersService.vb b/src/Features/VisualBasic/Portable/GenerateFromMembers/AddConstructorParameters/VisualBasicAddConstructorParametersService.vb deleted file mode 100644 index 472beceb9a308ef84d7edb8798f02ffff6084335..0000000000000000000000000000000000000000 --- a/src/Features/VisualBasic/Portable/GenerateFromMembers/AddConstructorParameters/VisualBasicAddConstructorParametersService.vb +++ /dev/null @@ -1,27 +0,0 @@ -' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -Imports System.Composition -Imports System.Threading -Imports Microsoft.CodeAnalysis.GenerateFromMembers.AddConstructorParameters -Imports Microsoft.CodeAnalysis.Host.Mef -Imports Microsoft.CodeAnalysis.Text -Imports Microsoft.CodeAnalysis.VisualBasic.Syntax - -Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.GenerateFromMembers.AddConstructorParameters - - Friend Class VisualBasicAddConstructorParametersService - Inherits AbstractAddConstructorParametersService(Of VisualBasicAddConstructorParametersService, StatementSyntax) - - Protected Overloads Overrides Function GetSelectedMembersAsync( - document As Document, textSpan As TextSpan, cancellationToken As CancellationToken) As Task(Of IList(Of StatementSyntax)) - Return GenerateFromMembersHelpers.GetSelectedMembersAsync(document, textSpan, cancellationToken) - End Function - - Protected Overrides Function GetDeclaredSymbols( - semanticModel As SemanticModel, - memberDeclaration As StatementSyntax, - cancellationToken As CancellationToken) As IEnumerable(Of ISymbol) - Return GenerateFromMembersHelpers.GetDeclaredSymbols(semanticModel, memberDeclaration, cancellationToken) - End Function - End Class -End Namespace diff --git a/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateConstructorFromMembers/VisualBasicGenerateConstructorFromMembersService.vb b/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateConstructorFromMembers/VisualBasicGenerateConstructorFromMembersService.vb deleted file mode 100644 index 3cca1dab1d27111582088fbe827906b23d1e781b..0000000000000000000000000000000000000000 --- a/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateConstructorFromMembers/VisualBasicGenerateConstructorFromMembersService.vb +++ /dev/null @@ -1,32 +0,0 @@ -' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -Imports System.Composition -Imports System.Threading -Imports Microsoft.CodeAnalysis.GenerateFromMembers.GenerateConstructorFromMembers -Imports Microsoft.CodeAnalysis.Host.Mef -Imports Microsoft.CodeAnalysis.Text -Imports Microsoft.CodeAnalysis.VisualBasic.Syntax - -Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.GenerateFromMembers.GenerateConstructorFromMembers - - Friend Class VisualBasicGenerateConstructorFromMembersService - Inherits AbstractGenerateConstructorFromMembersService(Of VisualBasicGenerateConstructorFromMembersService, StatementSyntax) - - Protected Overloads Overrides Async Function GetSelectedMembersAsync( - document As Document, textSpan As TextSpan, cancellationToken As CancellationToken) As Task(Of IList(Of StatementSyntax)) - - If cancellationToken.IsCancellationRequested Then - Return SpecializedCollections.EmptyList(Of StatementSyntax)() - Else - Return Await GenerateFromMembersHelpers.GetSelectedMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(False) - End If - End Function - - Protected Overrides Function GetDeclaredSymbols( - semanticModel As SemanticModel, - memberDeclaration As StatementSyntax, - cancellationToken As CancellationToken) As IEnumerable(Of ISymbol) - Return GenerateFromMembersHelpers.GetDeclaredSymbols(semanticModel, memberDeclaration, cancellationToken) - End Function - End Class -End Namespace diff --git a/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/VisualBasicGenerateEqualsAndGetHashCodeService.vb b/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/VisualBasicGenerateEqualsAndGetHashCodeService.vb deleted file mode 100644 index 2e67f6f251c9fc7b057f0e8f64a5d58586a1468d..0000000000000000000000000000000000000000 --- a/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateEqualsAndGetHashCode/VisualBasicGenerateEqualsAndGetHashCodeService.vb +++ /dev/null @@ -1,32 +0,0 @@ -' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -Imports System.Composition -Imports System.Threading -Imports Microsoft.CodeAnalysis.GenerateFromMembers.GenerateEqualsAndGetHashCode -Imports Microsoft.CodeAnalysis.Host.Mef -Imports Microsoft.CodeAnalysis.Text -Imports Microsoft.CodeAnalysis.VisualBasic.Syntax - -Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.GenerateFromMembers.GenerateEqualsAndGetHashCode - - Friend Class VisualBasicGenerateEqualsAndGetHashCodeService - Inherits AbstractGenerateEqualsAndGetHashCodeService(Of VisualBasicGenerateEqualsAndGetHashCodeService, StatementSyntax) - - Protected Overloads Overrides Async Function GetSelectedMembersAsync( - document As Document, textSpan As TextSpan, cancellationToken As CancellationToken) As Task(Of IList(Of StatementSyntax)) - - If cancellationToken.IsCancellationRequested Then - Return SpecializedCollections.EmptyList(Of StatementSyntax)() - Else - Return Await GenerateFromMembersHelpers.GetSelectedMembersAsync(document, textSpan, cancellationToken).ConfigureAwait(False) - End If - End Function - - Protected Overrides Function GetDeclaredSymbols( - semanticModel As SemanticModel, - memberDeclaration As StatementSyntax, - cancellationToken As CancellationToken) As IEnumerable(Of ISymbol) - Return GenerateFromMembersHelpers.GetDeclaredSymbols(semanticModel, memberDeclaration, cancellationToken) - End Function - End Class -End Namespace diff --git a/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateFromMembersHelpers.vb b/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateFromMembersHelpers.vb index b57daf24375fa930932b0c98e05f2c28d52d3392..3149bdc4a930e2da7b47f26d388183121cbaa598 100644 --- a/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateFromMembersHelpers.vb +++ b/src/Features/VisualBasic/Portable/GenerateFromMembers/GenerateFromMembersHelpers.vb @@ -1,18 +1,25 @@ ' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +Imports System.Composition Imports System.Threading Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax +Imports Microsoft.CodeAnalysis.GenerateFromMembers +Imports System.Collections.Immutable +Imports Microsoft.CodeAnalysis.Host.Mef Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.GenerateFromMembers - Friend Class GenerateFromMembersHelpers - Public Shared Async Function GetSelectedMembersAsync( - document As Document, textSpan As TextSpan, cancellationToken As CancellationToken) As Task(Of IList(Of StatementSyntax)) + + Friend Class VisualBasicGenerateFromMembersHelpersService + Implements IGenerateFromMembersHelperService + + Public Async Function GetSelectedMembersAsync( + document As Document, textSpan As TextSpan, cancellationToken As CancellationToken) As Task(Of ImmutableArray(Of SyntaxNode)) Implements IGenerateFromMembersHelperService.GetSelectedMembersAsync Dim tree = Await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(False) - Return tree.GetMembersInSpan(textSpan, cancellationToken) + Return ImmutableArray(Of SyntaxNode).CastUp(tree.GetMembersInSpan(textSpan, cancellationToken)) End Function - Public Shared Function GetDeclaredSymbols(semanticModel As SemanticModel, memberDeclaration As StatementSyntax, cancellationToken As CancellationToken) As IEnumerable(Of ISymbol) + Public Function GetDeclaredSymbols(semanticModel As SemanticModel, memberDeclaration As SyntaxNode, cancellationToken As CancellationToken) As IEnumerable(Of ISymbol) Implements IGenerateFromMembersHelperService.GetDeclaredSymbols If TypeOf memberDeclaration Is FieldDeclarationSyntax Then Return DirectCast(memberDeclaration, FieldDeclarationSyntax).Declarators. SelectMany(Function(d) d.Names.AsEnumerable()). diff --git a/src/Workspaces/CSharp/Portable/Extensions/SyntaxTreeExtensions.cs b/src/Workspaces/CSharp/Portable/Extensions/SyntaxTreeExtensions.cs index bd64ca6efd48be5fb2076761b43fedc9ea1ddc78..4e0543770e0b54eae1775bba19faf569ad9c83f5 100644 --- a/src/Workspaces/CSharp/Portable/Extensions/SyntaxTreeExtensions.cs +++ b/src/Workspaces/CSharp/Portable/Extensions/SyntaxTreeExtensions.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; using System.Threading; using Microsoft.CodeAnalysis.CSharp; @@ -499,7 +500,7 @@ private static bool AtEndOfIncompleteStringOrCharLiteral(SyntaxToken token, int return false; } - public static IList GetMembersInSpan( + public static ImmutableArray GetMembersInSpan( this SyntaxTree syntaxTree, TextSpan textSpan, CancellationToken cancellationToken) @@ -511,50 +512,52 @@ private static bool AtEndOfIncompleteStringOrCharLiteral(SyntaxToken token, int var containingType = firstMember.Parent as TypeDeclarationSyntax; if (containingType != null) { - var members = GetMembersInSpan(textSpan, containingType, firstMember); - if (members != null) - { - return members; - } + return GetMembersInSpan(textSpan, containingType, firstMember); } } - return SpecializedCollections.EmptyList(); + return ImmutableArray.Empty; } - private static List GetMembersInSpan( + private static ImmutableArray GetMembersInSpan( TextSpan textSpan, TypeDeclarationSyntax containingType, MemberDeclarationSyntax firstMember) { - List selectedMembers = null; - - var members = containingType.Members; - var fieldIndex = members.IndexOf(firstMember); - if (fieldIndex < 0) + var selectedMembers = ArrayBuilder.GetInstance(); + try { - return null; - } - for (var i = fieldIndex; i < members.Count; i++) - { - var member = members[i]; - if (textSpan.Contains(member.Span)) + var members = containingType.Members; + var fieldIndex = members.IndexOf(firstMember); + if (fieldIndex < 0) { - selectedMembers = selectedMembers ?? new List(); - selectedMembers.Add(member); + return ImmutableArray.Empty; } - else if (textSpan.OverlapsWith(member.Span)) - { - return null; - } - else + + for (var i = fieldIndex; i < members.Count; i++) { - break; + var member = members[i]; + if (textSpan.Contains(member.Span)) + { + selectedMembers.Add(member); + } + else if (textSpan.OverlapsWith(member.Span)) + { + return ImmutableArray.Empty; + } + else + { + break; + } } - } - return selectedMembers; + return selectedMembers.ToImmutable(); + } + finally + { + selectedMembers.Free(); + } } public static bool IsInPartiallyWrittenGeneric( diff --git a/src/Workspaces/Core/Portable/Log/FunctionId.cs b/src/Workspaces/Core/Portable/Log/FunctionId.cs index 7f6bfb24d24ff455cc11edbe923c1a06a13a3aa1..0524488d5bf45133a475f8a54010586446fc02ca 100644 --- a/src/Workspaces/Core/Portable/Log/FunctionId.cs +++ b/src/Workspaces/Core/Portable/Log/FunctionId.cs @@ -162,8 +162,8 @@ internal enum FunctionId Refactoring_CodeRefactoringService_GetRefactoringsAsync, Refactoring_AddImport, Refactoring_FullyQualify, - Refactoring_GenerateFromMembers_AddConstructorParameters, - Refactoring_GenerateFromMembers_GenerateConstructor, + Refactoring_GenerateFromMembers_AddConstructorParametersFromMembers, + Refactoring_GenerateFromMembers_GenerateConstructorFromMembers, Refactoring_GenerateFromMembers_GenerateEqualsAndGetHashCode, Refactoring_GenerateMember_GenerateConstructor, Refactoring_GenerateMember_GenerateDefaultConstructors, diff --git a/src/Workspaces/VisualBasic/Portable/Extensions/SyntaxTreeExtensions.vb b/src/Workspaces/VisualBasic/Portable/Extensions/SyntaxTreeExtensions.vb index 3fcc8eb0b422ca6621129cdfd0eb00c823b5b289..49f4b5b8aa8c1a87477a4f96eb3cf80aefb96fbd 100644 --- a/src/Workspaces/VisualBasic/Portable/Extensions/SyntaxTreeExtensions.vb +++ b/src/Workspaces/VisualBasic/Portable/Extensions/SyntaxTreeExtensions.vb @@ -15,6 +15,7 @@ Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.CodeAnalysis.VisualBasic.Utilities Imports Microsoft.CodeAnalysis.Shared.Extensions +Imports System.Collections.Immutable Namespace Microsoft.CodeAnalysis.VisualBasic.Extensions Friend Module SyntaxTreeExtensions @@ -254,7 +255,7 @@ recurse: Public Function GetMembersInSpan( syntaxTree As SyntaxTree, textSpan As TextSpan, - cancellationToken As CancellationToken) As IList(Of StatementSyntax) + cancellationToken As CancellationToken) As ImmutableArray(Of StatementSyntax) Dim token = syntaxTree.GetRoot(cancellationToken).FindToken(textSpan.Start) Dim firstMember = token.GetAncestors(Of StatementSyntax). @@ -265,41 +266,41 @@ recurse: If containingType IsNot Nothing AndAlso firstMember IsNot containingType.BlockStatement AndAlso firstMember IsNot containingType.EndBlockStatement Then - Dim members = GetMembersInSpan(textSpan, containingType, firstMember) - If members IsNot Nothing Then - Return members - End If + Return GetMembersInSpan(textSpan, containingType, firstMember) End If End If - Return SpecializedCollections.EmptyList(Of StatementSyntax)() + Return ImmutableArray(Of StatementSyntax).Empty End Function Private Function GetMembersInSpan( textSpan As TextSpan, containingType As TypeBlockSyntax, - firstMember As StatementSyntax) As List(Of StatementSyntax) - Dim selectedMembers As List(Of StatementSyntax) = Nothing - - Dim members = containingType.Members - Dim fieldIndex = members.IndexOf(firstMember) - If fieldIndex < 0 Then - Return Nothing - End If - - For i = fieldIndex To members.Count - 1 - Dim member = members(i) - If textSpan.Contains(member.Span) Then - selectedMembers = If(selectedMembers, New List(Of StatementSyntax)) - selectedMembers.Add(member) - ElseIf (textSpan.OverlapsWith(member.Span)) Then - Return Nothing - Else - Exit For + firstMember As StatementSyntax) As ImmutableArray(Of StatementSyntax) + Dim selectedMembers = ArrayBuilder(Of StatementSyntax).GetInstance() + + Try + Dim members = containingType.Members + Dim fieldIndex = members.IndexOf(firstMember) + If fieldIndex < 0 Then + Return ImmutableArray(Of StatementSyntax).Empty End If - Next - Return selectedMembers + For i = fieldIndex To members.Count - 1 + Dim member = members(i) + If textSpan.Contains(member.Span) Then + selectedMembers.Add(member) + ElseIf (textSpan.OverlapsWith(member.Span)) Then + Return ImmutableArray(Of StatementSyntax).Empty + Else + Exit For + End If + Next + + Return selectedMembers.ToImmutable() + Finally + selectedMembers.Free() + End Try End Function