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

New function/delegate casting rules, similar to tuple rules

This commit is contained in:
Brian Fiete 2020-03-31 07:46:01 -07:00
parent c62dbdf811
commit de6a68911a
8 changed files with 143 additions and 32 deletions

View file

@ -4602,7 +4602,7 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF
BfDeferredAstSizedArray<BfParameterDeclaration*> params(delegateTypeRef->mParams, mAlloc);
BfDeferredAstSizedArray<BfTokenNode*> commas(delegateTypeRef->mCommas, mAlloc);
auto closeNode = ParseMethodParams(delegateTypeRef, &params, &commas, BfToken_RParen);
auto closeNode = ParseMethodParams(delegateTypeRef, &params, &commas, BfToken_RParen, false);
if (closeNode == NULL)
{
if (!params.empty())
@ -6523,7 +6523,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, int depth)
if (openToken == NULL)
return indexerDeclaration;
MEMBER_SET(indexerDeclaration, mOpenBracket, openToken);
auto endToken = ParseMethodParams(indexerDeclaration, &params, &commas, BfToken_RBracket);
auto endToken = ParseMethodParams(indexerDeclaration, &params, &commas, BfToken_RBracket, true);
if (endToken == NULL)
return indexerDeclaration;
MEMBER_SET(indexerDeclaration, mCloseBracket, endToken);
@ -8401,7 +8401,7 @@ BfCommentNode * BfReducer::FindDocumentation(BfAstNode* defNodeHead, BfAstNode*
return NULL;
}
BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfParameterDeclaration*>* params, SizedArrayImpl<BfTokenNode*>* commas, BfToken endToken)
BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfParameterDeclaration*>* params, SizedArrayImpl<BfTokenNode*>* commas, BfToken endToken, bool requireNames)
{
BfAstNode* nameAfterNode = node;
@ -8713,18 +8713,29 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl<BfPara
if (paramDecl->mNameNode == NULL)
{
auto nameIdentifierNode = ExpectIdentifierAfter(node, "parameter name");
if (nameIdentifierNode == NULL)
BfAstNode* nameIdentifierNode;
if (requireNames)
{
if (!allowNameFail)
return NULL;
nameIdentifierNode = ExpectIdentifierAfter(node, "parameter name");
if (nameIdentifierNode == NULL)
{
if (!allowNameFail)
return NULL;
}
}
else
{
nameIdentifierNode = BfNodeDynCast<BfIdentifierNode>(mVisitorPos.GetNext());
if (nameIdentifierNode != NULL)
mVisitorPos.MoveNext();
}
if (nameIdentifierNode != NULL)
{
paramDecl->mNameNode = nameIdentifierNode;
MoveNode(nameIdentifierNode, paramDecl);
nameAfterNode = nameIdentifierNode;
}
nameAfterNode = nameIdentifierNode;
}
}
}
@ -8770,7 +8781,7 @@ bool BfReducer::ParseMethod(BfMethodDeclaration* methodDeclaration, SizedArrayIm
methodDeclaration->mOpenParen = tokenNode;
MoveNode(methodDeclaration->mOpenParen, methodDeclaration);
methodDeclaration->mCloseParen = ParseMethodParams(methodDeclaration, params, commas, BfToken_RParen);
methodDeclaration->mCloseParen = ParseMethodParams(methodDeclaration, params, commas, BfToken_RParen, true);
// RParen
if (methodDeclaration->mCloseParen == NULL)