Microsoft.Language.Xml.Scanner.ScanXmlElement C# (CSharp) Method

ScanXmlElement() private method

private ScanXmlElement ( ScannerState state ) : SyntaxToken
state ScannerState
return SyntaxToken
        private SyntaxToken ScanXmlElement(ScannerState state)
        {
            Debug.Assert(state == ScannerState.Element || state == ScannerState.EndElement || state == ScannerState.DocType);

            SyntaxList<SyntaxNode> leadingTrivia = null;
            while (CanGetChar())
            {
                char c = PeekChar();
                switch (c)
                {
                    // // Whitespace
                    // //  S    ::=    (#x20 | #x9 | #xD | #xA)+
                    case UCH_CR:
                    case UCH_LF:
                        leadingTrivia = ScanXmlTrivia(c);
                        break;
                    case ' ':
                    case UCH_TAB:
                        leadingTrivia = ScanXmlTrivia(c);
                        break;
                    case '/':
                        if (CanGetCharAtOffset(1) && PeekAheadChar(1) == '>')
                        {
                            return XmlMakeEndEmptyElementToken(leadingTrivia);
                        }

                        return XmlMakeDivToken(leadingTrivia);
                    case '>':
                        return XmlMakeGreaterToken(leadingTrivia);
                    case '=':
                        return XmlMakeEqualsToken(leadingTrivia);
                    case '\'':
                    case DWCH_LSMART_Q:
                    case DWCH_RSMART_Q:
                        return XmlMakeSingleQuoteToken(leadingTrivia, c, isOpening: true);
                    case '"':
                    case DWCH_LSMART_DQ:
                    case DWCH_RSMART_DQ:
                        return XmlMakeDoubleQuoteToken(leadingTrivia, c, isOpening: true);
                    case '<':
                        if (CanGetCharAtOffset(1))
                        {
                            char ch = PeekAheadChar(1);
                            switch (ch)
                            {
                                case '!':
                                    if (CanGetCharAtOffset(2))
                                    {
                                        switch ((PeekAheadChar(2)))
                                        {
                                            case '-':
                                                if (CanGetCharAtOffset(3) && PeekAheadChar(3) == '-')
                                                {
                                                    return XmlMakeBeginCommentToken(leadingTrivia, _scanNoTriviaFunc);
                                                }

                                                break;
                                            case '[':
                                                if (CanGetCharAtOffset(8) &&
                                                    PeekAheadChar(3) == 'C' &&
                                                    PeekAheadChar(4) == 'D' &&
                                                    PeekAheadChar(5) == 'A' &&
                                                    PeekAheadChar(6) == 'T' &&
                                                    PeekAheadChar(7) == 'A' &&
                                                    PeekAheadChar(8) == '[')
                                                {
                                                    return XmlMakeBeginCDataToken(leadingTrivia, _scanNoTriviaFunc);
                                                }

                                                break;
                                            case 'D':
                                                if (CanGetCharAtOffset(8) &&
                                                    PeekAheadChar(3) == 'O' &&
                                                    PeekAheadChar(4) == 'C' &&
                                                    PeekAheadChar(5) == 'T' &&
                                                    PeekAheadChar(6) == 'Y' &&
                                                    PeekAheadChar(7) == 'P' &&
                                                    PeekAheadChar(8) == 'E')
                                                {
                                                    return XmlMakeBeginDTDToken(leadingTrivia);
                                                }

                                                break;
                                        }
                                    }

                                    return XmlLessThanExclamationToken(state, leadingTrivia);
                                case '?':
                                    return XmlMakeBeginProcessingInstructionToken(leadingTrivia, _scanNoTriviaFunc);
                                case '/':
                                    return XmlMakeBeginEndElementToken(leadingTrivia, _scanNoTriviaFunc);
                            }
                        }

                        return XmlMakeLessToken(leadingTrivia);
                    case '?':
                        if (CanGetCharAtOffset(1) && PeekAheadChar(1) == '>')
                        {
                            return XmlMakeEndProcessingInstructionToken(leadingTrivia);
                        }

                        return XmlMakeBadToken(leadingTrivia, 1, ERRID.ERR_IllegalXmlNameChar);
                    case '(':
                        return XmlMakeLeftParenToken(leadingTrivia);
                    case ')':
                        return XmlMakeRightParenToken(leadingTrivia);
                    case '!':
                    case ';':
                    case '#':
                    case ',':
                    case '}':
                        return XmlMakeBadToken(leadingTrivia, 1, ERRID.ERR_IllegalXmlNameChar);
                    case ':':
                        return XmlMakeColonToken(leadingTrivia);
                    case '[':
                        return XmlMakeOpenBracketToken(state, leadingTrivia);
                    case ']':
                        return XmlMakeCloseBracketToken(state, leadingTrivia);
                    default:
                        return ScanXmlNcName(leadingTrivia);
                }
            }

            return MakeEofToken(leadingTrivia);
        }
Scanner