aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/rewriter.py
diff options
context:
space:
mode:
authorDaniel Mensinger <daniel@mensinger-ka.de>2019-02-16 18:09:54 +0100
committerDaniel Mensinger <daniel@mensinger-ka.de>2019-02-26 09:34:57 +0100
commit74bb79e26e17acbf6176e32089e7e27991f5d2d3 (patch)
tree69b6ce93e32c14938c7987be0c06b328969e5190 /mesonbuild/rewriter.py
parente37d32aa9dfa1cac47b6f50a86b25b0317d58c3a (diff)
downloadmeson-74bb79e26e17acbf6176e32089e7e27991f5d2d3.zip
meson-74bb79e26e17acbf6176e32089e7e27991f5d2d3.tar.gz
meson-74bb79e26e17acbf6176e32089e7e27991f5d2d3.tar.bz2
rewriter: Remove matching regex from list
Diffstat (limited to 'mesonbuild/rewriter.py')
-rw-r--r--mesonbuild/rewriter.py41
1 files changed, 34 insertions, 7 deletions
diff --git a/mesonbuild/rewriter.py b/mesonbuild/rewriter.py
index 2bb1bc7..5c13471 100644
--- a/mesonbuild/rewriter.py
+++ b/mesonbuild/rewriter.py
@@ -29,7 +29,7 @@ from . import mlog, mparser, environment
from functools import wraps
from pprint import pprint
from .mparser import Token, ArrayNode, ArgumentNode, AssignmentNode, IdNode, FunctionNode, StringNode
-import json, os
+import json, os, re
class RewriterException(MesonException):
pass
@@ -109,6 +109,10 @@ class MTypeBase:
# Overwrite in derived class
mlog.warning('Cannot remove a value of type', mlog.bold(type(self).__name__), '--> skipping')
+ def remove_regex(self, value):
+ # Overwrite in derived class
+ mlog.warning('Cannot remove a regex in type', mlog.bold(type(self).__name__), '--> skipping')
+
class MTypeStr(MTypeBase):
def __init__(self, node: mparser.BaseNode):
super().__init__(node)
@@ -165,7 +169,11 @@ class MTypeList(MTypeBase):
self.node = self._new_node()
self.node.args.arguments += [tmp]
- def _check_is_equal(self, node, value):
+ def _check_is_equal(self, node, value) -> bool:
+ # Overwrite in derived class
+ return False
+
+ def _check_regex_matches(self, node, regex: str) -> bool:
# Overwrite in derived class
return False
@@ -197,10 +205,10 @@ class MTypeList(MTypeBase):
for i in value:
self.node.args.arguments += [self._new_element_node(i)]
- def remove_value(self, value):
+ def _remove_helper(self, value, equal_func):
def check_remove_node(node):
for j in value:
- if self._check_is_equal(i, j):
+ if equal_func(i, j):
return True
return False
@@ -213,6 +221,12 @@ class MTypeList(MTypeBase):
removed_list += [i]
self.node.args.arguments = removed_list
+ def remove_value(self, value):
+ self._remove_helper(value, self._check_is_equal)
+
+ def remove_regex(self, regex: str):
+ self._remove_helper(regex, self._check_regex_matches)
+
class MTypeStrList(MTypeList):
def __init__(self, node: mparser.BaseNode):
super().__init__(node)
@@ -220,11 +234,16 @@ class MTypeStrList(MTypeList):
def _new_element_node(self, value):
return mparser.StringNode(mparser.Token('', '', 0, 0, 0, None, str(value)))
- def _check_is_equal(self, node, value):
+ def _check_is_equal(self, node, value) -> bool:
if isinstance(node, mparser.StringNode):
return node.value == value
return False
+ def _check_regex_matches(self, node, regex: str) -> bool:
+ if isinstance(node, mparser.StringNode):
+ return re.match(regex, node.value) is not None
+ return False
+
def supported_element_nodes(self):
return [mparser.StringNode]
@@ -235,11 +254,16 @@ class MTypeIDList(MTypeList):
def _new_element_node(self, value):
return mparser.IdNode(mparser.Token('', '', 0, 0, 0, None, str(value)))
- def _check_is_equal(self, node, value):
+ def _check_is_equal(self, node, value) -> bool:
if isinstance(node, mparser.IdNode):
return node.value == value
return False
+ def _check_regex_matches(self, node, regex: str) -> bool:
+ if isinstance(node, mparser.StringNode):
+ return re.match(regex, node.value) is not None
+ return False
+
def supported_element_nodes(self):
return [mparser.IdNode]
@@ -247,7 +271,7 @@ rewriter_keys = {
'kwargs': {
'function': (str, None, None),
'id': (str, None, None),
- 'operation': (str, None, ['set', 'delete', 'add', 'remove', 'info']),
+ 'operation': (str, None, ['set', 'delete', 'add', 'remove', 'remove_regex', 'info']),
'kwargs': (dict, {}, None)
},
'target': {
@@ -451,6 +475,9 @@ class Rewriter:
elif cmd['operation'] == 'remove':
mlog.log(' -- Removing', mlog.yellow(val_str), 'from', mlog.bold(key))
modifyer.remove_value(val)
+ elif cmd['operation'] == 'remove_regex':
+ mlog.log(' -- Removing all values matching', mlog.yellow(val_str), 'from', mlog.bold(key))
+ modifyer.remove_regex(val)
# Write back the result
arg_node.kwargs[key] = modifyer.get_node()