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;
|
adec->mSize = adec->mBase->mSize;
|
||||||
|
|
||||||
|
if ((mCompilerOptions & COPT_CPLUSPLUS) && ConsumeTokenIf(TK_ASSIGN))
|
||||||
|
{
|
||||||
|
adec->mValue = ParseExpression(false);
|
||||||
|
}
|
||||||
|
|
||||||
vi += adec->mSize;
|
vi += adec->mSize;
|
||||||
if (pdec)
|
if (pdec)
|
||||||
pdec->mNext = adec;
|
pdec->mNext = adec;
|
||||||
|
@ -4754,6 +4759,12 @@ int Parser::OverloadDistance(Declaration* fdec, Expression* pexp)
|
||||||
return NOOVERLOAD;
|
return NOOVERLOAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (pdec && pdec->mValue)
|
||||||
|
{
|
||||||
|
dist += 1024;
|
||||||
|
pdec = pdec->mNext;
|
||||||
|
}
|
||||||
|
|
||||||
if (pdec)
|
if (pdec)
|
||||||
return NOOVERLOAD;
|
return NOOVERLOAD;
|
||||||
|
|
||||||
|
@ -4795,6 +4806,43 @@ Expression* Parser::CoerceExpression(Expression* exp, Declaration* type)
|
||||||
return exp;
|
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)
|
Expression * Parser::ResolveOverloadCall(Expression* exp, Expression* exp2)
|
||||||
{
|
{
|
||||||
if (exp->mType == EX_CALL && exp->mLeft->mDecValue)
|
if (exp->mType == EX_CALL && exp->mLeft->mDecValue)
|
||||||
|
@ -4850,6 +4898,8 @@ Expression * Parser::ResolveOverloadCall(Expression* exp, Expression* exp2)
|
||||||
exp->mRight = pbest;
|
exp->mRight = pbest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompleteFunctionDefaultParams(exp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
|
|
@ -90,6 +90,7 @@ protected:
|
||||||
int OverloadDistance(Declaration* pdec, Expression* pexp);
|
int OverloadDistance(Declaration* pdec, Expression* pexp);
|
||||||
Expression * ResolveOverloadCall(Expression* exp, Expression * exp2 = nullptr);
|
Expression * ResolveOverloadCall(Expression* exp, Expression * exp2 = nullptr);
|
||||||
Expression* CoerceExpression(Expression* exp, Declaration* type);
|
Expression* CoerceExpression(Expression* exp, Declaration* type);
|
||||||
|
void CompleteFunctionDefaultParams(Expression* exp);
|
||||||
|
|
||||||
Expression* ParseSimpleExpression(bool lhs);
|
Expression* ParseSimpleExpression(bool lhs);
|
||||||
Expression* ParsePrefixExpression(bool lhs);
|
Expression* ParsePrefixExpression(bool lhs);
|
||||||
|
|
Loading…
Reference in New Issue