Пример #1
0
 internal static bool IsInsideTag(XamlAnalyzer.ParseState state)
 {
     if (state != XamlAnalyzer.ParseState.Content && state != XamlAnalyzer.ParseState.Error && state != XamlAnalyzer.ParseState.TagEnd)
     {
         return(state != XamlAnalyzer.ParseState.EmptyTagEnd);
     }
     return(false);
 }
Пример #2
0
 internal static bool IsAfterTagName(XamlAnalyzer.ParseState state)
 {
     if (state != XamlAnalyzer.ParseState.AfterTagName && state != XamlAnalyzer.ParseState.AttrEquals && state != XamlAnalyzer.ParseState.AttrNamePart)
     {
         return(state == XamlAnalyzer.ParseState.AttrPrefixColon);
     }
     return(true);
 }
Пример #3
0
 private static bool IsInsideClosingTag(IList <XamlAnalyzer.LineState> spans, int startSpanIndex)
 {
     for (int index = startSpanIndex; index >= 0; --index)
     {
         XamlAnalyzer.ParseState parseState1 = spans[index].ParseState;
         XamlAnalyzer.ParseState parseState2 = spans[Math.Max(0, index - 1)].ParseState;
         if (parseState1 == XamlAnalyzer.ParseState.ClosingTagStart)
         {
             return(true);
         }
         if (parseState1 == XamlAnalyzer.ParseState.TagEnd || parseState1 == XamlAnalyzer.ParseState.EmptyTagEnd || parseState1 == XamlAnalyzer.ParseState.TagStart)
         {
             return(false);
         }
         if (parseState2 == XamlAnalyzer.ParseState.ClosingTagStart && parseState1 == XamlAnalyzer.ParseState.ClosingTagNamePart)
         {
             return(true);
         }
     }
     return(false);
 }
Пример #4
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());
        }
Пример #5
0
 internal static bool IsStartTag(XamlAnalyzer.ParseState state)
 {
     return((state & XamlAnalyzer.ParseState.IsClosingTag) != XamlAnalyzer.ParseState.IsClosingTag);
 }
Пример #6
0
        internal static bool Transition(Token token, bool wasWhitespaceSkipped, XamlAnalyzer.ParseState currentState, out XamlAnalyzer.ParseState newState, out IClassificationType classType)
        {
            if (wasWhitespaceSkipped && (currentState == XamlAnalyzer.ParseState.TagNamePart || currentState == XamlAnalyzer.ParseState.TagPrefixColon))
            {
                currentState = XamlAnalyzer.ParseState.AfterTagName;
            }
            switch (token)
            {
            case Token.Assign:
                newState  = XamlAnalyzer.ParseState.AttrEquals;
                classType = XamlAnalyzer.ClassAttrEquals;
                return(true);

            case Token.Colon:
                newState  = currentState != XamlAnalyzer.ParseState.TagNamePart ? (currentState != XamlAnalyzer.ParseState.ClosingTagNamePart ? XamlAnalyzer.ParseState.AttrPrefixColon : XamlAnalyzer.ParseState.ClosingTagPrefixColon) : XamlAnalyzer.ParseState.TagPrefixColon;
                classType = XamlAnalyzer.ClassNameColon;
                return(true);

            case Token.Comment:
                newState  = currentState;
                classType = XamlAnalyzer.ClassComment;
                return(true);

            case Token.EndOfLine:
                newState  = currentState == XamlAnalyzer.ParseState.TagNamePart || currentState == XamlAnalyzer.ParseState.TagPrefixColon ? XamlAnalyzer.ParseState.AfterTagName : currentState;
                classType = XamlAnalyzer.ClassUnknown;
                return(false);

            case Token.EndOfTag:
                newState  = XamlAnalyzer.ParseState.TagEnd;
                classType = XamlAnalyzer.ClassEndTag;
                return(true);

            case Token.EndOfSimpleTag:
                newState  = XamlAnalyzer.ParseState.EmptyTagEnd;
                classType = XamlAnalyzer.ClassEndEmptyTag;
                return(true);

            case Token.Identifier:
                if (XamlAnalyzer.IsAfterTagName(currentState) || currentState == XamlAnalyzer.ParseState.TagNamePart)
                {
                    newState  = XamlAnalyzer.ParseState.AttrNamePart;
                    classType = XamlAnalyzer.ClassAttrNameIdentifier;
                }
                else if (XamlAnalyzer.IsInsideTag(currentState))
                {
                    bool flag = false;
                    if ((currentState & XamlAnalyzer.ParseState.IsClosingTag) == XamlAnalyzer.ParseState.IsClosingTag)
                    {
                        flag = true;
                    }
                    newState  = flag ? XamlAnalyzer.ParseState.ClosingTagNamePart : XamlAnalyzer.ParseState.TagNamePart;
                    classType = XamlAnalyzer.ClassTagNameIdentifier;
                }
                else
                {
                    newState  = currentState;
                    classType = XamlAnalyzer.ClassUnknown;
                }
                return(true);

            case Token.LiteralContentString:
                newState  = XamlAnalyzer.ParseState.Content;
                classType = XamlAnalyzer.ClassNonTagContent;
                return(true);

            case Token.StartOfClosingTag:
                newState  = XamlAnalyzer.ParseState.ClosingTagStart;
                classType = XamlAnalyzer.ClassStartClosingTag;
                return(true);

            case Token.StartOfTag:
                newState  = XamlAnalyzer.ParseState.TagStart;
                classType = XamlAnalyzer.ClassStartTag;
                return(true);

            case Token.StringLiteral:
                newState  = XamlAnalyzer.ParseState.AfterTagName;
                classType = XamlAnalyzer.ClassAttrValue;
                return(true);

            default:
                newState  = currentState;
                classType = XamlAnalyzer.ClassUnknown;
                return(false);
            }
        }