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