Skip to content

Commit 11efdd9

Browse files
committed
Treat #ifdef A like #if defined(A) instead of #if A
1 parent dd46fb8 commit 11efdd9

71 files changed

Lines changed: 260 additions & 236 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/java/org/variantsync/diffdetective/feature/cpp/CPPDiffLineFormulaExtractor.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.antlr.v4.runtime.CharStreams;
44
import org.antlr.v4.runtime.CommonTokenStream;
5+
import org.prop4j.Literal;
56
import org.prop4j.Node;
67
import org.prop4j.Not;
78
import org.tinylog.Logger;
@@ -62,9 +63,19 @@ public Node extractFormula(final String line) throws UnparseableFormulaException
6263
throw new UnparseableFormulaException(e);
6364
}
6465

65-
// negate for ifndef
66-
if ("ifndef".equals(annotationType)) {
67-
parsedFormula = new Not(parsedFormula);
66+
// treat {@code #ifdef id} and {@code #ifndef id}
67+
// like {@code defined(id)} and {@code !defined(id)}
68+
if ("ifdef".equals(annotationType) || "ifndef".equals(annotationType)) {
69+
if (parsedFormula instanceof Literal literal) {
70+
literal.var = String.format("defined(%s)", literal.var);
71+
72+
// negate for ifndef
73+
if ("ifndef".equals(annotationType)) {
74+
literal.positive = false;
75+
}
76+
} else {
77+
throw new UnparseableFormulaException("When using #ifdef or #ifndef, only literals are allowed. Hence, \"" + line + "\" is disallowed.");
78+
}
6879
}
6980

7081
return parsedFormula;

src/test/java/CPPParserTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ private static record ThrowingTestCase(String formula) {
2323
private static List<TestCase> testCases() {
2424
return List.of(
2525
new TestCase("#if A", new Literal("A")),
26-
new TestCase("#ifdef A", new Literal("A")),
27-
new TestCase("#ifndef A", new Not(new Literal("A"))),
26+
new TestCase("#ifdef A", new Literal("defined(A)")),
27+
new TestCase("#ifndef A", new Literal("defined(A)", false)),
2828
new TestCase("#elif A", new Literal("A")),
2929

3030
new TestCase("#if !A", new Not(new Literal("A"))),
@@ -110,7 +110,7 @@ private static List<TestCase> testCases() {
110110
new TestCase("#if ' ' == 32", new Literal("' '==32")),
111111
new TestCase("#if (NAME<<1) > (1<<BITS)", new Literal("(NAME<<1)>(1<<BITS)")),
112112
new TestCase("#if #cpu(sparc)", new Literal("cpu(sparc)")),
113-
new TestCase("#ifdef \\U0001000", new Literal("\\U0001000")),
113+
new TestCase("#ifdef \\U0001000", new Literal("defined(\\U0001000)")),
114114
new TestCase("#if (defined(NAME) && (NAME >= 199905) && (NAME < 1991011)) || (NAME >= 300000) || defined(NAME)",
115115
new Or(new And(new Literal("defined(NAME)"), new Literal("NAME>=199905"), new Literal("NAME<1991011")), new Literal("NAME>=300000"), new Literal("defined(NAME)"))),
116116
new TestCase("#if __has_warning(\"-Wa-warning\"_foo)", new Literal("__has_warning(\"-Wa-warning\"_foo)")),

src/test/resources/diffs/differ/a032346092e47048becb36a7cb183b4739547370.lg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ v 16 NON;IF;(old: -1, diff: -1, new: -1);(old: -1, diff: -1, new: -1);True
22
v 147 NON;ARTIFACT;(old: 1, diff: 1, new: 1);(old: 2, diff: 2, new: 2);;
33
v 211 NON;ARTIFACT;(old: 2, diff: 2, new: 2);(old: 3, diff: 3, new: 3);;
44
v 275 NON;ARTIFACT;(old: 3, diff: 3, new: 3);(old: 4, diff: 4, new: 4);;
5-
v 336 NON;IF;(old: 4, diff: 4, new: 4);(old: 33, diff: 33, new: 33);-_DB_STL_RESOURCE_MANAGER_H__;#ifndef _DB_STL_RESOURCE_MANAGER_H__
5+
v 336 NON;IF;(old: 4, diff: 4, new: 4);(old: 33, diff: 33, new: 33);-defined(_DB_STL_RESOURCE_MANAGER_H__);#ifndef _DB_STL_RESOURCE_MANAGER_H__
66
v 403 NON;ARTIFACT;(old: 5, diff: 5, new: 5);(old: 6, diff: 6, new: 6);;#include <stdio.h>
77
v 467 NON;ARTIFACT;(old: 6, diff: 6, new: 6);(old: 7, diff: 7, new: 7);;
88
v 528 NON;IF;(old: 7, diff: 7, new: 7);(old: 9, diff: 9, new: 9);-defined(MESSAGE);#if !defined (MESSAGE)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
-#ifdef d10 && \
1+
-#if d10 && \
22
- d11
33
- d12
44
-#endif

src/test/resources/diffs/linenumbers/lineno1.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
b8a9
1111
+#endif
1212
b9a11
13-
-#ifdef d10 && \
13+
-#if d10 && \
1414
- d11
1515
- d12
1616
-#endif
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
v 16 NON;IF;(old: -1, diff: -1, new: -1);(old: -1, diff: -1, new: -1);True
2-
v 136 REM;IF;(old: 1, diff: 1, new: -1);(old: 3, diff: 3, new: -1);A;#ifdef \; A
2+
v 136 REM;IF;(old: 1, diff: 1, new: -1);(old: 3, diff: 3, new: -1);defined(A);#ifdef \; A
33
v 195 ADD;ARTIFACT;(old: -1, diff: 2, new: 1);(old: -1, diff: 3, new: 2);; A
44
e 136 16 b;0,-1
55
e 195 16 a;-1,0
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
v 16 NON;IF;(old: -1, diff: -1, new: -1);(old: -1, diff: -1, new: -1);True
2-
v 144 NON;IF;(old: 1, diff: 1, new: 1);(old: 4, diff: 4, new: 4);A;#ifdef A
2+
v 144 NON;IF;(old: 1, diff: 1, new: 1);(old: 4, diff: 4, new: 4);defined(A);#ifdef A
33
v 211 NON;ARTIFACT;(old: 2, diff: 2, new: 2);(old: 4, diff: 4, new: 4);; a \; b
44
e 144 16 ba;0,0
55
e 211 144 ba;0,0
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
v 16 NON;IF;(old: -1, diff: -1, new: -1);(old: -1, diff: -1, new: -1);True
2-
v 144 NON;IF;(old: 1, diff: 1, new: 1);(old: 4, diff: 4, new: 4);A;#ifdef A
2+
v 144 NON;IF;(old: 1, diff: 1, new: 1);(old: 4, diff: 4, new: 4);defined(A);#ifdef A
33
v 211 NON;ARTIFACT;(old: 2, diff: 2, new: 2);(old: 4, diff: 4, new: 4);; a \; b
44
e 144 16 ba;0,0
55
e 211 144 ba;0,0

src/test/resources/diffs/parser/08_expected.lg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
v 16 NON;IF;(old: -1, diff: -1, new: -1);(old: -1, diff: -1, new: -1);True
2-
v 136 REM;IF;(old: 1, diff: 1, new: -1);(old: 3, diff: 4, new: -1);A;#ifdef A
2+
v 136 REM;IF;(old: 1, diff: 1, new: -1);(old: 3, diff: 4, new: -1);defined(A);#ifdef A
33
v 275 NON;ARTIFACT;(old: 2, diff: 3, new: 2);(old: 3, diff: 4, new: 3);;Code
4-
v 192 ADD;IF;(old: -1, diff: 2, new: 1);(old: -1, diff: 4, new: 3);B;#ifdef B
4+
v 192 ADD;IF;(old: -1, diff: 2, new: 1);(old: -1, diff: 4, new: 3);defined(B);#ifdef B
55
e 136 16 b;0,-1
66
e 275 136 b;0,-1
77
e 275 192 a;-1,0

src/test/resources/diffs/parser/09_expected.lg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
v 16 NON;IF;(old: -1, diff: -1, new: -1);(old: -1, diff: -1, new: -1);True
2-
v 144 NON;IF;(old: 1, diff: 1, new: 1);(old: 3, diff: 5, new: 4);A;#ifdef A
2+
v 144 NON;IF;(old: 1, diff: 1, new: 1);(old: 3, diff: 5, new: 4);defined(A);#ifdef A
33
v 211 NON;ARTIFACT;(old: 2, diff: 2, new: 2);(old: 3, diff: 3, new: 3);;Code 1
44
v 339 NON;ARTIFACT;(old: 4, diff: 4, new: 3);(old: 5, diff: 5, new: 4);;Code 2
55
e 144 16 ba;0,0

0 commit comments

Comments
 (0)