20 Apply #ifdef / #ifndef only on some keys
21 :param keys: list of defined and undefined keys. The latter are preceded by a
23 E.g. if K is in keys, "#ifdef K "will be evaluated to True
24 if %K is in keys, "#ifdef K" will be evaluated to False
26 Warning: only #ifdef and #ifndef are treated and not "#if defined ..."
35 If %K is in keys, code snippet is reduced to B.
36 If neither K nor %K are present in keys, code is kept untouched.
41 parents = set(self.getParent(cppNode)
for cppNode
in self.findall(
'.//{*}cpp')
42 if (cppNode.text.startswith(
'#ifdef ')
or
43 cppNode.text.startswith(
'#ifndef ')))
54 if tag(node) ==
'cpp':
55 if node.text.startswith(
'#ifdef '):
56 k = alltext(node).split(
' ')[1].strip()
58 toRemove.append((node, par))
61 toRemove.append((node, par))
66 toRemove.append((node, par))
67 elif node.text.startswith(
'#ifndef '):
68 k = alltext(node).split(
' ')[1].strip()
70 toRemove.append((node, par))
73 toRemove.append((node, par))
78 toRemove.append((node, par))
79 elif node.text.startswith(
'#if '):
81 toRemove.append((node, par))
84 elif node.text.startswith(
'#else'):
85 if keep[-1]
is not None:
86 toRemove.append((node, par))
87 keep[-1] =
not keep[-1]
89 toRemove.append((node, par))
90 elif node.text.startswith(
'#endif'):
91 if keep[-1]
is not None or False in keep:
92 toRemove.append((node, par))
94 elif node.text.startswith(
'#elifdef')
or node.text.startswith(
'#elifndef'):
95 raise NotImplementedError(
"#elifdef and #elifndef not (yet?) implemented")
98 toRemove.append((node, par))
101 toRemove.append((node, par))
104 raise PYFTError(
"#else or #endif hasn't the same parent as #ifdef " +
105 "or #ifndef in {f}".format(f=self.getFileName()))
107 if len(toRemove) != 0:
108 self.tree.signal(self)
109 for node, par
in toRemove[::-1]:
110 index = list(par).index(node)
112 if node.tail
is not None:
113 if par[index - 1].tail
is None:
114 par[index - 1].tail =
""
116 par[index - 1].tail += (node.tail.count(
'\n') *
'\n' +
117 (len(node.tail) - len(node.tail.rstrip(
' '))) *
' ')