Skip to content

Commit e0a46ec

Browse files
committed
bugfix: in wrapping negated literals in defined statements
1 parent c9836f4 commit e0a46ec

2 files changed

Lines changed: 23 additions & 6 deletions

File tree

src/main/java/org/variantsync/vevos/simulation/util/fide/FormulaUtils.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,21 +103,39 @@ public static Node replaceAllInplace(final Node root, final Predicate<Node> who,
103103
}
104104
}
105105

106+
/**
107+
* Wraps a literal name in a defined statement.
108+
* x -> defined(x)
109+
* !x -> !defined(x)
110+
*/
111+
private static Node ifdef(final Literal l) {
112+
final Function<Object, Literal> toDefinedLiteral = s -> new Literal("defined(" + s + ")");
113+
114+
if (l.positive) {
115+
return toDefinedLiteral.apply(l);
116+
} else {
117+
return new Not(toDefinedLiteral.apply(new Literal(l.var, true)));
118+
}
119+
}
120+
106121
/**
107122
* Serializes the given formula to a string usable in C preprocessor conditions.
108123
* True and false will be converted to 1 and 0, respectively.
109124
* Variables will be wrapped in a defined expression.
110125
* @see FixTrueFalse#TrueAs1
111126
* @see FixTrueFalse#FalseAs0
112127
*/
113-
public static String toCPPString(Node formula, final String[] symbols) {
128+
public static String toCPPString(Node formula) {
114129
formula = replaceAll(formula, FixTrueFalse::isTrue, n -> FixTrueFalse.TrueAs1);
115130
formula = replaceAllInplace(formula, FixTrueFalse::isFalse, n -> FixTrueFalse.FalseAs0);
116-
formula = replaceAllInplace(formula, FixTrueFalse::isVariable, n -> new Literal("defined(" + n.toString() + ")"));
117-
return toFormulaString(formula, symbols);
131+
formula = replaceAllInplace(formula, FixTrueFalse::isVariable,
132+
// we know that n is a literal because FixTureFalse::isVariable returned true
133+
n -> ifdef((Literal) n)
134+
);
135+
return toFormulaString(formula, NodeWriter.javaSymbols);
118136
}
119137

120-
public static String toFormulaString(Node formula, final String[] symbols) {
138+
public static String toFormulaString(final Node formula, final String[] symbols) {
121139
final NodeWriter writer = new NodeWriter(formula);
122140
writer.setNotation(NodeWriter.Notation.INFIX);
123141
writer.setEnquoteWhitespace(false);

src/main/java/org/variantsync/vevos/simulation/variability/pc/variantlines/VariantAnnotation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.variantsync.vevos.simulation.variability.pc.variantlines;
22

33
import org.prop4j.Node;
4-
import org.prop4j.NodeWriter;
54
import org.variantsync.vevos.simulation.util.fide.FormulaUtils;
65
import org.variantsync.vevos.simulation.variability.pc.options.VariantGenerationOptions;
76

@@ -17,7 +16,7 @@ public List<String> project(final VariantGenerationOptions projectionOptions, fi
1716
final List<String> result = new ArrayList<>();
1817

1918
if (projectionOptions.withMacros()) {
20-
result.add("#if " + FormulaUtils.toCPPString(condition, NodeWriter.javaSymbols));
19+
result.add("#if " + FormulaUtils.toCPPString(condition));
2120
}
2221

2322
for (final VariantLineChunk child : lines) {

0 commit comments

Comments
 (0)