From d3445d79fd67118e06f40e96e236987049411fa2 Mon Sep 17 00:00:00 2001 From: Petr Houska Date: Tue, 9 Jul 2019 16:02:24 -0700 Subject: [PATCH] Add GetStartNodeExcludingAttributes helper. --- .../LanguageServices/CSharpSyntaxFactsService.cs | 12 ++++-------- .../AbstractSyntaxFactsService.cs | 11 +++++++++++ .../VisualBasicSyntaxFactsService.vb | 15 +++++++-------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs index 6c83ca06d52..e983ba5d628 100644 --- a/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs +++ b/src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs @@ -1795,8 +1795,7 @@ public bool IsOnTypeHeader(SyntaxNode root, int position) return false; } - var start = typeDecl.AttributeLists.LastOrDefault()?.GetLastToken().GetNextToken().SpanStart ?? - typeDecl.SpanStart; + var start = GetStartOfNodeExcludingAttributes(typeDecl); var end = typeDecl.GetTypeParameterList()?.GetLastToken().FullSpan.End ?? typeDecl.Identifier.FullSpan.End; @@ -1810,9 +1809,7 @@ public bool IsInPropertyDeclarationHeader(SyntaxNode node) { return false; } - - var start = propertyDeclaration.AttributeLists.LastOrDefault()?.GetLastToken().GetNextToken().SpanStart ?? - propertyDeclaration.SpanStart; + var start = GetStartOfNodeExcludingAttributes(propertyDeclaration); var end = propertyDeclaration.Identifier.FullSpan.End; return node.Span.Start >= start && node.Span.End <= end; @@ -1826,8 +1823,7 @@ public bool IsInParameterHeader(SyntaxNode node) return false; } - var start = propertyDeclaration.AttributeLists.LastOrDefault()?.GetLastToken().GetNextToken().SpanStart ?? - propertyDeclaration.SpanStart; + var start = GetStartOfNodeExcludingAttributes(propertyDeclaration); var end = propertyDeclaration.Identifier.FullSpan.End; return node.Span.Start >= start && node.Span.End <= end; @@ -1973,6 +1969,6 @@ public void GetPartsOfCastExpression(SyntaxNode node, out SyntaxNode type, out S public SyntaxNode GetContainingParameter(SyntaxNode node) => node.GetAncestorOrThis(); - public SyntaxList GetAttributeLists(SyntaxNode node) => CSharpSyntaxGenerator.GetAttributeLists(node); + public override SyntaxList GetAttributeLists(SyntaxNode node) => CSharpSyntaxGenerator.GetAttributeLists(node); } } diff --git a/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/AbstractSyntaxFactsService.cs b/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/AbstractSyntaxFactsService.cs index 65b738ed53c..6e7afe1f9b3 100644 --- a/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/AbstractSyntaxFactsService.cs +++ b/src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/AbstractSyntaxFactsService.cs @@ -487,5 +487,16 @@ public bool SpansPreprocessorDirective(IEnumerable tokens) private bool SpansPreprocessorDirective(SyntaxTriviaList list) => list.Any(t => IsPreprocessorDirective(t)); + + protected int GetStartOfNodeExcludingAttributes(SyntaxNode node) + { + var attributeLists = GetAttributeLists(node); + var start = attributeLists.LastOrDefault()?.GetLastToken().GetNextToken().SpanStart ?? + node.SpanStart; + + return start; + } + + public abstract SyntaxList GetAttributeLists(SyntaxNode node); } } diff --git a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb index daa6d7ff169..8d705b84f89 100644 --- a/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb +++ b/src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb @@ -1746,8 +1746,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return Nothing End If - Dim start = If(statement.AttributeLists.LastOrDefault()?.GetLastToken().GetNextToken().SpanStart, - statement.SpanStart) + Dim start = GetStartOfNodeExcludingAttributes(statement) Dim _end = If(statement.TypeParameterList?.GetLastToken().FullSpan.End, statement.Identifier.FullSpan.End) @@ -1761,20 +1760,20 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return False End If - Dim start = If(propertyDeclaration.AttributeLists.LastOrDefault()?.GetLastToken().GetNextToken().SpanStart, propertyDeclaration.SpanStart) + Dim start = GetStartOfNodeExcludingAttributes(propertyDeclaration) Dim [end] = If(propertyDeclaration.AsClause?.FullSpan.[End], propertyDeclaration.Identifier.FullSpan.End) Return node.Span.Start >= start AndAlso node.Span.[End] <= [end] End Function Public Function IsInParameterHeader(node As SyntaxNode) As Boolean Implements ISyntaxFactsService.IsInParameterHeader - Dim propertyDeclaration = node.GetAncestor(Of ParameterSyntax)() + Dim parameter = node.GetAncestor(Of ParameterSyntax)() - If propertyDeclaration Is Nothing Then + If parameter Is Nothing Then Return False End If - Dim start = If(propertyDeclaration.AttributeLists.LastOrDefault()?.GetLastToken().GetNextToken().SpanStart, propertyDeclaration.SpanStart) - Dim [end] = If(propertyDeclaration.AsClause?.FullSpan.[End], propertyDeclaration.Identifier.FullSpan.End) + Dim start = GetStartOfNodeExcludingAttributes(parameter) + Dim [end] = If(parameter.AsClause?.FullSpan.[End], parameter.Identifier.FullSpan.End) Return node.Span.Start >= start AndAlso node.Span.[End] <= [end] End Function @@ -1977,7 +1976,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Return node.GetAncestorOrThis(Of ParameterSyntax) End Function - Public Function GetAttributeLists(node As SyntaxNode) As SyntaxList(Of SyntaxNode) Implements ISyntaxFactsService.GetAttributeLists + Public Overrides Function GetAttributeLists(node As SyntaxNode) As SyntaxList(Of SyntaxNode) Implements ISyntaxFactsService.GetAttributeLists Return VisualBasicSyntaxGenerator.GetAttributeLists(node) End Function End Class -- GitLab