From 6c8431d99fcace0c8821d16502279dede9173a41 Mon Sep 17 00:00:00 2001 From: Petr Houska Date: Mon, 15 Jul 2019 18:53:11 -0700 Subject: [PATCH] Move moveDeclNearReferenceRefactoring to helpers. --- .../MoveDeclarationNearReferenceTests.cs | 4 +- .../MoveDeclarationNearReferenceTests.vb | 4 +- ...ionNearReferenceCodeRefactoringProvider.cs | 13 ++++++ ...onNearReferenceCodeRefactoringProvider.cs} | 42 +++---------------- ...cMoveDeclarationNearRefactoringProvider.vb | 15 +++++++ 5 files changed, 38 insertions(+), 40 deletions(-) create mode 100644 src/Features/CSharp/Portable/MoveDeclarationNearReference/CSharpMoveDeclarationNearReferenceCodeRefactoringProvider.cs rename src/Features/Core/Portable/MoveDeclarationNearReference/{MoveDeclarationNearReferenceCodeRefactoringProvider.cs => AbstractMoveDeclarationNearReferenceCodeRefactoringProvider.cs} (54%) create mode 100644 src/Features/VisualBasic/Portable/MoveDeclarationNearReference/VisualBasicMoveDeclarationNearRefactoringProvider.vb diff --git a/src/EditorFeatures/CSharpTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.cs b/src/EditorFeatures/CSharpTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.cs index e28288807d0..a726b863c4e 100644 --- a/src/EditorFeatures/CSharpTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.cs +++ b/src/EditorFeatures/CSharpTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.cs @@ -2,8 +2,8 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.CSharp.MoveDeclarationNearReference; using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings; -using Microsoft.CodeAnalysis.MoveDeclarationNearReference; using Microsoft.CodeAnalysis.Test.Utilities; using Roslyn.Test.Utilities; using Xunit; @@ -13,7 +13,7 @@ namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.MoveDeclarationNearRefe public class MoveDeclarationNearReferenceTests : AbstractCSharpCodeActionTest { protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspace workspace, TestParameters parameters) - => new MoveDeclarationNearReferenceCodeRefactoringProvider(); + => new CSharpMoveDeclarationNearReferenceCodeRefactoringProvider(); [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsMoveDeclarationNearReference)] public async Task TestMove1() diff --git a/src/EditorFeatures/VisualBasicTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.vb b/src/EditorFeatures/VisualBasicTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.vb index fb8982099e7..a755650601f 100644 --- a/src/EditorFeatures/VisualBasicTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.vb +++ b/src/EditorFeatures/VisualBasicTest/MoveDeclarationNearReference/MoveDeclarationNearReferenceTests.vb @@ -2,14 +2,14 @@ Imports Microsoft.CodeAnalysis.CodeRefactorings Imports Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.CodeRefactorings -Imports Microsoft.CodeAnalysis.MoveDeclarationNearReference +Imports Microsoft.CodeAnalysis.VisualBasic.MoveDeclarationNearReference Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.MoveDeclarationNearReference Public Class MoveDeclarationNearReferenceTests Inherits AbstractVisualBasicCodeActionTest Protected Overrides Function CreateCodeRefactoringProvider(workspace As Workspace, parameters As TestParameters) As CodeRefactoringProvider - Return New MoveDeclarationNearReferenceCodeRefactoringProvider() + Return New VisualBasicMoveDeclarationNearReferenceCodeRefactoringProvider() End Function diff --git a/src/Features/CSharp/Portable/MoveDeclarationNearReference/CSharpMoveDeclarationNearReferenceCodeRefactoringProvider.cs b/src/Features/CSharp/Portable/MoveDeclarationNearReference/CSharpMoveDeclarationNearReferenceCodeRefactoringProvider.cs new file mode 100644 index 00000000000..7cb7503e21e --- /dev/null +++ b/src/Features/CSharp/Portable/MoveDeclarationNearReference/CSharpMoveDeclarationNearReferenceCodeRefactoringProvider.cs @@ -0,0 +1,13 @@ +using System.Composition; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.MoveDeclarationNearReference; + +namespace Microsoft.CodeAnalysis.CSharp.MoveDeclarationNearReference +{ + [ExportCodeRefactoringProvider(LanguageNames.CSharp, Name = PredefinedCodeRefactoringProviderNames.MoveDeclarationNearReference), Shared] + [ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.InlineTemporary)] + class CSharpMoveDeclarationNearReferenceCodeRefactoringProvider : AbstractMoveDeclarationNearReferenceCodeRefactoringProvider + { + } +} diff --git a/src/Features/Core/Portable/MoveDeclarationNearReference/MoveDeclarationNearReferenceCodeRefactoringProvider.cs b/src/Features/Core/Portable/MoveDeclarationNearReference/AbstractMoveDeclarationNearReferenceCodeRefactoringProvider.cs similarity index 54% rename from src/Features/Core/Portable/MoveDeclarationNearReference/MoveDeclarationNearReferenceCodeRefactoringProvider.cs rename to src/Features/Core/Portable/MoveDeclarationNearReference/AbstractMoveDeclarationNearReferenceCodeRefactoringProvider.cs index 45e6471d2ba..1347d88d729 100644 --- a/src/Features/Core/Portable/MoveDeclarationNearReference/MoveDeclarationNearReferenceCodeRefactoringProvider.cs +++ b/src/Features/Core/Portable/MoveDeclarationNearReference/AbstractMoveDeclarationNearReferenceCodeRefactoringProvider.cs @@ -13,12 +13,10 @@ namespace Microsoft.CodeAnalysis.MoveDeclarationNearReference { - [ExportCodeRefactoringProvider(LanguageNames.CSharp, LanguageNames.VisualBasic, Name = PredefinedCodeRefactoringProviderNames.MoveDeclarationNearReference), Shared] - [ExtensionOrder(After = PredefinedCodeRefactoringProviderNames.InlineTemporary)] - internal sealed class MoveDeclarationNearReferenceCodeRefactoringProvider : CodeRefactoringProvider + internal abstract class AbstractMoveDeclarationNearReferenceCodeRefactoringProvider : CodeRefactoringProvider where TLocalDeclaration : SyntaxNode { [ImportingConstructor] - public MoveDeclarationNearReferenceCodeRefactoringProvider() + public AbstractMoveDeclarationNearReferenceCodeRefactoringProvider() { } @@ -28,12 +26,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte var textSpan = context.Span; var cancellationToken = context.CancellationToken; - if (!textSpan.IsEmpty) - { - return; - } - - var statement = await GetLocalDeclarationStatementAsync(document, textSpan, cancellationToken).ConfigureAwait(false); + var helperService = document.GetLanguageService(); + var statement = await helperService.TryGetSelectedNodeAsync(context).ConfigureAwait(false); if (statement == null) { return; @@ -46,17 +40,6 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte return; } - // Don't offer the refactoring inside the initializer for the variable. - var initializer = syntaxFacts.GetInitializerOfVariableDeclarator(variables[0]); - var applicableSpan = initializer == null - ? statement.Span - : TextSpan.FromBounds(statement.SpanStart, initializer.SpanStart); - - if (!applicableSpan.IntersectsWith(textSpan.Start)) - { - return; - } - var service = document.GetLanguageService(); if (!await service.CanMoveDeclarationNearReferenceAsync(document, statement, cancellationToken).ConfigureAwait(false)) { @@ -64,26 +47,13 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte } context.RegisterRefactoring( - new MyCodeAction(c => MoveDeclarationNearReferenceAsync(document, textSpan, c))); - } - - private async Task GetLocalDeclarationStatementAsync( - Document document, TextSpan textSpan, CancellationToken cancellationToken) - { - var syntaxFacts = document.GetLanguageService(); - - var position = textSpan.Start; - var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); - var statement = root.FindToken(position).Parent.Ancestors().FirstOrDefault(n => syntaxFacts.IsLocalDeclarationStatement(n)); - return statement; + new MyCodeAction(c => MoveDeclarationNearReferenceAsync(document, statement, c))); } private async Task MoveDeclarationNearReferenceAsync( - Document document, TextSpan span, CancellationToken cancellationToken) + Document document, SyntaxNode statement, CancellationToken cancellationToken) { - var statement = await GetLocalDeclarationStatementAsync(document, span, cancellationToken).ConfigureAwait(false); var service = document.GetLanguageService(); - return await service.MoveDeclarationNearReferenceAsync(document, statement, cancellationToken).ConfigureAwait(false); } diff --git a/src/Features/VisualBasic/Portable/MoveDeclarationNearReference/VisualBasicMoveDeclarationNearRefactoringProvider.vb b/src/Features/VisualBasic/Portable/MoveDeclarationNearReference/VisualBasicMoveDeclarationNearRefactoringProvider.vb new file mode 100644 index 00000000000..8967f7cc4b6 --- /dev/null +++ b/src/Features/VisualBasic/Portable/MoveDeclarationNearReference/VisualBasicMoveDeclarationNearRefactoringProvider.vb @@ -0,0 +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 System.Composition +Imports Microsoft.CodeAnalysis.CodeRefactorings +Imports Microsoft.CodeAnalysis.MoveDeclarationNearReference +Imports Microsoft.CodeAnalysis.VisualBasic.Syntax + +Namespace Microsoft.CodeAnalysis.VisualBasic.MoveDeclarationNearReference + + + + Class VisualBasicMoveDeclarationNearReferenceCodeRefactoringProvider + Inherits AbstractMoveDeclarationNearReferenceCodeRefactoringProvider(Of LocalDeclarationStatementSyntax) + End Class +End Namespace -- GitLab