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

ScanXmlReference() private method

private ScanXmlReference ( SyntaxList precedingTrivia ) : Microsoft.Language.Xml.XmlTextTokenSyntax
precedingTrivia SyntaxList
return Microsoft.Language.Xml.XmlTextTokenSyntax
        private XmlTextTokenSyntax ScanXmlReference(SyntaxList<SyntaxNode> precedingTrivia)
        {
            Debug.Assert(CanGetChar());
            Debug.Assert(PeekChar() == '&');
            // skip 1 char for "&"
            if (CanGetCharAtOffset(1))
            {
                char c = PeekAheadChar(1);
                switch (c)
                {
                    case '#':
                        var Here = 2;
                        var result = ScanXmlCharRef(ref Here);
                        if (result.Length != 0)
                        {
                            string value = null;
                            if (result.Length == 1)
                            {
                                value = Intern(result.Char1);
                            }
                            else if (result.Length == 2)
                            {
                                value = Intern(new[]
                                {
                                    result.Char1, result.Char2
                                });
                            }

                            if (CanGetCharAtOffset(Here) && PeekAheadChar(Here) == ';')
                            {
                                return XmlMakeEntityLiteralToken(precedingTrivia, Here + 1, value);
                            }
                            else
                            {
                                var noSemicolon = XmlMakeEntityLiteralToken(precedingTrivia, Here, value);
                                var noSemicolonError = ErrorFactory.ErrorInfo(ERRID.ERR_ExpectedSColon);
                                return ((XmlTextTokenSyntax)noSemicolon.SetDiagnostics(new[]
                                {
                                    noSemicolonError
                                }));
                            }
                        }

                        break;
                    case 'a':
                        // // &amp;
                        // // &apos;
                        if (CanGetCharAtOffset(4) && PeekAheadChar(2) == 'm' && PeekAheadChar(3) == 'p')
                        {
                            if (PeekAheadChar(4) == ';')
                            {
                                return XmlMakeAmpLiteralToken(precedingTrivia);
                            }
                            else
                            {
                                var noSemicolon = XmlMakeEntityLiteralToken(precedingTrivia, 4, "&");
                                var noSemicolonError = ErrorFactory.ErrorInfo(ERRID.ERR_ExpectedSColon);
                                return ((XmlTextTokenSyntax)noSemicolon.SetDiagnostics(new[]
                                {
                                noSemicolonError
                                }));
                            }
                        }
                        else if (CanGetCharAtOffset(5) && PeekAheadChar(2) == 'p' && PeekAheadChar(3) == 'o' && PeekAheadChar(4) == 's')
                        {
                            if (PeekAheadChar(5) == ';')
                            {
                                return XmlMakeAposLiteralToken(precedingTrivia);
                            }
                            else
                            {
                                var noSemicolon = XmlMakeEntityLiteralToken(precedingTrivia, 5, "'");
                                var noSemicolonError = ErrorFactory.ErrorInfo(ERRID.ERR_ExpectedSColon);
                                return ((XmlTextTokenSyntax)noSemicolon.SetDiagnostics(new[]
                                {
                                    noSemicolonError
                                }));
                            }
                        }

                        break;
                    case 'l':
                        // // &lt;
                        if (CanGetCharAtOffset(3) && PeekAheadChar(2) == 't')
                        {
                            if (PeekAheadChar(3) == ';')
                            {
                                return XmlMakeLtLiteralToken(precedingTrivia);
                            }
                            else
                            {
                                var noSemicolon = XmlMakeEntityLiteralToken(precedingTrivia, 3, "<");
                                var noSemicolonError = ErrorFactory.ErrorInfo(ERRID.ERR_ExpectedSColon);
                                return ((XmlTextTokenSyntax)noSemicolon.SetDiagnostics(new[]
                                {
                                    noSemicolonError
                                }));
                            }
                        }

                        break;
                    case 'g':
                        // // &gt;
                        if (CanGetCharAtOffset(3) && PeekAheadChar(2) == 't')
                        {
                            if (PeekAheadChar(3) == ';')
                            {
                                return XmlMakeGtLiteralToken(precedingTrivia);
                            }
                            else
                            {
                                var noSemicolon = XmlMakeEntityLiteralToken(precedingTrivia, 3, ">");
                                var noSemicolonError = ErrorFactory.ErrorInfo(ERRID.ERR_ExpectedSColon);
                                return ((XmlTextTokenSyntax)noSemicolon.SetDiagnostics(new[]
                                {
                                    noSemicolonError
                                }));
                            }
                        }

                        break;
                    case 'q':
                        // // &quot;
                        if (CanGetCharAtOffset(5) &&
                            PeekAheadChar(2) == 'u' &&
                            PeekAheadChar(3) == 'o' &&
                            PeekAheadChar(4) == 't')
                        {
                            if (PeekAheadChar(5) == ';')
                            {
                                return XmlMakeQuotLiteralToken(precedingTrivia);
                            }
                            else
                            {
                                var noSemicolon = XmlMakeEntityLiteralToken(precedingTrivia, 5, "\"");
                                var noSemicolonError = ErrorFactory.ErrorInfo(ERRID.ERR_ExpectedSColon);
                                return ((XmlTextTokenSyntax)noSemicolon.SetDiagnostics(new[]
                                {
                                    noSemicolonError
                                }));
                            }
                        }

                        break;
                }
            }

            var badEntity = XmlMakeEntityLiteralToken(precedingTrivia, 1, "");
            var errInfo = ErrorFactory.ErrorInfo(ERRID.ERR_XmlEntityReference);
            return ((XmlTextTokenSyntax)badEntity.SetDiagnostics(new[]
            {
                errInfo
            }));
        }
Scanner