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

Updated IsOnHeader to follow common pattern.

上级 b216a584
......@@ -31,7 +31,7 @@ public CSharpGenerateDefaultConstructorsService()
// first base-type of a class.
var syntaxFacts = semanticDocument.Document.GetLanguageService<ISyntaxFactsService>();
if (syntaxFacts.IsOnTypeHeader(semanticDocument.Root, textSpan.Start))
if (syntaxFacts.IsOnTypeHeader(semanticDocument.Root, textSpan.Start, out _))
{
classType = AbstractGenerateFromMembersCodeRefactoringProvider.GetEnclosingNamedType(
semanticDocument.SemanticModel, semanticDocument.Root, textSpan.Start, cancellationToken);
......
......@@ -87,7 +87,7 @@ private async Task<State> CreateStateAsync(Document document, TextSpan textSpan,
}
var syntaxFacts = document.GetLanguageService<ISyntaxFactsService>();
var isOnTypeHeader = syntaxFacts.IsOnTypeHeader(root, textSpan.Start);
var isOnTypeHeader = syntaxFacts.IsOnTypeHeader(root, textSpan.Start, out _);
var semanticDocument = await SemanticDocument.CreateAsync(document, cancellationToken).ConfigureAwait(false);
return State.Generate(semanticDocument, nodeToAnalyze, isOnTypeHeader, cancellationToken);
......
......@@ -85,7 +85,7 @@ private async Task HandleNonSelectionAsync(CodeRefactoringContext context)
// We offer the refactoring when the user is either on the header of a class/struct,
// or if they're between any members of a class/struct and are on a blank line.
if (!syntaxFacts.IsOnTypeHeader(root, textSpan.Start) &&
if (!syntaxFacts.IsOnTypeHeader(root, textSpan.Start, out _) &&
!syntaxFacts.IsBetweenTypeMembers(sourceText, root, textSpan.Start))
{
return;
......
......@@ -76,7 +76,7 @@ private async Task HandleNonSelectionAsync(CodeRefactoringContext context)
// We offer the refactoring when the user is either on the header of a class/struct,
// or if they're between any members of a class/struct and are on a blank line.
if (!syntaxFacts.IsOnTypeHeader(root, textSpan.Start) &&
if (!syntaxFacts.IsOnTypeHeader(root, textSpan.Start, out _) &&
!syntaxFacts.IsBetweenTypeMembers(sourceText, root, textSpan.Start))
{
return;
......
......@@ -39,7 +39,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
// We offer the refactoring when the user is either on the header of a class/struct,
// or if they're between any members of a class/struct and are on a blank line.
if (!syntaxFacts.IsOnTypeHeader(root, textSpan.Start) &&
if (!syntaxFacts.IsOnTypeHeader(root, textSpan.Start, out _) &&
!syntaxFacts.IsBetweenTypeMembers(sourceText, root, textSpan.Start))
{
return;
......
......@@ -27,7 +27,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.GenerateMember.GenerateDefaultConst
' first base-type of a class.
Dim syntaxFacts = semanticDocument.Document.GetLanguageService(Of ISyntaxFactsService)()
If syntaxFacts.IsOnTypeHeader(semanticDocument.Root, textSpan.Start) Then
If syntaxFacts.IsOnTypeHeader(semanticDocument.Root, textSpan.Start, Nothing) Then
classType = AbstractGenerateFromMembersCodeRefactoringProvider.GetEnclosingNamedType(
semanticDocument.SemanticModel, semanticDocument.Root, textSpan.Start, cancellationToken)
Return classType IsNot Nothing AndAlso classType.TypeKind = TypeKind.Class
......
......@@ -1770,21 +1770,16 @@ public override SyntaxNode Visit(SyntaxNode node)
}
}
public bool IsOnTypeHeader(SyntaxNode root, int position)
public bool IsOnTypeHeader(SyntaxNode root, int position, out SyntaxNode typeDeclaration)
{
var token = root.FindToken(position);
if (token.Kind() == SyntaxKind.EndOfFileToken)
{
token = token.GetPreviousToken();
}
var typeDecl = token.GetAncestor<BaseTypeDeclarationSyntax>();
if (typeDecl == null)
var node = TryGetAncestorForLocation<BaseTypeDeclarationSyntax>(position, root);
typeDeclaration = node;
if (node == null)
{
return false;
}
return IsOnHeader(position, typeDecl, typeDecl.Identifier);
return IsOnHeader(position, node, node.Identifier);
}
public bool IsOnPropertyDeclarationHeader(SyntaxNode root, int position, out SyntaxNode propertyDeclaration)
......
......@@ -411,7 +411,8 @@ internal interface ISyntaxFactsService : ILanguageService
bool IsPropertyPatternClause(SyntaxNode node);
ImmutableArray<SyntaxNode> GetSelectedFieldsAndProperties(SyntaxNode root, TextSpan textSpan, bool allowPartialSelection);
bool IsOnTypeHeader(SyntaxNode root, int position);
bool IsOnTypeHeader(SyntaxNode root, int position, out SyntaxNode typeDeclaration);
bool IsOnPropertyDeclarationHeader(SyntaxNode root, int position, out SyntaxNode propertyDeclaration);
bool IsOnParameterHeader(SyntaxNode root, int position, out SyntaxNode parameter);
bool IsOnMethodHeader(SyntaxNode root, int position, out SyntaxNode method);
......
......@@ -1721,17 +1721,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return trivia.IsElastic()
End Function
Public Function IsOnTypeHeader(root As SyntaxNode, position As Integer) As Boolean Implements ISyntaxFactsService.IsOnTypeHeader
Dim statement = root.FindToken(position).GetAncestor(Of TypeStatementSyntax)
If statement Is Nothing Then
Public Function IsOnTypeHeader(root As SyntaxNode, position As Integer, ByRef typeDeclaration As SyntaxNode) As Boolean Implements ISyntaxFactsService.IsOnTypeHeader
Dim node = TryGetAncestorForLocation(Of TypeStatementSyntax)(position, root)
typeDeclaration = node
If node Is Nothing Then
Return Nothing
End If
Dim start = GetStartOfNodeExcludingAttributes(statement)
Dim _end = If(statement.TypeParameterList?.GetLastToken().FullSpan.End,
statement.Identifier.FullSpan.End)
Return position >= start AndAlso position <= _end
Return IsOnHeader(position, node, If(node.TypeParameterList?.GetLastToken(), node.Identifier))
End Function
Public Function IsOnPropertyDeclarationHeader(root As SyntaxNode, position As Integer, ByRef propertyDeclaration As SyntaxNode) As Boolean Implements ISyntaxFactsService.IsOnPropertyDeclarationHeader
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册