private ScanTypeFlags ScanNonArrayType(out SyntaxToken lastTokenOfType)
{
ScanTypeFlags result;
if (Current.Kind == SyntaxKind.IdentifierToken && Current.ContextualKind == SyntaxKind.IdentifierToken)
{
lastTokenOfType = NextToken();
while (Current.Kind == SyntaxKind.ColonColonToken)
{
NextToken();
if (Current.Kind != SyntaxKind.IdentifierToken)
{
lastTokenOfType = null;
return ScanTypeFlags.NotType;
}
lastTokenOfType = NextToken();
}
result = ScanTypeFlags.TypeOrExpression;
}
else if (SyntaxFacts.IsPredefinedType(Current))
{
if (Current.Kind == SyntaxKind.UnsignedKeyword)
{
if (Lookahead.Kind != SyntaxKind.IntKeyword)
{
// Can't be a type!
lastTokenOfType = null;
return ScanTypeFlags.NotType;
}
else
{
NextToken();
}
}
if (Lookahead.Kind == SyntaxKind.LessThanToken)
{
NextToken();
// Generic type.
while (Current.Kind != SyntaxKind.EndOfFileToken)
{
NextToken();
if (Current.Kind == SyntaxKind.GreaterThanToken)
break;
}
}
lastTokenOfType = NextToken();
result = ScanTypeFlags.MustBeType;
}
else if (Current.Kind == SyntaxKind.StructKeyword)
{
var unused = ParseStructType();
lastTokenOfType = unused.CloseBraceToken;
result = ScanTypeFlags.MustBeType;
}
else if (Current.Kind == SyntaxKind.ClassKeyword)
{
var unused = ParseClassType();
lastTokenOfType = unused.CloseBraceToken;
result = ScanTypeFlags.MustBeType;
}
else if (Current.Kind == SyntaxKind.InterfaceKeyword)
{
var unused = ParseInterfaceType();
lastTokenOfType = unused.CloseBraceToken;
result = ScanTypeFlags.MustBeType;
}
else
{
// Can't be a type!
lastTokenOfType = null;
return ScanTypeFlags.NotType;
}
return result;
}