diff --git a/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs b/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs index f7c39cc9e6b4d16258c8187e14ff2dd6875ec153..b3e8f042eff0d6cc1647630f543d37c32e70884d 100644 --- a/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs +++ b/src/Features/CSharp/Portable/Structure/CSharpStructureHelpers.cs @@ -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(); @@ -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( diff --git a/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs b/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs index d9b32502bf726f5765d853f82b5f83a0cc5ea532..2166be6d5ecfe3ae28947e95ea0190c5af9a7313 100644 --- a/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.cs @@ -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)) { diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb index 5ff2b2fea5a28ee7233179422f1b3977e3928de8..e9896945a443e963e652888f02999f95eaf071b6 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/AccessorDeclarationStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb index 469739d8f8d8e83b5460d110c188f647719a23ef..5af64f0e93355844fb892d134197fda5b37e45bc 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/CompilationUnitStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb index 92f46a327755c2672d7f1b1113f7468f002fed43..41599acfc9712e6ed88eaa18bbff7924af496859 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/ConstructorDeclarationStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb index 6c05ff0134e9336f67feb04f9b7ed6f67439eeb0..96716d8240510493f6828748d5a11bc6bf51d163 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/DisabledTextTriviaStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/DoLoopBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/DoLoopBlockStructureProvider.vb index 17485583732b353a17340180b32c213915dc7922..3b649029dd446783f1719c3c8a0e270f6e58dc35 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/DoLoopBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/DoLoopBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb index ad07fbda15ba25c91847b4517341c34be5d19bc9..c9d8b7d175b9f39505a4fb1c82ce0f9d35e16cdb 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/DocumentationCommentStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb index f835b4cec921460d4a76ac1bee4e3a21d224bcb1..cdcd2c4bb7ac005d0d29b8c74a555ee783fcdae3 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/EnumDeclarationStructureProvider.vb @@ -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)) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb index e9c4655d1a2e9b6d5634059c16dfefaeb0a01e8f..d129ed6c23cb92c67324ebee3ef6607073c7b822 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/EventDeclarationStructureProvider.vb @@ -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)) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/ForBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/ForBlockStructureProvider.vb index 44e8e0b1e5bdf5ea5822a454c146feab24834cf8..8b05b857d9ac7f24bae6180a1825412e9a42e3f9 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/ForBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/ForBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/ForEachBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/ForEachBlockStructureProvider.vb index 72b40b42b382481a9617f547f41427d4f8c4e72b..8f82347bf699949fd487d2ec6b5a360021bba16a 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/ForEachBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/ForEachBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb index 836782d91c0ed810bfaa988c94d855b136b018fe..9b14eedcc13b1ba449d1af98ca33fac0724f9656 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MetadataAsSource/MetadataRegionDirectiveStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb index cbf5d033dc513288dc6efaa696b5a16e9eb1ea3c..5efb9c54c7667a4edadcd7b6b28d1ca213638263 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MethodDeclarationStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MultiLineIfBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MultiLineIfBlockStructureProvider.vb index db9307a30c0408088dd95cbbad338e50ab897c4e..e3b02ba2cc5ae33ab2443492060c3ec6556d3926 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MultiLineIfBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MultiLineIfBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb index 681a8b93b3a33f67d72c45f1b30a31f93e5c93b7..81278cd655f9e4daad458a52cd950c6f42d299ca 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/MultilineLambdaStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb index 3a1d54e257a2baeaf92f8408d6a337f901485408..d6e1bc5b591cfa89f8678d7d1ba3647ec5047737 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/NamespaceDeclarationStructureProvider.vb @@ -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)) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb index 713fd74427b53d8d33e21cd054b83619ce31e861..11d8de8105f7921d97dc882955e03c4530587724 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/OperatorDeclarationStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb index a4729f97ebd2dbbe07d73c9738b4939929d95c80..9d001779911f637edf911c1b2837cd4980a526e1 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/PropertyDeclarationStructureProvider.vb @@ -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)) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb index 9023328bf7968f6c616b562f59f7553ccbeb92bc..616c30e10689d61f66c591532bd1a3d52a3a618e 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/RegionDirectiveStructureProvider.vb @@ -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, diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/SelectBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/SelectBlockStructureProvider.vb index 3843db0b72e93200f507d4c042cf56c56fc74995..b106f4812aa136edb9cdd9780bddfbc38623a523 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/SelectBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/SelectBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/SyncLockBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/SyncLockBlockStructureProvider.vb index 19b36d81abb5054b7d6287b93b51be45d585992e..8aa6436ac2c62713ac0fcb40c9d3fcb1db93e271 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/SyncLockBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/SyncLockBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/TryBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/TryBlockStructureProvider.vb index 558d675e6846e0c032f8457ab2c06a99347c0186..75644a7400d2dfd7c5e571212c415f71aa5ee3d8 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/TryBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/TryBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb index c413e7e0cc8d6354b8aa674319ef7cc3cb631a36..929b5ca0dc5cc5e2694e506dc541bfc2e6b7b44e 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/TypeDeclarationStructureProvider.vb @@ -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)) diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/UsingBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/UsingBlockStructureProvider.vb index 5b51d2870431ff4e642043a1c7f3e1e69365bdae..d8890b4820a38049553523494bb1142c8513f302 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/UsingBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/UsingBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/WhileBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/WhileBlockStructureProvider.vb index e7360631498257149cd50046418fb7f207bdf387..f61f2e33dc7b4692d7db69adfa2db4c9c49e9aff 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/WhileBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/WhileBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/WithBlockStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/WithBlockStructureProvider.vb index 49235a2a7a7ee2ac4d184e273653e806cc1d5d79..c89fc1709fbb2943a1756648a8e344e44ac46ac5 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/WithBlockStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/WithBlockStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb b/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb index f56ab94911208c75613f2a70de5cd6a1c413d804..138066e148cbaf17fcc7f0f0ecfb2e4a61e8c950 100644 --- a/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb +++ b/src/Features/VisualBasic/Portable/Structure/Providers/XmlExpressionStructureProvider.vb @@ -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 diff --git a/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb b/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb index c73326e9d64eafb4e618e8e28de6c9e8c73df9c3..f463e59e21f5601193b5e40893d909c41246d2ba 100644 --- a/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb +++ b/src/Features/VisualBasic/Portable/Structure/VisualBasicStructureHelpers.vb @@ -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