提交 aa17a29b 编写于 作者: P Petr Houska

Moved IsInLocalFunctionHeader to SyntaxFactsService.

上级 e68e610e
// 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.Collections.Generic;
using System.Composition;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions;
namespace Microsoft.CodeAnalysis.CSharp.CodeRefactorings
{
[ExportLanguageService(typeof(IRefactoringHelpersService), LanguageNames.CSharp), Shared]
internal class CSharpRefactoringHelpersService : AbstractRefactoringHelpersService<PropertyDeclarationSyntax, ParameterSyntax, MethodDeclarationSyntax, LocalDeclarationStatementSyntax>
internal class CSharpRefactoringHelpersService : AbstractRefactoringHelpersService<PropertyDeclarationSyntax, ParameterSyntax, MethodDeclarationSyntax, LocalDeclarationStatementSyntax, LocalFunctionStatementSyntax>
{
protected override IEnumerable<SyntaxNode> ExtractNodesOfHeader(SyntaxNode node, ISyntaxFactsService syntaxFacts)
{
foreach (var baseExtraction in base.ExtractNodesOfHeader(node, syntaxFacts))
{
yield return baseExtraction;
}
if (IsInLocalFunctionHeader(node, syntaxFacts))
{
yield return node.GetAncestorOrThis<LocalFunctionStatementSyntax>();
}
}
private bool IsInLocalFunctionHeader(SyntaxNode node, ISyntaxFactsService syntaxFacts)
{
var containingLocalFunction = node.GetAncestorOrThis<LocalFunctionStatementSyntax>();
if (containingLocalFunction == null)
{
return false;
}
return syntaxFacts.IsInHeader(node, containingLocalFunction, containingLocalFunction.ParameterList);
}
}
}
......@@ -11,11 +11,12 @@
namespace Microsoft.CodeAnalysis.CodeRefactorings
{
internal abstract class AbstractRefactoringHelpersService<TPropertyDeclaration, TParameter, TMethodDeclaration, TLocalDeclaration> : IRefactoringHelpersService
internal abstract class AbstractRefactoringHelpersService<TPropertyDeclaration, TParameter, TMethodDeclaration, TLocalDeclaration, TLocalFunctionStatementSyntax> : IRefactoringHelpersService
where TPropertyDeclaration : SyntaxNode
where TParameter : SyntaxNode
where TMethodDeclaration : SyntaxNode
where TLocalDeclaration : SyntaxNode
where TLocalFunctionStatementSyntax : SyntaxNode
{
public async Task<TSyntaxNode> TryGetSelectedNodeAsync<TSyntaxNode>(
Document document, TextSpan selection, CancellationToken cancellationToken) where TSyntaxNode : SyntaxNode
......@@ -443,6 +444,11 @@ protected virtual IEnumerable<SyntaxNode> ExtractNodesOfHeader(SyntaxNode node,
{
yield return node.GetAncestorOrThis<TMethodDeclaration>();
}
if (syntaxFacts.IsInLocalFunctionHeader(node, syntaxFacts))
{
yield return node.GetAncestorOrThis<TLocalFunctionStatementSyntax>();
}
}
}
}
......@@ -9,7 +9,7 @@ Imports Microsoft.CodeAnalysis.LanguageServices
Namespace Microsoft.CodeAnalysis.VisualBasic.CodeRefactorings
<ExportLanguageService(GetType(IRefactoringHelpersService), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicRefactoringHelpersService
Inherits AbstractRefactoringHelpersService(Of PropertyStatementSyntax, ParameterSyntax, MethodStatementSyntax, LocalDeclarationStatementSyntax)
Inherits AbstractRefactoringHelpersService(Of PropertyStatementSyntax, ParameterSyntax, MethodStatementSyntax, LocalDeclarationStatementSyntax, SyntaxNode)
Protected Overrides Iterator Function ExtractNodesSimple(node As SyntaxNode, syntaxFacts As ISyntaxFactsService) As IEnumerable(Of SyntaxNode)
For Each baseExtraction In MyBase.ExtractNodesSimple(node, syntaxFacts)
......
......@@ -1824,6 +1824,17 @@ public bool IsInMethodHeader(SyntaxNode node)
return IsInHeader(node, containingMethod, containingMethod.ParameterList);
}
public bool IsInLocalFunctionHeader(SyntaxNode node, ISyntaxFactsService syntaxFacts)
{
var containingLocalFunction = node.GetAncestorOrThis<LocalFunctionStatementSyntax>();
if (containingLocalFunction == null)
{
return false;
}
return syntaxFacts.IsInHeader(node, containingLocalFunction, containingLocalFunction.ParameterList);
}
public bool IsBetweenTypeMembers(SourceText sourceText, SyntaxNode root, int position)
{
var token = root.FindToken(position);
......
......@@ -416,6 +416,7 @@ internal interface ISyntaxFactsService : ILanguageService
bool IsInPropertyDeclarationHeader(SyntaxNode node);
bool IsInParameterHeader(SyntaxNode node);
bool IsInMethodHeader(SyntaxNode node);
bool IsInLocalFunctionHeader(SyntaxNode node, ISyntaxFactsService syntaxFacts);
bool IsBetweenTypeMembers(SourceText sourceText, SyntaxNode root, int position);
// Walks the tree, starting from contextNode, looking for the first construct
......
......@@ -1785,6 +1785,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return IsInHeader(node, method, method)
End Function
Public Function IsInLocalFunctionHeader(node As SyntaxNode, syntaxFacts As ISyntaxFactsService) As Boolean Implements ISyntaxFactsService.IsInLocalFunctionHeader
' No local functions in VisualBasic
Return False
End Function
Public Function IsBetweenTypeMembers(sourceText As SourceText, root As SyntaxNode, position As Integer) As Boolean Implements ISyntaxFactsService.IsBetweenTypeMembers
Dim token = root.FindToken(position)
Dim typeDecl = token.GetAncestor(Of TypeBlockSyntax)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册