提交 ace57b08 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #15057 from CyrusNajmabadi/blockStructureAttributes2

Don't include VB attributes in the span of a block. We don't want to see those attributes in the indent guide tooltips.

Fixes #14985
......@@ -79,7 +79,7 @@ public static SyntaxToken GetLastInlineMethodBlockToken(SyntaxNode node)
// If the next token is a semicolon, and we aren't in the initializer of a for-loop, use that token as the end.
SyntaxToken nextToken = lastToken.GetNextToken(includeSkipped: true);
var nextToken = lastToken.GetNextToken(includeSkipped: true);
if (nextToken.Kind() != SyntaxKind.None && nextToken.Kind() == SyntaxKind.SemicolonToken)
{
var forStatement = nextToken.GetAncestor<ForStatementSyntax>();
......@@ -99,7 +99,7 @@ private static string CreateCommentBannerTextWithPrefix(string text, string pref
Contract.ThrowIfNull(text);
Contract.ThrowIfNull(prefix);
int prefixLength = prefix.Length;
var prefixLength = prefix.Length;
return prefix + " " + text.Substring(prefixLength).Trim() + " " + Ellipsis;
}
......@@ -113,7 +113,7 @@ private static string GetCommentBannerText(SyntaxTrivia comment)
}
else if (comment.IsMultiLineComment())
{
int lineBreakStart = comment.ToString().IndexOfAny(new char[] { '\r', '\n' });
var lineBreakStart = comment.ToString().IndexOfAny(new char[] { '\r', '\n' });
var text = comment.ToString();
if (lineBreakStart >= 0)
......@@ -257,13 +257,8 @@ private static string GetCommentBannerText(SyntaxTrivia comment)
string type, bool isCollapsible)
{
return CreateBlockSpan(
node,
syntaxToken,
node.GetLastToken(),
bannerText,
autoCollapse,
type,
isCollapsible);
node, syntaxToken, node.GetLastToken(),
bannerText, autoCollapse, type, isCollapsible);
}
public static BlockSpan? CreateBlockSpan(
......@@ -282,7 +277,7 @@ private static string GetCommentBannerText(SyntaxTrivia comment)
// of the next token so indentation in the tooltip is accurate.
var span = TextSpan.FromBounds(GetCollapsibleStart(startToken), endPos);
var hintSpan = TextSpan.FromBounds(node.SpanStart, endPos);
var hintSpan = GetHintSpan(node, endPos);
return CreateBlockSpan(
span,
......@@ -293,19 +288,31 @@ private static string GetCommentBannerText(SyntaxTrivia comment)
isCollapsible);
}
private static TextSpan GetHintSpan(SyntaxNode node, int endPos)
{
// Don't include attributes in the BlockSpan for a node. When the user
// hovers over the indent-guide we don't want to show them the line with
// the attributes, we want to show them the line with the start of the
// actual structure.
foreach (var child in node.ChildNodesAndTokens())
{
if (child.Kind() != SyntaxKind.AttributeList)
{
return TextSpan.FromBounds(child.SpanStart, endPos);
}
}
return TextSpan.FromBounds(node.SpanStart, endPos);
}
public static BlockSpan? CreateBlockSpan(
SyntaxNode node, SyntaxToken startToken,
SyntaxToken endToken, string bannerText, bool autoCollapse,
string type, bool isCollapsible)
{
return CreateBlockSpan(
node,
startToken,
GetCollapsibleEnd(endToken),
bannerText,
autoCollapse,
type,
isCollapsible);
node, startToken, GetCollapsibleEnd(endToken),
bannerText, autoCollapse, type, isCollapsible);
}
public static BlockSpan CreateBlockSpan(
......
......@@ -56,7 +56,7 @@ internal class DisabledTextTriviaStructureProvider : AbstractSyntaxTriviaStructu
}
var nestedIfDirectiveTrivia = 0;
for (int i = indexInParent; i < parentTriviaList.Count; i++)
for (var i = indexInParent; i < parentTriviaList.Count; i++)
{
if (parentTriviaList[i].IsKind(SyntaxKind.IfDirectiveTrivia))
{
......
......@@ -17,9 +17,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(accessorDeclaration.Parent, AccessorBlockSyntax)
If Not block?.EndBlockStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=accessorDeclaration,
autoCollapse:=True, type:=BlockTypes.Member, isCollapsible:=True))
autoCollapse:=True, type:=BlockTypes.Member,
isCollapsible:=True))
End If
End Sub
End Class
......
......@@ -3,6 +3,7 @@
Imports System.Threading
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.Structure
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
......@@ -14,9 +15,18 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
options As OptionSet,
cancellationToken As CancellationToken)
CollectCommentsRegions(compilationUnit, spans)
spans.AddIfNotNull(CreateRegion(
compilationUnit.Imports, bannerText:="Imports" & SpaceEllipsis,
autoCollapse:=True, type:=BlockTypes.Imports, isCollapsible:=True))
If Not compilationUnit.Imports.IsEmpty Then
Dim startPos = compilationUnit.Imports.First().SpanStart
Dim endPos = compilationUnit.Imports.Last().Span.End
Dim span = TextSpan.FromBounds(startPos, endPos)
spans.AddIfNotNull(CreateBlockSpan(
span, span, bannerText:="Imports" & SpaceEllipsis,
autoCollapse:=True, type:=BlockTypes.Imports, isCollapsible:=True,
isDefaultCollapsed:=False))
End If
CollectCommentsRegions(compilationUnit.EndOfFileToken.LeadingTrivia, spans)
End Sub
......
......@@ -19,7 +19,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(constructorDeclaration.Parent, ConstructorBlockSyntax)
If Not block?.EndBlockStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=constructorDeclaration, autoCollapse:=True,
type:=BlockTypes.Member, isCollapsible:=True))
End If
......
......@@ -17,10 +17,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim startPos = nodeSpan.Start
Dim endPos = startPos + trivia.ToString().TrimEnd().Length
spans.AddIfNotNull(CreateRegion(
span:=TextSpan.FromBounds(startPos, endPos),
Dim span = TextSpan.FromBounds(startPos, endPos)
spans.AddIfNotNull(CreateBlockSpan(
span:=span, hintSpan:=span,
bannerText:=Ellipsis, autoCollapse:=True,
type:=BlockTypes.PreprocessorRegion, isCollapsible:=True))
type:=BlockTypes.PreprocessorRegion,
isCollapsible:=True, isDefaultCollapsed:=False))
End If
End Sub
End Class
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.DoStatement, autoCollapse:=False,
type:=BlockTypes.Loop, isCollapsible:=True))
End Sub
......
......@@ -88,9 +88,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim fullSpan = TextSpan.FromBounds(startPos, endPos)
spans.AddIfNotNull(CreateRegion(
fullSpan, GetBannerText(documentationComment, cancellationToken),
autoCollapse:=True, type:=BlockTypes.Comment, isCollapsible:=True))
spans.AddIfNotNull(CreateBlockSpan(
fullSpan, fullSpan, GetBannerText(documentationComment, cancellationToken),
autoCollapse:=True, type:=BlockTypes.Comment,
isCollapsible:=True, isDefaultCollapsed:=False))
End Sub
End Class
End Namespace
\ No newline at end of file
......@@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(enumDeclaration.Parent, EnumBlockSyntax)
If Not block?.EndEnumStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=enumDeclaration, autoCollapse:=True,
type:=BlockTypes.Type, isCollapsible:=True))
......
......@@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(eventDeclaration.Parent, EventBlockSyntax)
If Not block?.EndEventStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=eventDeclaration, autoCollapse:=True,
type:=BlockTypes.Member, isCollapsible:=True))
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.ForOrForEachStatement, autoCollapse:=False,
type:=BlockTypes.Loop, isCollapsible:=True))
End Sub
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.ForOrForEachStatement, autoCollapse:=False,
type:=BlockTypes.Loop, isCollapsible:=True))
End Sub
......
......@@ -26,11 +26,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure.MetadataAsSource
cancellationToken As CancellationToken)
Dim match = regionDirective.GetMatchingStartOrEndDirective(cancellationToken)
If match IsNot Nothing Then
spans.AddIfNotNull(CreateRegion(
TextSpan.FromBounds(regionDirective.SpanStart, match.Span.End),
Dim span = TextSpan.FromBounds(regionDirective.SpanStart, match.Span.End)
spans.AddIfNotNull(CreateBlockSpan(
span, span,
GetBannerText(regionDirective),
autoCollapse:=True,
type:=BlockTypes.PreprocessorRegion, isCollapsible:=True))
autoCollapse:=True, type:=BlockTypes.PreprocessorRegion,
isCollapsible:=True, isDefaultCollapsed:=False))
End If
End Sub
......
......@@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(methodDeclaration.Parent, MethodBlockSyntax)
If Not block?.EndBlockStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=methodDeclaration, autoCollapse:=True,
type:=BlockTypes.Member, isCollapsible:=True))
End If
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.IfStatement, autoCollapse:=False,
type:=BlockTypes.Conditional, isCollapsible:=True))
End Sub
......
......@@ -14,7 +14,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
options As OptionSet,
cancellationToken As CancellationToken)
If Not lambdaExpression.EndSubOrFunctionStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
lambdaExpression, bannerNode:=lambdaExpression.SubOrFunctionHeader, autoCollapse:=False,
type:=BlockTypes.Expression, isCollapsible:=True))
End If
......
......@@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(namespaceDeclaration.Parent, NamespaceBlockSyntax)
If Not block?.EndNamespaceStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=namespaceDeclaration, autoCollapse:=False,
type:=BlockTypes.Namespace, isCollapsible:=True))
......
......@@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(operatorDeclaration.Parent, OperatorBlockSyntax)
If Not block?.EndBlockStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=operatorDeclaration, autoCollapse:=True,
type:=BlockTypes.Member, isCollapsible:=True))
End If
......
......@@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(propertyDeclaration.Parent, PropertyBlockSyntax)
If Not block?.EndPropertyStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=propertyDeclaration, autoCollapse:=True,
type:=BlockTypes.Member, isCollapsible:=True))
......
......@@ -29,8 +29,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim autoCollapse = options.GetOption(
BlockStructureOptions.CollapseRegionsWhenCollapsingToDefinitions, LanguageNames.VisualBasic)
spans.AddIfNotNull(CreateRegion(
TextSpan.FromBounds(regionDirective.SpanStart, matchingDirective.Span.End),
Dim span = TextSpan.FromBounds(regionDirective.SpanStart, matchingDirective.Span.End)
spans.AddIfNotNull(CreateBlockSpan(
span, span,
GetBannerText(regionDirective),
autoCollapse:=autoCollapse,
isDefaultCollapsed:=True,
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.SelectStatement, autoCollapse:=False,
type:=BlockTypes.Conditional, isCollapsible:=True))
End Sub
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.SyncLockStatement, autoCollapse:=False,
type:=BlockTypes.Statement, isCollapsible:=True))
End Sub
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.TryStatement, autoCollapse:=False,
type:=BlockTypes.Statement, isCollapsible:=True))
End Sub
......
......@@ -17,7 +17,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim block = TryCast(typeDeclaration.Parent, TypeBlockSyntax)
If Not block?.EndBlockStatement.IsMissing Then
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
block, bannerNode:=typeDeclaration, autoCollapse:=False,
type:=BlockTypes.Type, isCollapsible:=True))
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.UsingStatement, autoCollapse:=False,
type:=BlockTypes.Statement, isCollapsible:=True))
End Sub
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.WhileStatement, autoCollapse:=False,
type:=BlockTypes.Loop, isCollapsible:=True))
End Sub
......
......@@ -13,7 +13,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
spans As ArrayBuilder(Of BlockSpan),
options As OptionSet,
cancellationToken As CancellationToken)
spans.AddIfNotNull(CreateRegionFromBlock(
spans.AddIfNotNull(CreateBlockSpanFromBlock(
node, node.WithStatement, autoCollapse:=False,
type:=BlockTypes.Statement, isCollapsible:=True))
End Sub
......
......@@ -24,9 +24,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Dim lineText = line.ToString().Substring(span.Start - line.Start)
Dim bannerText = lineText & SpaceEllipsis
spans.AddIfNotNull(CreateRegion(
span, bannerText, autoCollapse:=False,
type:=BlockTypes.Expression, isCollapsible:=True))
spans.AddIfNotNull(CreateBlockSpan(
span, span, bannerText, autoCollapse:=False,
type:=BlockTypes.Expression,
isCollapsible:=True, isDefaultCollapsed:=False))
End Sub
End Class
End Namespace
\ No newline at end of file
......@@ -3,6 +3,7 @@
Imports System.Collections.Immutable
Imports Microsoft.CodeAnalysis.Structure
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Friend Module VisualBasicOutliningHelpers
......@@ -20,12 +21,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
Private Function CreateCommentsRegion(startComment As SyntaxTrivia,
endComment As SyntaxTrivia) As BlockSpan?
Return CreateRegion(
TextSpan.FromBounds(startComment.SpanStart, endComment.Span.End),
Dim span = TextSpan.FromBounds(startComment.SpanStart, endComment.Span.End)
Return CreateBlockSpan(
span, span,
GetCommentBannerText(startComment),
autoCollapse:=True,
type:=BlockTypes.Comment,
isCollapsible:=True)
isCollapsible:=True,
isDefaultCollapsed:=False)
End Function
' For testing purposes
......@@ -76,15 +79,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
CollectCommentsRegions(triviaList, spans)
End Sub
Friend Function CreateRegion(
Friend Function CreateBlockSpan(
span As TextSpan,
hintSpan As TextSpan,
bannerText As String,
autoCollapse As Boolean,
type As String,
isCollapsible As Boolean,
Optional isDefaultCollapsed As Boolean = False) As BlockSpan?
isDefaultCollapsed As Boolean) As BlockSpan?
Return New BlockSpan(
textSpan:=span,
hintSpan:=hintSpan,
bannerText:=bannerText,
autoCollapse:=autoCollapse,
isDefaultCollapsed:=isDefaultCollapsed,
......@@ -92,40 +97,46 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Structure
isCollapsible:=isCollapsible)
End Function
Friend Function CreateRegionFromBlock(
Friend Function CreateBlockSpanFromBlock(
blockNode As SyntaxNode,
bannerText As String,
autoCollapse As Boolean,
type As String,
isCollapsible As Boolean) As BlockSpan?
Return CreateRegion(blockNode.Span, bannerText, autoCollapse, type, isCollapsible)
Return CreateBlockSpan(
blockNode.Span, GetHintSpan(blockNode),
bannerText, autoCollapse,
type, isCollapsible, isDefaultCollapsed:=False)
End Function
Friend Function CreateRegionFromBlock(
Friend Function CreateBlockSpanFromBlock(
blockNode As SyntaxNode,
bannerNode As SyntaxNode,
autoCollapse As Boolean,
type As String,
isCollapsible As Boolean) As BlockSpan?
Return CreateRegion(
blockNode.Span, GetNodeBannerText(bannerNode),
autoCollapse, type, isCollapsible)
Return CreateBlockSpan(
blockNode.Span, GetHintSpan(blockNode),
GetNodeBannerText(bannerNode),
autoCollapse, type, isCollapsible, isDefaultCollapsed:=False)
End Function
Friend Function CreateRegion(syntaxList As IEnumerable(Of SyntaxNode),
bannerText As String,
autoCollapse As Boolean,
type As String,
isCollapsible As Boolean) As BlockSpan?
If syntaxList.IsEmpty() Then
Return Nothing
Private Function GetHintSpan(blockNode As SyntaxNode) As TextSpan
' Don't include attributes in the hint-span for a block. We don't want
' the attributes to show up when users hover over indent guide lines.
Dim firstToken = blockNode.GetFirstToken()
If firstToken.Kind() = SyntaxKind.LessThanToken AndAlso
firstToken.Parent.IsKind(SyntaxKind.AttributeList) Then
Dim attributeOwner = firstToken.Parent.Parent
For Each child In attributeOwner.ChildNodesAndTokens
If child.Kind() <> SyntaxKind.AttributeList Then
Return TextSpan.FromBounds(child.SpanStart, child.Span.End)
End If
Next
End If
Dim startPos = syntaxList.First().SpanStart
Dim endPos = syntaxList.Last().Span.End
Return CreateRegion(
TextSpan.FromBounds(startPos, endPos), bannerText,
autoCollapse, type, isCollapsible)
Return blockNode.Span
End Function
End Module
End Namespace
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册