示例#1
0
 public IEnumerable <ClassificationPosition> Tokens(SnapshotSpan spanToTokenize)
 {
     if (!spanToTokenize.IsEmpty)
     {
         SnapshotSpan startTagLine        = this.statefulClassifier.GetSpanToTokenize(spanToTokenize);
         IList <ClassificationSpan> spans = this.statefulClassifier.GetClassificationSpans(startTagLine);
         int startTagStartSpanIndex       = OrderedListExtensions.GenericBinarySearch <ClassificationSpan, int>(spans, spanToTokenize.Start, (Func <int, ClassificationSpan, int>)((pos, span) => pos - span.Span.Start));
         if (startTagStartSpanIndex >= 0 && spans[startTagStartSpanIndex].ClassificationType == XamlAnalyzer.ClassStartTag)
         {
             int startTagEndSpanIndex = OrderedListExtensions.GenericBinarySearch <ClassificationSpan, int>(spans, spanToTokenize.End, (Func <int, ClassificationSpan, int>)((pos, span) => pos - span.Span.Start));
             if (startTagEndSpanIndex < 0)
             {
                 startTagEndSpanIndex = ~startTagEndSpanIndex;
             }
             ClassificationPosition interestingPosition = new ClassificationPosition()
             {
                 CurrentLine      = startTagLine,
                 CurrentSpanList  = spans,
                 CurrentSpanIndex = startTagStartSpanIndex
             };
             foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanForward(interestingPosition))
             {
                 if (classificationPosition.CurrentSpan.Span.Start >= spanToTokenize.Span.End)
                 {
                     break;
                 }
                 yield return(classificationPosition);
             }
         }
     }
 }
示例#2
0
        public IEnumerable <ClassificationPosition> BackwardClassificationPositions(SnapshotPoint position, bool includeStartPosition)
        {
            ClassificationPosition startPosition = this.CreateClassificationPosition(position);

            if (includeStartPosition)
            {
                yield return(startPosition);
            }
            foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanBackward(startPosition))
            {
                yield return(classificationPosition);
            }
        }
示例#3
0
        public SnapshotSpan GetMatchingEndTag(SnapshotSpan startTagSpan)
        {
            SnapshotSpan spanToTokenize = this.statefulClassifier.GetSpanToTokenize(startTagSpan);
            IList <ClassificationSpan> classificationSpans = this.statefulClassifier.GetClassificationSpans(spanToTokenize);
            int index = OrderedListExtensions.GenericBinarySearch <ClassificationSpan, int>(classificationSpans, startTagSpan.Start, (Func <int, ClassificationSpan, int>)((pos, span) => pos - span.Span.Start));

            if (index < 0 || classificationSpans[index].ClassificationType != XamlAnalyzer.ClassStartTag)
            {
                return(new SnapshotSpan());
            }
            int num1 = OrderedListExtensions.GenericBinarySearch <ClassificationSpan, int>(classificationSpans, startTagSpan.End, (Func <int, ClassificationSpan, int>)((pos, span) => pos - span.Span.Start));

            if (num1 < 0)
            {
                num1 = ~num1;
            }
            ClassificationPosition startPosition = new ClassificationPosition()
            {
                CurrentLine      = spanToTokenize,
                CurrentSpanList  = classificationSpans,
                CurrentSpanIndex = num1
            };
            int num2  = 1;
            int start = -1;

            foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanForward(startPosition))
            {
                num2 += XamlAnalyzer.TagDepthDelta(true, classificationPosition.CurrentSpan.ClassificationType);
                if (num2 == 0)
                {
                    start         = classificationPosition.CurrentSpan.Span.Start;
                    startPosition = classificationPosition;
                    break;
                }
            }
            if (start >= 0)
            {
                foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanForward(startPosition))
                {
                    if (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassEndTag)
                    {
                        return(new SnapshotSpan(classificationPosition.Snapshot, new Span(start, classificationPosition.CurrentSpan.Span.End - start)));
                    }
                }
            }
            return(new SnapshotSpan());
        }
        public IEnumerable <ClassificationPosition> ScanForward(ClassificationPosition startPosition)
        {
            ClassificationPosition currentPosition = startPosition;

            while (!currentPosition.CurrentLine.IsEmpty)
            {
                for (; currentPosition.CurrentSpanIndex < currentPosition.CurrentSpanList.Count; ++currentPosition.CurrentSpanIndex)
                {
                    yield return(currentPosition);
                }
                currentPosition.CurrentLine = this.GetNextSpanToTokenize(currentPosition.Snapshot, currentPosition.CurrentLine.End);
                if (!currentPosition.CurrentLine.IsEmpty)
                {
                    currentPosition.CurrentSpanList  = this.GetClassificationSpans(currentPosition.CurrentLine);
                    currentPosition.CurrentSpanIndex = 0;
                }
            }
        }
        public IEnumerable <ClassificationPosition> ScanBackward(ClassificationPosition startPosition)
        {
            ClassificationPosition currentPosition = startPosition;

            --currentPosition.CurrentSpanIndex;
            while (!currentPosition.CurrentLine.IsEmpty)
            {
                for (; currentPosition.CurrentSpanIndex >= 0; --currentPosition.CurrentSpanIndex)
                {
                    yield return(currentPosition);
                }
                currentPosition.CurrentLine = this.GetPreviousSpanToTokenize(currentPosition.Snapshot, currentPosition.CurrentLine.Start);
                if (!currentPosition.CurrentLine.IsEmpty)
                {
                    currentPosition.CurrentSpanList  = this.GetClassificationSpans(currentPosition.CurrentLine);
                    currentPosition.CurrentSpanIndex = currentPosition.CurrentSpanList.Count - 1;
                }
            }
        }
