Skip to content

Commit c9836f4

Browse files
committed
serialization of formulas for use in cpp annotations
1 parent d0d4469 commit c9836f4

4 files changed

Lines changed: 23 additions & 5 deletions

File tree

src/main/java/org/variantsync/vevos/simulation/io/kernelhaven/ArtefactCSVExporter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ public CSV export() {
5959
private String[] toRow(final LineBasedAnnotation annotation) {
6060
final String[] row = makeRow();
6161
row[0] = currentFile.getFile().toString();
62-
row[1] = FormulaUtils.toString(currentFile.getPresenceCondition(), NodeWriter.javaSymbols);
63-
row[2] = FormulaUtils.toString(annotation.getFeatureMapping(), NodeWriter.javaSymbols);
64-
row[3] = FormulaUtils.toString(annotation.getPresenceCondition(), NodeWriter.javaSymbols);
62+
row[1] = FormulaUtils.toFormulaString(currentFile.getPresenceCondition(), NodeWriter.javaSymbols);
63+
row[2] = FormulaUtils.toFormulaString(annotation.getFeatureMapping(), NodeWriter.javaSymbols);
64+
row[3] = FormulaUtils.toFormulaString(annotation.getPresenceCondition(), NodeWriter.javaSymbols);
6565
row[4] = "" + annotation.getLineFrom();
6666
// -1 because Kernelhaven stores annotations as [#if, #endif) intervals, so we have to point one line before the annotation end (#endif).
6767
row[5] = "" + (annotation.getLineTo() - (annotation.isMacro() ? 1 : 0));

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,21 @@ public static Node replaceAllInplace(final Node root, final Predicate<Node> who,
103103
}
104104
}
105105

106-
public static String toString(Node formula, final String[] symbols) {
106+
/**
107+
* Serializes the given formula to a string usable in C preprocessor conditions.
108+
* True and false will be converted to 1 and 0, respectively.
109+
* Variables will be wrapped in a defined expression.
110+
* @see FixTrueFalse#TrueAs1
111+
* @see FixTrueFalse#FalseAs0
112+
*/
113+
public static String toCPPString(Node formula, final String[] symbols) {
107114
formula = replaceAll(formula, FixTrueFalse::isTrue, n -> FixTrueFalse.TrueAs1);
108115
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);
118+
}
109119

120+
public static String toFormulaString(Node formula, final String[] symbols) {
110121
final NodeWriter writer = new NodeWriter(formula);
111122
writer.setNotation(NodeWriter.Notation.INFIX);
112123
writer.setEnquoteWhitespace(false);

src/main/java/org/variantsync/vevos/simulation/util/fide/bugfix/FixTrueFalse.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ public static boolean isFalse(final Node n) {
5050
return n instanceof Literal l && isFalseLiteral(l);
5151
}
5252

53+
/**
54+
* @return True iff the given formula is a literal that neither {@link #isTrue} nor {@link #isFalse}.
55+
*/
56+
public static boolean isVariable(final Node n) {
57+
return n instanceof Literal l && !isTrueLiteral(l) && !isFalseLiteral(l);
58+
}
59+
5360
/**
5461
* @return True iff the given name represents the atomic value true w.r.t. the constant TrueNames.
5562
*/

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public List<String> project(final VariantGenerationOptions projectionOptions, fi
1717
final List<String> result = new ArrayList<>();
1818

1919
if (projectionOptions.withMacros()) {
20-
result.add("#if " + FormulaUtils.toString(condition, NodeWriter.javaSymbols));
20+
result.add("#if " + FormulaUtils.toCPPString(condition, NodeWriter.javaSymbols));
2121
}
2222

2323
for (final VariantLineChunk child : lines) {

0 commit comments

Comments
 (0)