private void ProcessOutliningSpans(
            TaggerContext <IOutliningRegionTag> context, SnapshotSpan snapshotSpan, IOutliningService outliningService, IList <OutliningSpan> regions)
        {
            if (regions != null)
            {
                var snapshot = snapshotSpan.Snapshot;
                regions = GetMultiLineRegions(outliningService, regions, snapshot);

                // Create the outlining tags.
                var tagSpans =
                    from region in regions
                    let spanToCollapse = new SnapshotSpan(snapshot, region.TextSpan.ToSpan())
                                         let hintSpan                     = new SnapshotSpan(snapshot, region.HintSpan.ToSpan())
                                                                  let tag = new Tag(snapshot.TextBuffer,
                                                                                    region.BannerText,
                                                                                    hintSpan,
                                                                                    region.AutoCollapse,
                                                                                    region.IsDefaultCollapsed,
                                                                                    _textEditorFactoryService,
                                                                                    _projectionBufferFactoryService,
                                                                                    _editorOptionsFactoryService)
                                                                            select new TagSpan <IOutliningRegionTag>(spanToCollapse, tag);

                foreach (var tagSpan in tagSpans)
                {
                    context.AddTag(tagSpan);
                }
            }
        }
Beispiel #2
0
 public NQueryOutliningTagger(Workspace workspace, IOutliningService outliningService)
 {
     _workspace        = workspace;
     _outliningService = outliningService;
     _workspace.CurrentDocumentChanged += WorkspaceOnCurrentDocumentChanged;
     InvalidateTags();
 }
 public InvalidOutliningRegionException(IOutliningService service, ITextSnapshot snapshot, Span snapshotSpan, Span regionSpan)
     : base(GetExceptionMessage(service, snapshot, snapshotSpan, regionSpan))
 {
     _service = service;
     _snapshot = snapshot;
     _snapshotSpan = snapshotSpan;
     _regionSpan = regionSpan;
 }
Beispiel #4
0
 public InvalidOutliningRegionException(IOutliningService service, ITextSnapshot snapshot, Span snapshotSpan, Span regionSpan)
     : base(GetExceptionMessage(service, snapshot, snapshotSpan, regionSpan))
 {
     _service      = service;
     _snapshot     = snapshot;
     _snapshotSpan = snapshotSpan;
     _regionSpan   = regionSpan;
 }
Beispiel #5
0
        private IList <OutliningSpan> GetMultiLineRegions(IOutliningService service, IList <OutliningSpan> regions, ITextSnapshot snapshot)
        {
            // Remove any spans that aren't multiline.
            var multiLineRegions = new List <OutliningSpan>(regions.Count);

            foreach (var region in regions)
            {
                if (region != null && region.TextSpan.Length > 0)
                {
                    // Check if any clients produced an invalid OutliningSpan.  If so, filter them
                    // out and report a non-fatal watson so we can attempt to determine the source
                    // of the issue.
                    var snapshotSpan = snapshot.GetFullSpan().Span;
                    var regionSpan   = region.TextSpan.ToSpan();
                    if (!snapshotSpan.Contains(regionSpan))
                    {
                        if (!exceptionReported)
                        {
                            exceptionReported = true;
                            try
                            {
                                throw new InvalidOutliningRegionException(service, snapshot, snapshotSpan, regionSpan);
                            }
                            catch (InvalidOutliningRegionException e) when(FatalError.ReportWithoutCrash(e))
                            {
                            }
                        }
                        continue;
                    }

                    var startLine = snapshot.GetLineNumberFromPosition(region.TextSpan.Start);
                    var endLine   = snapshot.GetLineNumberFromPosition(region.TextSpan.End);
                    if (startLine != endLine)
                    {
                        multiLineRegions.Add(region);
                    }
                }
            }

            return(multiLineRegions);
        }
 private static string GetExceptionMessage(IOutliningService service, ITextSnapshot snapshot, Span snapshotSpan, Span regionSpan)
 {
     return $"OutliningService({service.GetType()}) produced an invalid region.  ITextSnapshot span is {snapshotSpan}. OutliningSpan is {regionSpan}.";
 }
Beispiel #7
0
 private static string GetExceptionMessage(IOutliningService service, ITextSnapshot snapshot, Span snapshotSpan, Span regionSpan)
 {
     return($"OutliningService({service.GetType()}) produced an invalid region.  ITextSnapshot span is {snapshotSpan}. OutliningSpan is {regionSpan}.");
 }