Пример #1
0
        public IEnumerable <ITagSpan <IOutliningRegionTag> > GetTags(NormalizedSnapshotSpanCollection spans)
        {
            //yield break;
            if (spans.Count == 0)
            {
                yield break;
            }
            // Try to retrieve an already parsed list of Tags
            XSharpClassifier xsClassifier = null;

            if (buffer.Properties.ContainsProperty(typeof(XSharpClassifier)))
            {
                xsClassifier = buffer.Properties[typeof(XSharpClassifier)] as XSharpClassifier;
            }

            if (xsClassifier != null)
            {
                //
                ITextSnapshot snapshot        = xsClassifier.Snapshot;
                SnapshotSpan  Span            = new SnapshotSpan(snapshot, 0, snapshot.Length);
                var           classifications = xsClassifier.GetRegionTags();

                SnapshotSpan fullSpan        = new SnapshotSpan(spans[0].Start, spans[spans.Count - 1].End).TranslateTo(snapshot, SpanTrackingMode.EdgeExclusive);
                int          startLineNumber = fullSpan.Start.GetContainingLine().LineNumber;
                int          endLineNumber   = fullSpan.End.GetContainingLine().LineNumber;
                //
                Stack <ClassificationSpan> startStack = new Stack <ClassificationSpan>();
                // convert classifications to an array so there will be no crash when the classifications are changed
                // in another thread.

                // Now, let's have a look at all the Classifications we have in the document
                foreach (var tag in classifications)
                {
                    // Is it a Region ?
                    if (tag.ClassificationType.IsOfType(this.xsharpRegionStartType.Classification))
                    {
                        startStack.Push(tag);
                    }
                    else if (tag.ClassificationType.IsOfType(this.xsharpRegionStopType.Classification) && (startStack.Count > 0))
                    {
                        //
                        var startTag  = startStack.Pop();
                        var startLine = startTag.Span.Start.GetContainingLine();
                        var endLine   = tag.Span.End.GetContainingLine();
                        //
                        if (startTag.Span.Start < tag.Span.End &&
                            startLine.LineNumber <= endLineNumber &&
                            endLine.LineNumber >= startLineNumber)
                        {
                            SnapshotSpan sSpan;
                            try
                            {
                                sSpan = new SnapshotSpan(startLine.Start, endLine.End);
                            }
                            catch (Exception e)
                            {
                                System.Diagnostics.Debug.WriteLine("Incorrect span " + e.Message);
                                sSpan = new SnapshotSpan(startLine.Start, startLine.Start);
                            }
                            hoverText = sSpan.GetText();
                            if (hoverText.Length > 1024)
                            {
                                hoverText = hoverText.Substring(0, 1024) + "\r\n......";
                            }
                            //
                            sSpan = new SnapshotSpan(startLine.Start, startLine.End);
                            ////the region starts at the beginning of the entity, and goes until the *end* of the line that ends.
                            yield return(new TagSpan <IOutliningRegionTag>(
                                             new SnapshotSpan(startLine.End, endLine.End),
                                             new OutliningRegionTag(false, true, ellipsis, hoverText)));
                        }
                    }
                }
            }
            else
            {
                yield break;
            }
        }