private SyntaxToken ScanXmlNcName(SyntaxList<SyntaxNode> precedingTrivia)
{
int Here = 0;
bool IsIllegalChar = false;
bool isFirst = true;
ERRID err = ERRID.ERR_None;
int errUnicode = 0;
string errChar = null;
// TODO - Fix ScanXmlNCName to conform to XML spec instead of old loose scanning.
while (CanGetCharAtOffset(Here))
{
char c = PeekAheadChar(Here);
switch (c)
{
case ':':
case ' ':
case UCH_TAB:
case UCH_LF:
case UCH_CR:
case '=':
case '\'':
case '"':
case '/':
case '>':
case '<':
case '(':
case ')':
case '?':
case ';':
case ',':
case '}':
goto CreateNCNameToken;
default:
var xmlCh = ScanXmlChar(Here);
if (xmlCh.Length == 0)
{
IsIllegalChar = true;
goto CreateNCNameToken;
}
else
{
if (err == ERRID.ERR_None)
{
if (xmlCh.Length == 1)
{
// Non surrogate check
if (isFirst)
{
err = !IsStartNameChar(xmlCh.Char1) ? ERRID.ERR_IllegalXmlStartNameChar : ERRID.ERR_None;
isFirst = false;
}
else
{
err = !IsNameChar(xmlCh.Char1) ? ERRID.ERR_IllegalXmlNameChar : ERRID.ERR_None;
}
if (err != ERRID.ERR_None)
{
errChar = Convert.ToString(xmlCh.Char1);
errUnicode = Convert.ToInt32(xmlCh.Char1);
}
}
else
{
var unicode = UTF16ToUnicode(xmlCh);
if (!(unicode >= 0x10000 && unicode <= 0xEFFFF))
{
err = ERRID.ERR_IllegalXmlNameChar;
errChar = new string(new[]
{
xmlCh.Char1,
xmlCh.Char2
});
errUnicode = unicode;
}
}
}
Here += xmlCh.Length;
}
break;
}
}
CreateNCNameToken:
if (Here != 0)
{
var name = XmlMakeXmlNCNameToken(precedingTrivia.Node, Here);
if (err != ERRID.ERR_None)
{
////name = name.WithDiagnostics(ErrorFactory.ErrorInfo(
//// err, errChar, string.Format("&H{0:X}", errUnicode)));
}
return name;
}
else if (IsIllegalChar)
{
return XmlMakeBadToken(precedingTrivia, 1, ERRID.ERR_IllegalChar);
}
return MakeMissingToken(precedingTrivia, SyntaxKind.XmlNameToken);
}