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

PR feedback cleanup.

上级 c465bfeb
......@@ -50,11 +50,6 @@ private async Task<(TLocalDeclarationSyntax, ILocalSymbol)> FindDisposableLocalD
var refactoringHelperService = document.GetLanguageService<IRefactoringHelpersService>();
var declarationSyntax = await refactoringHelperService.TryGetSelectedNodeAsync<TLocalDeclarationSyntax>(document, selection, cancellationToken).ConfigureAwait(false);
if (declarationSyntax == null)
{
return default;
}
if (declarationSyntax is null || !CanRefactorToContainBlockStatements(declarationSyntax.Parent))
{
return default;
......
......@@ -1846,8 +1846,8 @@ public bool IsOnLocalDeclarationHeader(SyntaxNode root, int position, out Syntax
var initializersExpressions = node.Declaration.Variables
.Where(v => v.Initializer != null)
.Select(initializedV => initializedV.Initializer.Value).ToImmutableArray<SyntaxNode>();
return IsInHeader(position, node, node, initializersExpressions);
.SelectAsArray(initializedV => initializedV.Initializer.Value);
return IsOnHeader(position, node, node, holes: initializersExpressions);
}
public bool IsBetweenTypeMembers(SourceText sourceText, SyntaxNode root, int position)
......
......@@ -489,24 +489,25 @@ private bool SpansPreprocessorDirective(SyntaxTriviaList list)
=> list.Any(t => IsPreprocessorDirective(t));
public bool IsOnHeader(int position, SyntaxNode ownerOfHeader, SyntaxNodeOrToken lastTokenOrNodeOfHeader)
{
var start = GetStartOfNodeExcludingAttributes(ownerOfHeader);
var end = lastTokenOrNodeOfHeader.FullSpan.End;
return start <= position && position <= end;
}
=> IsOnHeader(position, ownerOfHeader, lastTokenOrNodeOfHeader, ImmutableArray<SyntaxNode>.Empty);
public bool IsInHeader(int position, SyntaxNode ownerOfHeader, SyntaxNodeOrToken lastTokenOrNodeOfHeader, ImmutableArray<SyntaxNode> holes)
public bool IsOnHeader<THoleSyntax>(int position, SyntaxNode ownerOfHeader, SyntaxNodeOrToken lastTokenOrNodeOfHeader, ImmutableArray<THoleSyntax> holes)
where THoleSyntax : SyntaxNode
{
var inHeader = IsOnHeader(position, ownerOfHeader, lastTokenOrNodeOfHeader);
if (!inHeader)
var headerSpan = TextSpan.FromBounds(
start: GetStartOfNodeExcludingAttributes(ownerOfHeader),
end: lastTokenOrNodeOfHeader.FullSpan.End);
// Is in header check is inclusive, being on the end edge of an header still counts
if (!headerSpan.IntersectsWith(position))
{
return false;
}
// Holes are exclusive: to return false it needs to be _inside_ a hole not only on the edge
// -> to be consistent with other 'being on the edge' of Tokens/Nodes.
if (holes.Any(h => (h.Span.Start < position && position < h.Span.End)))
// Holes are exclusive:
// To be consistent with other 'being on the edge' of Tokens/Nodes a position is
// in a hole (not in a header) only if it's inside _inside_ a hole, not only on the edge.
if (holes.Any(h => h.Span.Contains(position) && position > h.Span.Start))
{
return false;
}
......@@ -520,15 +521,20 @@ public bool IsInHeader(int position, SyntaxNode ownerOfHeader, SyntaxNodeOrToken
/// </summary>
protected static TNode TryGetAncestorForLocation<TNode>(int position, SyntaxNode root) where TNode : SyntaxNode
{
var token = root.FindToken(position);
var node = token.GetAncestor<TNode>();
if (node == null && token.FullSpan.Start == position)
var tokenToRightOrIn = root.FindToken(position);
var nodeToRightOrIn = tokenToRightOrIn.GetAncestor<TNode>();
if (nodeToRightOrIn != null)
{
return nodeToRightOrIn;
}
// not at the beginning of a Token -> no (different) token to the left
if (tokenToRightOrIn.FullSpan.Start != position)
{
token = token.GetPreviousToken();
node = token.GetAncestor<TNode>();
return null;
}
return node;
return tokenToRightOrIn.GetPreviousToken().GetAncestor<TNode>();
}
protected int GetStartOfNodeExcludingAttributes(SyntaxNode node)
......
......@@ -412,7 +412,6 @@ internal interface ISyntaxFactsService : ILanguageService
ImmutableArray<SyntaxNode> GetSelectedFieldsAndProperties(SyntaxNode root, TextSpan textSpan, bool allowPartialSelection);
bool IsOnTypeHeader(SyntaxNode root, int position);
bool IsOnHeader(int position, SyntaxNode ownerOfHeader, SyntaxNodeOrToken lastTokenOrNodeOfHeader);
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);
......
......@@ -1734,10 +1734,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return position >= start AndAlso position <= _end
End Function
Private Function ISyntaxFactsService_IsInHeader(position As Integer, ownerOfHeader As SyntaxNode, lastTokenOrNodeOfHeader As SyntaxNodeOrToken) As Boolean Implements ISyntaxFactsService.IsOnHeader
Return IsOnHeader(position, ownerOfHeader, lastTokenOrNodeOfHeader)
End Function
Public Function IsOnPropertyDeclarationHeader(root As SyntaxNode, position As Integer, ByRef propertyDeclaration As SyntaxNode) As Boolean Implements ISyntaxFactsService.IsOnPropertyDeclarationHeader
Dim node = TryGetAncestorForLocation(Of PropertyStatementSyntax)(position, root)
propertyDeclaration = node
......@@ -1796,8 +1792,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return False
End If
Dim initializersExpressions = node.Declarators.Where(Function(d) d.Initializer IsNot Nothing).[Select](Function(initializedd) initializedd.Initializer.Value).Cast(Of SyntaxNode).ToImmutableArray()
Return IsInHeader(position, node, node, initializersExpressions)
Dim initializersExpressions = node.Declarators.
Where(Function(d) d.Initializer IsNot Nothing).
SelectAsArray(Function(initialized) initialized.Initializer.Value)
Return IsOnHeader(position, node, node, initializersExpressions)
End Function
Public Function IsBetweenTypeMembers(sourceText As SourceText, root As SyntaxNode, position As Integer) As Boolean Implements ISyntaxFactsService.IsBetweenTypeMembers
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册