CodeRefactoringContextExtensions.cs 2.6 KB
Newer Older
1
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.
2

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

namespace Microsoft.CodeAnalysis.CodeRefactorings
{
    internal static class CodeRefactoringContextExtensions
    {
        /// <summary>
        /// Use this helper to register multiple refactorings (<paramref name="actions"/>).
        /// </summary>
C
CyrusNajmabadi 已提交
19 20 21
        internal static void RegisterRefactorings<TCodeAction>(
            this CodeRefactoringContext context, ImmutableArray<TCodeAction> actions)
            where TCodeAction : CodeAction
22
        {
C
CyrusNajmabadi 已提交
23
            if (!actions.IsDefault)
24
            {
C
CyrusNajmabadi 已提交
25 26 27 28
                foreach (var action in actions)
                {
                    context.RegisterRefactoring(action);
                }
29 30
            }
        }
C
Cyrus Najmabadi 已提交
31

P
Petr Houska 已提交
32
        internal static Task<TSyntaxNode> TryGetRelevantNodeAsync<TSyntaxNode>(this CodeRefactoringContext context)
C
Cyrus Najmabadi 已提交
33
            where TSyntaxNode : SyntaxNode
P
Petr Houska 已提交
34
            => TryGetRelevantNodeAsync<TSyntaxNode>(context.Document, context.Span, context.CancellationToken);
35

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

P
Petr Houska 已提交
40 41 42 43 44
        internal static async Task<TSyntaxNode> TryGetRelevantNodeAsync<TSyntaxNode>(
            this Document document,
            TextSpan span,
            CancellationToken cancellationToken)
            where TSyntaxNode : SyntaxNode
45
        {
P
Petr Houska 已提交
46
            var potentialNodes = await GetRelevantNodesAsync<TSyntaxNode>(document, span, cancellationToken).ConfigureAwait(false);
47 48 49
            return potentialNodes.FirstOrDefault();
        }

P
Petr Houska 已提交
50
        internal static async Task<ImmutableArray<TSyntaxNode>> GetRelevantNodesAsync<TSyntaxNode>(
P
Petr Houska 已提交
51 52 53
            this Document document,
            TextSpan span,
            CancellationToken cancellationToken) where TSyntaxNode : SyntaxNode
54 55 56 57
        {
            var helpers = document.GetLanguageService<IRefactoringHelpersService>();
            var potentialNodes = await helpers.GetRelevantNodesAsync<TSyntaxNode>(document, span, cancellationToken).ConfigureAwait(false);
            return potentialNodes;
C
Cyrus Najmabadi 已提交
58
        }
59
    }
S
Sam Harwell 已提交
60
}