Add function default parameters
This commit is contained in:
parent
8161ff88a8
commit
1407d9d948
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue