Skip to content

Outlining tag calculation should not block document open #47188

@sharwell

Description

@sharwell

Currently, outlining tags are synchronously computed during document open. This calculation is not always fast, and will hang the editor for some files. Outlining tags should be asynchronously computed to avoid delays in presenting a file.

🔗 Originally reported at https://developercommunity.visualstudio.com/content/problem/466998/vs-1597-ide-hang.html

Stack trace taken during a UI delay:


  Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.SyntaxNode.GetRedElement(ref Microsoft.CodeAnalysis.SyntaxNode element, int slot) Unknown
  Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.Syntax.SyntaxList.SeparatedWithManyChildren.GetNodeSlot(int i) Unknown
  Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.ChildSyntaxList.ItemInternal(Microsoft.CodeAnalysis.SyntaxNode node, int index) Unknown
  Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.SyntaxNavigator.GetPreviousToken(Microsoft.CodeAnalysis.SyntaxToken current, System.Func<Microsoft.CodeAnalysis.SyntaxToken, bool> predicate, bool searchInsideCurrentTokenLeadingTrivia, System.Func<Microsoft.CodeAnalysis.SyntaxTrivia, bool> stepInto) Unknown
> Microsoft.CodeAnalysis.CSharp.Features.dll!Microsoft.CodeAnalysis.CSharp.Structure.InitializerExpressionStructureProvider.CollectBlockSpans(Microsoft.CodeAnalysis.CSharp.Syntax.InitializerExpressionSyntax node, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder<Microsoft.CodeAnalysis.Structure.BlockSpan> spans, Microsoft.CodeAnalysis.Options.OptionSet options, System.Threading.CancellationToken cancellationToken) Line 65 C#
  Microsoft.CodeAnalysis.Features.dll!Microsoft.CodeAnalysis.Structure.AbstractSyntaxNodeStructureProvider<Microsoft.CodeAnalysis.CSharp.Syntax.InitializerExpressionSyntax>.CollectBlockSpans(Microsoft.CodeAnalysis.SyntaxNode node, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder<Microsoft.CodeAnalysis.Structure.BlockSpan> spans, Microsoft.CodeAnalysis.Options.OptionSet options, System.Threading.CancellationToken cancellationToken) Line 47 C#
  Microsoft.CodeAnalysis.Features.dll!Microsoft.CodeAnalysis.Structure.AbstractSyntaxNodeStructureProvider<System.__Canon>.CollectBlockSpans(Microsoft.CodeAnalysis.Document document, Microsoft.CodeAnalysis.SyntaxNode node, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder<Microsoft.CodeAnalysis.Structure.BlockSpan> spans, System.Threading.CancellationToken cancellationToken) Line 26 C#
  Microsoft.CodeAnalysis.Features.dll!Microsoft.CodeAnalysis.Structure.BlockSpanCollector.GetBlockSpans(Microsoft.CodeAnalysis.SyntaxNode node) Line 65 C#
  Microsoft.CodeAnalysis.Features.dll!Microsoft.CodeAnalysis.Structure.BlockSpanCollector.Collect(Microsoft.CodeAnalysis.SyntaxNode root) Line 59 C#
  Microsoft.CodeAnalysis.Features.dll!Microsoft.CodeAnalysis.Structure.AbstractBlockStructureProvider.ProvideBlockStructureWorker(Microsoft.CodeAnalysis.Structure.BlockStructureContext context, Microsoft.CodeAnalysis.SyntaxNode syntaxRoot) Line 70 C#
  Microsoft.CodeAnalysis.Features.dll!Microsoft.CodeAnalysis.Structure.AbstractBlockStructureProvider.ProvideBlockStructure(Microsoft.CodeAnalysis.Structure.BlockStructureContext context) Line 38 C#
  Microsoft.CodeAnalysis.Features.dll!Microsoft.CodeAnalysis.Structure.BlockStructureServiceWithProviders.GetBlockStructure(Microsoft.CodeAnalysis.Document document, System.Threading.CancellationToken cancellationToken) Line 60 C#
  Microsoft.CodeAnalysis.EditorFeatures.Wpf.dll!Microsoft.CodeAnalysis.Editor.Implementation.Structure.AbstractStructureTaggerProvider<Microsoft.VisualStudio.Text.Tagging.IOutliningRegionTag>.ProduceTagsSynchronously(Microsoft.CodeAnalysis.Editor.Tagging.TaggerContext<Microsoft.VisualStudio.Text.Tagging.IOutliningRegionTag> context, Microsoft.CodeAnalysis.Editor.DocumentSnapshotSpan documentSnapshotSpan, int? caretPosition) Line 127 C#
  Microsoft.CodeAnalysis.EditorFeatures.dll!Microsoft.CodeAnalysis.Editor.Tagging.AbstractAsynchronousTaggerProvider<Microsoft.VisualStudio.Text.Tagging.IOutliningRegionTag>.ProduceTagsSynchronously(Microsoft.CodeAnalysis.Editor.Tagging.TaggerContext<Microsoft.VisualStudio.Text.Tagging.IOutliningRegionTag> context) Line 214 C#
  Microsoft.CodeAnalysis.EditorFeatures.dll!Microsoft.CodeAnalysis.Editor.Tagging.AbstractAsynchronousTaggerProvider<Microsoft.VisualStudio.Text.Tagging.IOutliningRegionTag>.TagSource.GetAccurateTagIntervalTreeForBuffer(Microsoft.VisualStudio.Text.ITextBuffer buffer, System.Threading.CancellationToken cancellationToken) Line 662 C#
  Microsoft.CodeAnalysis.EditorFeatures.dll!Microsoft.CodeAnalysis.Editor.Tagging.AbstractAsynchronousTaggerProvider<Microsoft.VisualStudio.Text.Tagging.IOutliningRegionTag>.Tagger.GetTagsWorker(Microsoft.VisualStudio.Text.NormalizedSnapshotSpanCollection requestedSpans, bool accurate, System.Threading.CancellationToken cancellationToken) Line 236 C#
  Microsoft.CodeAnalysis.EditorFeatures.dll!Microsoft.CodeAnalysis.Editor.Tagging.AbstractAsynchronousTaggerProvider<System.__Canon>.Tagger.GetAllTags(Microsoft.VisualStudio.Text.NormalizedSnapshotSpanCollection requestedSpans, System.Threading.CancellationToken cancellationToken) Line 219 C#
  Microsoft.VisualStudio.LanguageServices.dll!Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService.AbstractLanguageService<Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpPackage, Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpLanguageService>.EnsureOutliningTagsComputed(Microsoft.VisualStudio.Text.Editor.IWpfTextView wpfTextView) Line 351 C#
  Microsoft.VisualStudio.LanguageServices.dll!Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService.AbstractLanguageService<Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpPackage, Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpLanguageService>.ConditionallyCollapseOutliningRegions(Microsoft.VisualStudio.TextManager.Interop.IVsTextView textView, Microsoft.VisualStudio.Text.Editor.IWpfTextView wpfTextView, Microsoft.CodeAnalysis.Workspace workspace, bool isOpenMetadataAsSource) Line 311 C#
  Microsoft.VisualStudio.LanguageServices.dll!Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService.AbstractLanguageService<Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpPackage, Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpLanguageService>.SetupNewTextView(Microsoft.VisualStudio.TextManager.Interop.IVsTextView textView) Line 254 C#
  Microsoft.VisualStudio.LanguageServices.dll!Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService.AbstractLanguageService<Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpPackage, Microsoft.VisualStudio.LanguageServices.CSharp.LanguageService.CSharpLanguageService>.VsCodeWindowManager.AddAdornments() Line 156 C#
  Microsoft.VisualStudio.Editor.Implementation.dll!Microsoft.VisualStudio.Editor.Implementation.CompoundTextViewWindow.TextDocData_OnNewLanguageService(ref System.Guid sidLangServiceID) Unknown
  Microsoft.VisualStudio.Editor.Implementation.dll!Microsoft.VisualStudio.Editor.Implementation.CompoundTextViewWindowPane.OnTextViewHostUpdated(object sender, System.EventArgs e) Unknown
  Microsoft.VisualStudio.Editor.Implementation.dll!Microsoft.VisualStudio.Editor.Implementation.SimpleTextViewWindow.Init_InitializeWpfTextView() Unknown

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions