diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-10-22 16:48:03 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-10-23 10:11:49 +0200 |
commit | 6a1c5cc2c05e7c013a44cddbf030b7d50f1daf12 (patch) | |
tree | 9dc0e79829abd5a66819a8bba70680550784fe85 /src | |
parent | 4084db065c9bd973ff5664e45336a6674d66b45e (diff) | |
download | justbuild-6a1c5cc2c05e7c013a44cddbf030b7d50f1daf12.tar.gz |
expressions: enforce strict arguments for "join" and "join_cmd"v1.4.0-alpha+20241023
... as described in the documentation. It was never intended to have
a single string being an argument for those.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/expression/evaluator.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp index 3e129539..dfae8499 100644 --- a/src/buildtool/build_engine/expression/evaluator.cpp +++ b/src/buildtool/build_engine/expression/evaluator.cpp @@ -347,14 +347,16 @@ auto ShellQuote(std::string arg) -> std::string { return fmt::format("'{}'", arg); } -template <bool kDoQuote = false> +template <bool kDoQuote = false, bool kAllowString = false> auto Join(ExpressionPtr const& expr, std::string const& sep) -> ExpressionPtr { - if (expr->IsString()) { - auto string = expr->String(); - if constexpr (kDoQuote) { - string = ShellQuote(std::move(string)); + if constexpr (kAllowString) { + if (expr->IsString()) { + auto string = expr->String(); + if constexpr (kDoQuote) { + string = ShellQuote(std::move(string)); + } + return ExpressionPtr{std::move(string)}; } - return ExpressionPtr{std::move(string)}; } if (expr->IsList()) { auto const& list = expr->List(); @@ -370,8 +372,10 @@ auto Join(ExpressionPtr const& expr, std::string const& sep) -> ExpressionPtr { }); return ExpressionPtr{ss.str()}; } - throw Evaluator::EvaluationError{fmt::format( - "Join expects string or list but got: {}.", expr->ToString())}; + throw Evaluator::EvaluationError{ + fmt::format("Join expects a list of strings{}, but got: {}.", + kAllowString ? " or a single string" : "", + expr->ToString())}; } template <bool kDisjoint = false> @@ -787,7 +791,7 @@ auto JoinCmdExpr(SubExprEvaluator&& eval, ExpressionPtr const& expr, Configuration const& env) -> ExpressionPtr { auto const& list = eval(expr->Get("$1", list_t{}), env); - return Join</*kDoQuote=*/true>(list, " "); + return Join</*kDoQuote=*/true, /*kAllowString=*/false>(list, " "); } auto JsonEncodeExpr(SubExprEvaluator&& eval, @@ -1120,7 +1124,8 @@ auto ConcatTargetNameExpr(SubExprEvaluator&& eval, Configuration const& env) -> ExpressionPtr { auto p1 = eval(expr->Get("$1", ""s), env); auto p2 = eval(expr->Get("$2", ""s), env); - return ConcatTargetName(p1, Join(p2, "")); + return ConcatTargetName( + p1, Join</*kDoQuote=*/false, /*kAllowString=*/true>(p2, "")); } auto ContextExpr(SubExprEvaluator&& eval, |