summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2022-03-01 18:52:20 +0100
committerKlaus Aehlig <klaus.aehlig@huawei.com>2022-03-02 14:55:40 +0100
commitdf8237044fcb583231323a7e2f9a7310cd80edf7 (patch)
tree54c49c319db8d0e6bce9b849ae73d58980fb17ff /src
parent57566d59dc01a259b4022696344215bb674ea89d (diff)
downloadjustbuild-df8237044fcb583231323a7e2f9a7310cd80edf7.tar.gz
expression language: add a range function
Given a number or number representation, return a list of that length consisting of representations of the lower numbers. In this way, repeated non-pure actions can be generated (e.g., repetitions of a test to detect flakyness).
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/expression/evaluator.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp
index b93fa9f9..f1a19d4d 100644
--- a/src/buildtool/build_engine/expression/evaluator.cpp
+++ b/src/buildtool/build_engine/expression/evaluator.cpp
@@ -161,6 +161,22 @@ auto NubRight(ExpressionPtr const& expr) -> ExpressionPtr {
return ExpressionPtr{reverse_result};
}
+auto Range(ExpressionPtr const& expr) -> ExpressionPtr {
+ size_t len = 0;
+ if (expr->IsNumber() && expr->Number() > 0.0) {
+ len = static_cast<size_t>(std::lround(expr->Number()));
+ }
+ if (expr->IsString()) {
+ len = static_cast<size_t>(std::atol(expr->String().c_str()));
+ }
+ auto result = Expression::list_t{};
+ result.reserve(len);
+ for (size_t i = 0; i < len; i++) {
+ result.emplace_back(ExpressionPtr{fmt::format("{}", i)});
+ }
+ return ExpressionPtr{result};
+}
+
auto ChangeEndingTo(ExpressionPtr const& name, ExpressionPtr const& ending)
-> ExpressionPtr {
std::filesystem::path path{name->String()};
@@ -785,6 +801,7 @@ auto built_in_functions =
{"+", AddExpr},
{"++", UnaryExpr(Flatten)},
{"nub_right", UnaryExpr(NubRight)},
+ {"range", UnaryExpr(Range)},
{"change_ending", ChangeEndingExpr},
{"basename", UnaryExpr(BaseName)},
{"join", JoinExpr},