CodeRefactoringContextExtensions.cs 2.8 KB
Newer Older
J
Jonathon Marolf 已提交
1 2 3
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
4

5
using System;
C
CyrusNajmabadi 已提交
6
using System.Collections.Immutable;
7 8
using System.Linq;
using System.Threading;
C
Cyrus Najmabadi 已提交
9
using System.Threading.Tasks;
10
using Microsoft.CodeAnalysis.CodeActions;
C
Cyrus Najmabadi 已提交
11
using Microsoft.CodeAnalysis.Shared.Extensions;
12
using Microsoft.CodeAnalysis.Text;
13 14 15 16 17 18 19 20

namespace Microsoft.CodeAnalysis.CodeRefactorings
{
    internal static class CodeRefactoringContextExtensions
    {
        /// <summary>
        /// Use this helper to register multiple refactorings (<paramref name="actions"/>).
        /// </summary>
21 22 23
        private static void RegisterRefactorings<TCodeAction>(
            CodeRefactoringContext context, ImmutableArray<TCodeAction> actions, TextSpan? applicableToSpan = null)
            where TCodeAction : CodeAction
24
        {
C
CyrusNajmabadi 已提交
25
            if (!actions.IsDefault)
26
            {
C
CyrusNajmabadi 已提交
27 28
                foreach (var action in actions)
                {
29 30 31 32 33 34 35 36
                    if (applicableToSpan != null)
                    {
                        context.RegisterRefactoring(action, applicableToSpan.Value);
                    }
                    else
                    {
                        context.RegisterRefactoring(action);
                    }
C
CyrusNajmabadi 已提交
37
                }
38 39
            }
        }
C
Cyrus Najmabadi 已提交
40

41
        internal static Task<TSyntaxNode?> TryGetRelevantNodeAsync<TSyntaxNode>(this CodeRefactoringContext context)
C
Cyrus Najmabadi 已提交
42
            where TSyntaxNode : SyntaxNode
P
Petr Houska 已提交
43
            => TryGetRelevantNodeAsync<TSyntaxNode>(context.Document, context.Span, context.CancellationToken);
44

P
Petr Houska 已提交
45
        internal static Task<ImmutableArray<TSyntaxNode>> GetRelevantNodesAsync<TSyntaxNode>(this CodeRefactoringContext context)
P
Petr Houska 已提交
46
            where TSyntaxNode : SyntaxNode
P
Petr Houska 已提交
47
            => GetRelevantNodesAsync<TSyntaxNode>(context.Document, context.Span, context.CancellationToken);
C
Cyrus Najmabadi 已提交
48

49
        internal static async Task<TSyntaxNode?> TryGetRelevantNodeAsync<TSyntaxNode>(
P
Petr Houska 已提交
50 51 52 53
            this Document document,
            TextSpan span,
            CancellationToken cancellationToken)
            where TSyntaxNode : SyntaxNode
54
        {
P
Petr Houska 已提交
55
            var potentialNodes = await GetRelevantNodesAsync<TSyntaxNode>(document, span, cancellationToken).ConfigureAwait(false);
56 57 58
            return potentialNodes.FirstOrDefault();
        }

59
        internal static Task<ImmutableArray<TSyntaxNode>> GetRelevantNodesAsync<TSyntaxNode>(
P
Petr Houska 已提交
60 61 62
            this Document document,
            TextSpan span,
            CancellationToken cancellationToken) where TSyntaxNode : SyntaxNode
63
        {
64 65
            var helpers = document.GetRequiredLanguageService<IRefactoringHelpersService>();
            return helpers.GetRelevantNodesAsync<TSyntaxNode>(document, span, cancellationToken);
C
Cyrus Najmabadi 已提交
66
        }
67
    }
S
Sam Harwell 已提交
68
}