bool Scan_TParams(bool declContext)
{
TokenType la0, la1;
// Line 203: ( TT.LT (TParamDeclOrDataType (TT.Comma TParamDeclOrDataType)*)? TT.GT | TT.Dot TT.LBrack TT.RBrack | TT.Not TT.LParen TT.RParen | TT.Not IdWithOptionalTypeParams )
la0 = LA0;
if (la0 == TT.LT) {
if (!TryMatch((int) TT.LT))
return false;
// Line 203: (TParamDeclOrDataType (TT.Comma TParamDeclOrDataType)*)?
switch (LA0) {
case TT.AttrKeyword: case TT.ContextualKeyword: case TT.Id: case TT.In:
case TT.LBrack: case TT.Operator: case TT.Substitute: case TT.TypeKeyword:
{
if (!Scan_TParamDeclOrDataType(declContext))
return false;
// Line 204: (TT.Comma TParamDeclOrDataType)*
for (;;) {
la0 = LA0;
if (la0 == TT.Comma) {
if (!TryMatch((int) TT.Comma))
return false;
if (!Scan_TParamDeclOrDataType(declContext))
return false;
} else
break;
}
}
break;
}
if (!TryMatch((int) TT.GT))
return false;
} else if (la0 == TT.Dot) {
if (!TryMatch((int) TT.Dot))
return false;
if (!TryMatch((int) TT.LBrack))
return false;
if (!TryMatch((int) TT.RBrack))
return false;
} else {
la1 = LA(1);
if (la1 == TT.LParen) {
if (!TryMatch((int) TT.Not))
return false;
if (!TryMatch((int) TT.LParen))
return false;
if (!TryMatch((int) TT.RParen))
return false;
} else {
if (!TryMatch((int) TT.Not))
return false;
if (!Scan_IdWithOptionalTypeParams(declContext))
return false;
}
}
return true;
}