提交 b8a451e6 编写于 作者: P Petr Houška

PR feedback.

上级 59a78d7d
using System.Composition;
// 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 Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServices;
namespace Microsoft.CodeAnalysis.CSharp.CodeRefactorings
{
......
......@@ -14,7 +14,7 @@ internal abstract class AbstractRefactoringHelpersService : IRefactoringHelpersS
public async Task<TSyntaxNode> TryGetSelectedNodeAsync<TSyntaxNode>(
Document document, TextSpan selection, CancellationToken cancellationToken) where TSyntaxNode : SyntaxNode
{
return await TryGetSelectedNodeAsync(document, selection, n => n is TSyntaxNode, cancellationToken).ConfigureAwait(false) as TSyntaxNode;
return (TSyntaxNode)await TryGetSelectedNodeAsync(document, selection, n => n is TSyntaxNode, cancellationToken).ConfigureAwait(false);
}
/// <summary>
......@@ -39,7 +39,8 @@ internal abstract class AbstractRefactoringHelpersService : IRefactoringHelpersS
/// of tokens gracefully.
/// </para>
/// </summary>
protected Task<SyntaxNode> TryGetSelectedNodeAsync(Document document, TextSpan selection, Predicate<SyntaxNode> predicate, CancellationToken cancellationToken) => TryGetSelectedNodeAsync(document, selection, predicate, DefaultNodeExtractor, cancellationToken);
protected Task<SyntaxNode> TryGetSelectedNodeAsync(Document document, TextSpan selection, Predicate<SyntaxNode> predicate, CancellationToken cancellationToken)
=> TryGetSelectedNodeAsync(document, selection, predicate, DefaultNodeExtractor, cancellationToken);
/// <summary>
/// <para>
......@@ -76,7 +77,7 @@ protected async Task<SyntaxNode> TryGetSelectedNodeAsync(Document document, Text
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
var selectionTrimmed = await CodeRefactoringHelpers.GetTrimmedTextSpan(document, selection, cancellationToken).ConfigureAwait(false);
// Everytime a Node is considered by following alghorithm (and tested with predicate) and the predicate fails
// Everytime a Node is considered by following algorithm (and tested with predicate) and the predicate fails
// extractNode is called on the node and the result is tested with predicate again. If any of those succeed
// a respective Node gets returned.
//
......@@ -205,7 +206,6 @@ static SyntaxNode TryGetAcceptedNodeOrExtracted(SyntaxNode node, Predicate<Synta
return node;
}
var extractedNode = extractNode(node, syntaxFacts);
return (extractedNode != null && predicate(extractedNode))
? extractedNode
......@@ -225,6 +225,11 @@ static SyntaxNode TryGetAcceptedNodeOrExtracted(SyntaxNode node, Predicate<Synta
/// </summary>
protected virtual SyntaxNode DefaultNodeExtractor(SyntaxNode node, ISyntaxFactsService syntaxFacts)
{
// REMARKS:
// The set of currently attempted extractions is in no way exhaustive and covers only cases
// that were found to be relevant for refactorings that were moved to `TryGetSelectedNodeAsync`.
// Feel free to extend it / refine current heuristics.
// var a = b;
// -> b
if (syntaxFacts.IsLocalDeclarationStatement(node))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册