summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2023-10-09 22:01:22 -0400
committerXavier Claessens <xavier.claessens@collabora.com>2024-02-26 10:03:51 -0500
commit6cce6c51bf2ae4430d40331717bba8963ac475d8 (patch)
tree7e086f57176254526ab704f229224b7b49a530eb
parentcbf23f5eba4c2a323c31ff2bc0b6698789f5998a (diff)
downloadmeson-6cce6c51bf2ae4430d40331717bba8963ac475d8.tar.gz
cargo: Builder: Add support for "+", "+=", "if" and "foreach"
-rw-r--r--mesonbuild/cargo/builder.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/mesonbuild/cargo/builder.py b/mesonbuild/cargo/builder.py
index 17b4ca52c..ad2c76066 100644
--- a/mesonbuild/cargo/builder.py
+++ b/mesonbuild/cargo/builder.py
@@ -167,3 +167,45 @@ class Builder:
block = mparser.CodeBlockNode(self._token('node', ''))
block.lines = lines
return block
+
+ def plus(self, lhs: mparser.BaseNode, rhs: mparser.BaseNode) -> mparser.ArithmeticNode:
+ """Create an addition node
+
+ :param lhs: The left of the addition
+ :param rhs: The right of the addition
+ :return: The ArithmeticNode
+ """
+ return mparser.ArithmeticNode('add', lhs, self._symbol('+'), rhs)
+
+ def plusassign(self, value: mparser.BaseNode, varname: str) -> mparser.PlusAssignmentNode:
+ """Create a "+=" node
+
+ :param value: The value to add
+ :param varname: The variable to assign
+ :return: The PlusAssignmentNode
+ """
+ return mparser.PlusAssignmentNode(self.identifier(varname), self._symbol('+='), value)
+
+ def if_(self, condition: mparser.BaseNode, block: mparser.CodeBlockNode) -> mparser.IfClauseNode:
+ """Create a "if" block
+
+ :param condition: The condition
+ :param block: Lines inside the condition
+ :return: The IfClauseNode
+ """
+ clause = mparser.IfClauseNode(condition)
+ clause.ifs.append(mparser.IfNode(clause, self._symbol('if'), condition, block))
+ clause.elseblock = mparser.EmptyNode(-1, -1, self.filename)
+ return clause
+
+ def foreach(self, varnames: T.List[str], items: mparser.BaseNode, block: mparser.CodeBlockNode) -> mparser.ForeachClauseNode:
+ """Create a "foreach" loop
+
+ :param varnames: Iterator variable names (one for list, two for dict).
+ :param items: The list of dict to iterate
+ :param block: Lines inside the loop
+ :return: The ForeachClauseNode
+ """
+ varids = [self.identifier(i) for i in varnames]
+ commas = [self._symbol(',') for i in range(len(varnames) - 1)]
+ return mparser.ForeachClauseNode(self._symbol('foreach'), varids, commas, self._symbol(':'), items, block, self._symbol('endforeach'))