示例#6
0
        private SnapshotSpan GetContainingTag(SnapshotPoint position, bool shouldReturnCloseTagSpan, out bool isInCloseTag, bool returnEmptySpanOnContent)
        {
            isInCloseTag = false;
            SnapshotSpan spanToTokenize = this.statefulClassifier.GetSpanToTokenize(position);

            XamlAnalyzer.LineState         state1 = this.statefulClassifier.GetState(spanToTokenize.Snapshot, spanToTokenize.Start);
            IList <ClassificationSpan>     list1  = (IList <ClassificationSpan>) new List <ClassificationSpan>();
            IList <XamlAnalyzer.LineState> list2  = (IList <XamlAnalyzer.LineState>) new List <XamlAnalyzer.LineState>();

            XamlAnalyzer.LineState endState;
            this.classificationScanner.GetClassificationSpansWorker(spanToTokenize, list1, list2, state1, out endState);
            int num1 = OrderedListExtensions.GenericBinarySearch <ClassificationSpan, SnapshotPoint>(list1, position, (Func <SnapshotPoint, ClassificationSpan, int>)((pos, span) => pos.Position - span.Span.Start));

            if (num1 < 0)
            {
                num1 = ~num1;
            }
            int startSpanIndex = num1 - 1;

            XamlAnalyzer.ParseState state2 = startSpanIndex >= 0 ? list2[startSpanIndex].ParseState : state1.ParseState;
            if (XamlAnalyzer.IsInsideClosingTag(list2, startSpanIndex))
            {
                isInCloseTag = true;
                ClassificationPosition startPosition = new ClassificationPosition()
                {
                    CurrentLine      = spanToTokenize,
                    CurrentSpanList  = list1,
                    CurrentSpanIndex = startSpanIndex
                };
                int currentSpanIndex = startPosition.CurrentSpanIndex;
                if (startSpanIndex >= 0 && startPosition.CurrentSpan.ClassificationType != XamlAnalyzer.ClassStartClosingTag)
                {
                    foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanBackward(startPosition))
                    {
                        if (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassStartClosingTag)
                        {
                            startPosition    = classificationPosition;
                            currentSpanIndex = classificationPosition.CurrentSpanIndex;
                            break;
                        }
                    }
                }
                if (shouldReturnCloseTagSpan)
                {
                    int start = startPosition.CurrentSpanList[Math.Max(0, currentSpanIndex)].Span.Start;
                    int end   = startPosition.CurrentSpanList[Math.Max(0, currentSpanIndex)].Span.End;
                    for (int index = currentSpanIndex + 1; index < startPosition.CurrentSpanList.Count && XamlAnalyzer.IsTokenValidInCloseTag(startPosition.CurrentSpanList[index].ClassificationType); ++index)
                    {
                        end = startPosition.CurrentSpanList[index].Span.End;
                    }
                    return(new SnapshotSpan(startPosition.Snapshot, start, end - start));
                }
                int num2 = 1;
                foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanBackward(startPosition))
                {
                    num2 += XamlAnalyzer.TagDepthDelta(false, classificationPosition.CurrentSpan.ClassificationType);
                    if (num2 == 0)
                    {
                        startPosition = classificationPosition;
                        break;
                    }
                }
                if (num2 != 0)
                {
                    return(new SnapshotSpan());
                }
                int start1 = startPosition.CurrentSpan.Span.Start;
                foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanForward(startPosition))
                {
                    if (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassEndTag || classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassEndEmptyTag)
                    {
                        return(new SnapshotSpan(classificationPosition.Snapshot, new Span(start1, classificationPosition.CurrentSpan.Span.End - start1)));
                    }
                    if (classificationPosition.CurrentSpan.Span != startPosition.CurrentSpan.Span && (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassStartTag || classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassStartClosingTag))
                    {
                        return(new SnapshotSpan(classificationPosition.Snapshot, new Span(start1, classificationPosition.CurrentSpan.Span.Start - start1)));
                    }
                }
            }
            else if (XamlAnalyzer.IsInsideTag(state2))
            {
                ClassificationPosition startPosition = new ClassificationPosition()
                {
                    CurrentLine      = spanToTokenize,
                    CurrentSpanList  = list1,
                    CurrentSpanIndex = startSpanIndex
                };
                int start = -1;
                if (startPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassStartTag)
                {
                    start = startPosition.CurrentSpan.Span.Start;
                }
                else
                {
                    foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanBackward(startPosition))
                    {
                        if (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassStartTag)
                        {
                            start = classificationPosition.CurrentSpan.Span.Start;
                            break;
                        }
                    }
                }
                int num2 = startPosition.Snapshot.Length;
                foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanForward(startPosition))
                {
                    if (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassEndEmptyTag || classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassEndTag)
                    {
                        num2 = classificationPosition.CurrentSpan.Span.End;
                        break;
                    }
                    if (classificationPosition.CurrentSpan.Span != startPosition.CurrentSpan.Span && (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassStartTag || classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassStartClosingTag))
                    {
                        num2 = classificationPosition.CurrentSpan.Span.Start;
                        break;
                    }
                }
                if (start >= 0 && num2 > start)
                {
                    return(new SnapshotSpan(startPosition.Snapshot, new Span(start, num2 - start)));
                }
            }
            else
            {
                if (returnEmptySpanOnContent)
                {
                    return(new SnapshotSpan());
                }
                int num2 = state2 == XamlAnalyzer.ParseState.EmptyTagEnd ? 2 : 1;
                ClassificationPosition startPosition = new ClassificationPosition()
                {
                    CurrentLine      = spanToTokenize,
                    CurrentSpanList  = list1,
                    CurrentSpanIndex = startSpanIndex
                };
                foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanBackward(startPosition))
                {
                    num2 += XamlAnalyzer.TagDepthDelta(false, classificationPosition.CurrentSpan.ClassificationType);
                    if (num2 == 0)
                    {
                        startPosition = classificationPosition;
                        break;
                    }
                }
                if (num2 != 0)
                {
                    return(new SnapshotSpan());
                }
                int start = startPosition.CurrentSpan.Span.Start;
                foreach (ClassificationPosition classificationPosition in this.statefulClassifier.ScanForward(startPosition))
                {
                    if (classificationPosition.CurrentSpan.ClassificationType == XamlAnalyzer.ClassEndTag)
                    {
                        return(new SnapshotSpan(classificationPosition.Snapshot, new Span(start, classificationPosition.CurrentSpan.Span.End - start)));
                    }
                }
            }
            return(new SnapshotSpan());
        }