提交 9c182f5f 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #20994 from CyrusNajmabadi/removeUnusedVarWithDirectives

Preserve leading directives when removing an unused variable.
......@@ -10,12 +10,12 @@
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.RemoveUnusedLocalFunction
{
public partial class RemoveUnusedVariableTest : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest
public partial class RemoveUnusedLocalFunctionTests : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest
{
internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (null, new CSharpRemoveUnusedLocalFunctionCodeFixProvider());
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedVariable)]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedLocalFunction)]
public async Task RemoveUnusedLocalFunction()
{
await TestInRegularAndScriptAsync(
......@@ -34,7 +34,7 @@ void Method()
}");
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedVariable)]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedLocalFunction)]
public async Task RemoveUnusedLocalFunctionFixAll1()
{
await TestInRegularAndScriptAsync(
......@@ -54,7 +54,7 @@ void Method()
}");
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedVariable)]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedLocalFunction)]
public async Task RemoveUnusedLocalFunctionFixAll2()
{
await TestInRegularAndScriptAsync(
......@@ -74,7 +74,7 @@ void Method()
}");
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedVariable)]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedLocalFunction)]
public async Task RemoveUnusedLocalFunctionFixAll3()
{
await TestInRegularAndScriptAsync(
......@@ -93,7 +93,7 @@ void Method()
}");
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedVariable)]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedLocalFunction)]
public async Task RemoveUnusedLocalFunctionFixAll4()
{
await TestInRegularAndScriptAsync(
......@@ -112,4 +112,4 @@ void Method()
}");
}
}
}
\ No newline at end of file
}
......@@ -10,7 +10,7 @@
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.RemoveUnusedVariable
{
public partial class RemoveUnusedVariableTest : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest
public partial class RemoveUnusedVariableTests : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest
{
internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
=> (null, new CSharpRemoveUnusedVariableCodeFixProvider());
......@@ -205,5 +205,59 @@ void Method()
}
}");
}
[WorkItem(20987, "https://github.com/dotnet/roslyn/issues/20987")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedVariable)]
public async Task LeadingDirectives()
{
await TestInRegularAndScriptAsync(
@"
#define NET461
using System;
namespace ClassLibrary
{
public class Class1
{
public static string GetText()
{
#if NET461
return ""Hello from "" + Environment.OSVersion;
#elif NETSTANDARD1_4
return ""Hello from .NET Standard"";
#else
#error Unknown platform
#endif
int [|blah|] = 5;
}
}
}",
@"
#define NET461
using System;
namespace ClassLibrary
{
public class Class1
{
public static string GetText()
{
#if NET461
return ""Hello from "" + Environment.OSVersion;
#elif NETSTANDARD1_4
return ""Hello from .NET Standard"";
#else
#error Unknown platform
#endif
}
}
}", ignoreTrivia: false);
}
#if false
#endif
}
}
\ No newline at end of file
}
......@@ -9,6 +9,7 @@
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.Editing;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
......@@ -45,6 +46,7 @@ public async override Task RegisterCodeFixesAsync(CodeFixContext context)
protected override Task FixAllAsync(Document document, ImmutableArray<Diagnostic> diagnostics, SyntaxEditor editor, CancellationToken cancellationToken)
{
var syntaxFacts = document.GetLanguageService<ISyntaxFactsService>();
var root = editor.OriginalRoot;
foreach (var diagnostic in diagnostics)
{
......@@ -58,12 +60,19 @@ protected override Task FixAllAsync(Document document, ImmutableArray<Diagnostic
else
{
var variableDeclarator = token.GetAncestor<TVariableDeclarator>();
var variableDeclarators = token.GetAncestor<TVariableDeclaration>().ChildNodes().Where(x => x is TVariableDeclarator);
if (variableDeclarators.Count() == 1)
{
editor.RemoveNode(token.GetAncestor<TLocalDeclarationStatement>());
var localDeclaration = token.GetAncestor<TLocalDeclarationStatement>();
var removeOptions = SyntaxGenerator.DefaultRemoveOptions;
if (localDeclaration.GetLeadingTrivia().Contains(t => t.IsDirective))
{
removeOptions |= SyntaxRemoveOptions.KeepLeadingTrivia;
}
editor.RemoveNode(localDeclaration, removeOptions);
}
else if (variableDeclarators.Count() > 1)
{
......@@ -83,4 +92,4 @@ private class MyCodeAction : CodeAction.DocumentChangeAction
}
}
}
}
\ No newline at end of file
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册