cmake: Implement the ~= operator in pro2cmake

Change-Id: I3fadd0038d517d197cce898d10edd6ba452adea9
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
Joerg Bornemann 2019-09-23 13:19:22 +02:00
parent 6ff123be87
commit 8049ef3d4d

View File

@ -676,7 +676,6 @@ class AddOperation(Operation):
def __repr__(self):
return f"+({self._dump()})"
class UniqueAddOperation(Operation):
def process(
self, key: str, sinput: List[str], transformer: Callable[[List[str]], List[str]]
@ -690,6 +689,37 @@ class UniqueAddOperation(Operation):
def __repr__(self):
return f"*({self._dump()})"
class ReplaceOperation(Operation):
def process(
self, key: str, sinput: List[str], transformer: Callable[[List[str]], List[str]]
) -> List[str]:
result = []
for s in sinput:
for v in transformer(self._value):
pattern, replacement = self.split_rex(v)
result.append(re.sub(pattern, replacement, s))
return result
def split_rex(self, s):
pattern = ""
replacement = ""
if len(s) < 4:
return pattern, replacement
sep = s[1]
s = s[2:]
rex = re.compile(f"[^\\\\]{sep}")
m = rex.search(s)
if not m:
return pattern, replacement
pattern = s[:m.start() + 1]
replacement = s[m.end():]
m = rex.search(replacement)
if m:
replacement = replacement[:m.start() + 1]
return pattern, replacement
def __repr__(self):
return f"*({self._dump()})"
class SetOperation(Operation):
def process(
@ -864,6 +894,8 @@ class Scope(object):
scope._append_operation(key, AddOperation(value))
elif operation == "*=":
scope._append_operation(key, UniqueAddOperation(value))
elif operation == "~=":
scope._append_operation(key, ReplaceOperation(value))
else:
print(f'Unexpected operation "{operation}" in scope "{scope}".')
assert False
@ -1250,7 +1282,7 @@ class QmakeParser:
Values = add_element("Values", pp.ZeroOrMore(Value)("value"))
Op = add_element(
"OP", pp.Literal("=") | pp.Literal("-=") | pp.Literal("+=") | pp.Literal("*=")
"OP", pp.Literal("=") | pp.Literal("-=") | pp.Literal("+=") | pp.Literal("*=") | pp.Literal("~=")
)
Key = add_element("Key", Identifier)