Add function default parameters

This commit is contained in:
drmortalwombat 2023-08-06 15:21:11 +02:00
parent 8161ff88a8
commit 1407d9d948
2 changed files with 51 additions and 0 deletions

View File

@ -913,6 +913,11 @@ Declaration * Parser::ParseFunctionDeclaration(Declaration* bdec)
adec->mSize = adec->mBase->mSize;
if ((mCompilerOptions & COPT_CPLUSPLUS) && ConsumeTokenIf(TK_ASSIGN))
{
adec->mValue = ParseExpression(false);
}
vi += adec->mSize;
if (pdec)
pdec->mNext = adec;
@ -4754,6 +4759,12 @@ int Parser::OverloadDistance(Declaration* fdec, Expression* pexp)
return NOOVERLOAD;
}
while (pdec && pdec->mValue)
{
dist += 1024;
pdec = pdec->mNext;
}
if (pdec)
return NOOVERLOAD;
@ -4795,6 +4806,43 @@ Expression* Parser::CoerceExpression(Expression* exp, Declaration* type)
return exp;
}
void Parser::CompleteFunctionDefaultParams(Expression* exp)
{
Declaration* fdec = exp->mLeft->mDecValue;
Expression* lexp = exp;
Declaration* pdec = fdec->mBase->mParams;
Expression* pexp = lexp->mRight;
while (pdec)
{
if (pexp)
{
if (pexp->mType == EX_LIST)
{
lexp = pexp;
pexp = pexp->mRight;
}
else
pexp = nullptr;
}
else if (pdec->mValue)
{
if (lexp->mRight)
{
Expression* nexp = new Expression(exp->mLocation, EX_LIST);
nexp->mLeft = lexp->mRight;
nexp->mRight = pdec->mValue;
lexp->mRight = nexp;
lexp = nexp;
}
else
lexp->mRight = pdec->mValue;
}
pdec = pdec->mNext;
}
}
Expression * Parser::ResolveOverloadCall(Expression* exp, Expression* exp2)
{
if (exp->mType == EX_CALL && exp->mLeft->mDecValue)
@ -4850,6 +4898,8 @@ Expression * Parser::ResolveOverloadCall(Expression* exp, Expression* exp2)
exp->mRight = pbest;
}
}
CompleteFunctionDefaultParams(exp);
}
return exp;

View File

@ -90,6 +90,7 @@ protected:
int OverloadDistance(Declaration* pdec, Expression* pexp);
Expression * ResolveOverloadCall(Expression* exp, Expression * exp2 = nullptr);
Expression* CoerceExpression(Expression* exp, Declaration* type);
void CompleteFunctionDefaultParams(Expression* exp);
Expression* ParseSimpleExpression(bool lhs);
Expression* ParsePrefixExpression(bool lhs);