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':
// // &
// // '
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':
// // <
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':
// // >
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':
// // "
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
}));
}