forked from lix-project/lix
mini-refactor "lambda.name or anonymous lambda" logic
Change-Id: I08d39c4ad5b967de526c0d5c5e6299256c7967f3
This commit is contained in:
parent
010d93393e
commit
19a93dd025
|
@ -1595,7 +1595,7 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
|
||||||
if (!j) {
|
if (!j) {
|
||||||
if (!i.def) {
|
if (!i.def) {
|
||||||
error<TypeError>("function '%1%' called without required argument '%2%'",
|
error<TypeError>("function '%1%' called without required argument '%2%'",
|
||||||
(lambda.name ? std::string(symbols[lambda.name]) : "anonymous lambda"),
|
lambda.getName(symbols),
|
||||||
symbols[i.name])
|
symbols[i.name])
|
||||||
.atPos(lambda.pos)
|
.atPos(lambda.pos)
|
||||||
.withTrace(pos, "from call site")
|
.withTrace(pos, "from call site")
|
||||||
|
@ -1621,7 +1621,7 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
|
||||||
formalNames.insert(symbols[formal.name]);
|
formalNames.insert(symbols[formal.name]);
|
||||||
auto suggestions = Suggestions::bestMatches(formalNames, symbols[i.name]);
|
auto suggestions = Suggestions::bestMatches(formalNames, symbols[i.name]);
|
||||||
error<TypeError>("function '%1%' called with unexpected argument '%2%'",
|
error<TypeError>("function '%1%' called with unexpected argument '%2%'",
|
||||||
(lambda.name ? std::string(symbols[lambda.name]) : "anonymous lambda"),
|
lambda.getName(symbols),
|
||||||
symbols[i.name])
|
symbols[i.name])
|
||||||
.atPos(lambda.pos)
|
.atPos(lambda.pos)
|
||||||
.withTrace(pos, "from call site")
|
.withTrace(pos, "from call site")
|
||||||
|
@ -1642,9 +1642,7 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
|
||||||
? makeDebugTraceStacker(
|
? makeDebugTraceStacker(
|
||||||
*this, *lambda.body, env2, positions[lambda.pos],
|
*this, *lambda.body, env2, positions[lambda.pos],
|
||||||
"while calling %s",
|
"while calling %s",
|
||||||
lambda.name
|
lambda.getQuotedName(symbols))
|
||||||
? concatStrings("'", symbols[lambda.name], "'")
|
|
||||||
: "anonymous lambda")
|
|
||||||
: nullptr;
|
: nullptr;
|
||||||
|
|
||||||
lambda.body->eval(*this, env2, vCur);
|
lambda.body->eval(*this, env2, vCur);
|
||||||
|
@ -1654,9 +1652,7 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
|
||||||
e,
|
e,
|
||||||
lambda.pos,
|
lambda.pos,
|
||||||
"while calling %s",
|
"while calling %s",
|
||||||
lambda.name
|
lambda.getQuotedName(symbols));
|
||||||
? concatStrings("'", symbols[lambda.name], "'")
|
|
||||||
: "anonymous lambda");
|
|
||||||
if (pos) addErrorTrace(e, pos, "from call site");
|
if (pos) addErrorTrace(e, pos, "from call site");
|
||||||
}
|
}
|
||||||
throw;
|
throw;
|
||||||
|
|
|
@ -297,6 +297,31 @@ struct ExprLambda : Expr
|
||||||
std::string showNamePos(const EvalState & state) const;
|
std::string showNamePos(const EvalState & state) const;
|
||||||
inline bool hasFormals() const { return formals != nullptr; }
|
inline bool hasFormals() const { return formals != nullptr; }
|
||||||
PosIdx getPos() const override { return pos; }
|
PosIdx getPos() const override { return pos; }
|
||||||
|
|
||||||
|
/** Returns the name of the lambda,
|
||||||
|
* or "anonymous lambda" if it doesn't have one.
|
||||||
|
*/
|
||||||
|
inline std::string getName(SymbolTable const & symbols) const
|
||||||
|
{
|
||||||
|
if (this->name) {
|
||||||
|
return symbols[this->name];
|
||||||
|
}
|
||||||
|
|
||||||
|
return "anonymous lambda";
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the name of the lambda in single quotes,
|
||||||
|
* or "anonymous lambda" if it doesn't have one.
|
||||||
|
*/
|
||||||
|
inline std::string getQuotedName(SymbolTable const & symbols) const
|
||||||
|
{
|
||||||
|
if (this->name) {
|
||||||
|
return concatStrings("'", symbols[this->name], "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "anonymous lambda";
|
||||||
|
}
|
||||||
|
|
||||||
COMMON_METHODS
|
COMMON_METHODS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue