1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Added support for C-style vararg methods

This commit is contained in:
Brian Fiete 2020-02-11 07:34:47 -08:00
parent 89e6b0d577
commit 7741344fd2
16 changed files with 129 additions and 68 deletions

View file

@ -4440,13 +4440,21 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF
{
int token = tokenNode->GetToken();
if (token == BfToken_Dot)
{
auto dotTypeRef = mAlloc->Alloc<BfDotTypeReference>();
ReplaceNode(firstNode, dotTypeRef);
dotTypeRef->mDotToken = tokenNode;
firstNode = dotTypeRef;
isHandled = true;
}
else if (token == BfToken_DotDotDot)
{
auto dotTypeRef = mAlloc->Alloc<BfDotTypeReference>();
ReplaceNode(firstNode, dotTypeRef);
dotTypeRef->mDotToken = tokenNode;
firstNode = dotTypeRef;
isHandled = true;
//return dotTypeRef;
return dotTypeRef;
}
else if ((token == BfToken_Star) && (mAllowTypeWildcard))
{
@ -8402,7 +8410,8 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
(token == BfToken_Out) || (token == BfToken_Ref) || (token == BfToken_Mut) ||
(token == BfToken_Delegate) || (token == BfToken_Function) ||
(token == BfToken_Params) || (token == BfToken_LParen) ||
(token == BfToken_Var) || (token == BfToken_LBracket)))
(token == BfToken_Var) || (token == BfToken_LBracket) ||
(token == BfToken_DotDotDot)))
{
// These get picked up below
}
@ -8453,7 +8462,8 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
{
BfToken token = tokenNode->GetToken();
if ((token == BfToken_Var) || (token == BfToken_LParen) ||
(token == BfToken_Delegate) || (token == BfToken_Function))
(token == BfToken_Delegate) || (token == BfToken_Function) ||
(token == BfToken_DotDotDot))
{
mVisitorPos.MoveNext();
typeRef = CreateTypeRef(tokenNode);
@ -8517,6 +8527,9 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
MEMBER_SET(paramDecl, mModToken, modTokenNode);
}
if ((tokenNode != NULL) && (tokenNode->mToken == BfToken_DotDotDot))
continue;
bool allowNameFail = false;
bool nextIsName = false;
auto afterNameTokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.Get(mVisitorPos.mReadPos + 2));