Skip to content

Commit 8430d17

Browse files
committed
Moving PatchParser from violation-comments-lib #95
1 parent e19a6dd commit 8430d17

File tree

2 files changed

+222
-0
lines changed

2 files changed

+222
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package se.bjurr.violations.lib.util;
2+
3+
import static java.util.Optional.empty;
4+
import static java.util.Optional.of;
5+
6+
import java.util.Map;
7+
import java.util.Optional;
8+
import java.util.TreeMap;
9+
import java.util.regex.Matcher;
10+
import java.util.regex.Pattern;
11+
12+
public class PatchParser {
13+
14+
private static final Pattern RANGE_PATTERN =
15+
Pattern.compile(
16+
"@@\\p{IsWhite_Space}-[0-9]+(?:,[0-9]+)?\\p{IsWhite_Space}\\+([0-9]+)(?:,[0-9]+)?\\p{IsWhite_Space}@@.*");
17+
18+
private final Map<Integer, Optional<Integer>> newLineToOldLineTable;
19+
private final Map<Integer, Optional<Integer>> newLineToLineInDiffTable;
20+
21+
public PatchParser(String patchString) {
22+
newLineToOldLineTable = new TreeMap<>();
23+
newLineToLineInDiffTable = new TreeMap<>();
24+
if (patchString == null) {
25+
return;
26+
}
27+
int currentLine = -1;
28+
int patchLocation = 1;
29+
int diffLocation = 0;
30+
for (String line : patchString.split("\n")) {
31+
if (line.startsWith("@")) {
32+
Matcher matcher = RANGE_PATTERN.matcher(line);
33+
if (!matcher.matches()) {
34+
throw new IllegalStateException(
35+
"Unable to parse patch line " + line + "\nFull patch: \n" + patchString);
36+
}
37+
currentLine = Integer.parseInt(matcher.group(1));
38+
patchLocation = currentLine;
39+
} else if (line.startsWith("+") && !line.startsWith("++")) {
40+
newLineToOldLineTable.put(currentLine, empty());
41+
currentLine++;
42+
} else if (line.startsWith(" ")) {
43+
newLineToOldLineTable.put(currentLine, of(patchLocation));
44+
currentLine++;
45+
patchLocation++;
46+
} else {
47+
patchLocation++;
48+
}
49+
diffLocation++;
50+
newLineToLineInDiffTable.put(currentLine, of(diffLocation));
51+
}
52+
}
53+
54+
public boolean isLineInDiff(Integer newLine) {
55+
return newLineToLineInDiffTable.containsKey(newLine);
56+
}
57+
58+
public Optional<Integer> findOldLine(Integer newLine) {
59+
if (newLineToOldLineTable.containsKey(newLine)) {
60+
return newLineToOldLineTable.get(newLine);
61+
}
62+
return empty();
63+
}
64+
65+
public Optional<Integer> findLineInDiff(final int newLine) {
66+
if (newLineToLineInDiffTable.containsKey(newLine)) {
67+
return newLineToLineInDiffTable.get(newLine);
68+
}
69+
return empty();
70+
}
71+
72+
Map<Integer, Optional<Integer>> getNewLineToOldLineTable() {
73+
return newLineToOldLineTable;
74+
}
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package se.bjurr.violations.lib.util;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.util.Map;
6+
import java.util.Optional;
7+
import java.util.logging.Logger;
8+
import org.junit.Test;
9+
10+
public class PatchParserTest {
11+
private static Logger LOG = Logger.getLogger(PatchParser.class.getSimpleName());
12+
13+
private static final String NEW_DIFF =
14+
"@@ -1,6 +1,6 @@\n <html>\n <head></head>\n <body>\n-<font>\n+<font> \n </body> \n </html>";
15+
private static final String CHANGED_DIFF =
16+
" @@ -1,4 +1,5 @@\n .klass {\n font-size: 14px;\n+ \n font-size: 14px;\n }";
17+
private static final String CHANGED_DIFF_2 =
18+
"@@ -6,6 +6,16 @@\n void npe(String a, String b) {\n if (a == null) {\n System.out.println();\n+ System.out.println();\n+ } else {\n+\n+ }\n+ a.length();\n+ }\n+\n+ void npe2(String a, String b) {\n+ if (a == null) {\n+ System.out.println();\n } else {\n \n }\n@@ -14,6 +24,6 @@ void npe(String a, String b) {\n \n @Override\n public boolean equals(Object obj) {\n- return true;\n+ return false;\n }\n }";
19+
20+
@Test
21+
public void testThatChangedContentCanBeCommented() {
22+
assertThat(findLineToComment("patch", 1)) //
23+
.isNull();
24+
}
25+
26+
@Test
27+
public void testThatChangedContentCanBeCommentedNewFile() {
28+
assertThat(findLineToComment(NEW_DIFF, 1)) //
29+
.isEqualTo(1);
30+
31+
assertThat(findLineToComment(NEW_DIFF, 5)) //
32+
.isEqualTo(6);
33+
}
34+
35+
@Test
36+
public void testThatChangedContentCanBeCommentedChangedFile() {
37+
assertThat(findLineToComment(CHANGED_DIFF, 1)) //
38+
.isEqualTo(2);
39+
40+
assertThat(findLineToComment(CHANGED_DIFF, 4)) //
41+
.isEqualTo(5);
42+
}
43+
44+
@Test
45+
public void testThatChangedContentCanBeCommentedChangedPartsOfFile() {
46+
assertThat(findLineToComment(CHANGED_DIFF_2, 6)) //
47+
.isEqualTo(1);
48+
49+
assertThat(findLineToComment(CHANGED_DIFF_2, 8)) //
50+
.isEqualTo(3);
51+
52+
assertThat(findLineToComment(CHANGED_DIFF_2, 14)) //
53+
.isEqualTo(9);
54+
55+
assertThat(findLineToComment(CHANGED_DIFF_2, 21)) //
56+
.isEqualTo(16);
57+
}
58+
59+
@Test
60+
public void testThatOldLineIsEmptyIfOutsideOfDiff() {
61+
String patch =
62+
"--- a/src/main/java/se/bjurr/violations/lib/example/OtherClass.java\n+++ b/src/main/java/se/bjurr/violations/lib/example/OtherClass.java\n@@ -4,12 +4,15 @@ package se.bjurr.violations.lib.example;\n * No ending dot\n */\n public class OtherClass {\n- public static String CoNstANT = \"yes\";\n+ public static String CoNstANT = \"yes\"; \n \n public void myMethod() {\n if (CoNstANT.equals(\"abc\")) {\n \n }\n+ if (CoNstANT.equals(\"abc\")) {\n+\n+ }\n }\n \n @Override\n";
63+
64+
getIntegerOptionalMap(patch);
65+
66+
final PatchParser pp = new PatchParser(patch);
67+
68+
assertThat(pp.isLineInDiff(999)) //
69+
.isFalse();
70+
assertThat(pp.findOldLine(999).orElse(null)) //
71+
.isNull();
72+
assertThat(pp.findLineInDiff(999).orElse(null)) //
73+
.isNull();
74+
75+
assertThat(pp.isLineInDiff(6)) //
76+
.isTrue();
77+
assertThat(pp.findOldLine(6).orElse(null)) //
78+
.isEqualTo(6);
79+
assertThat(pp.findLineInDiff(6).orElse(null)) //
80+
.isEqualTo(5);
81+
}
82+
83+
@Test
84+
public void testThatLineTableCanBeRetrieved() {
85+
String patch =
86+
"--- a/src/main/java/se/bjurr/violations/lib/example/OtherClass.java\n+++ b/src/main/java/se/bjurr/violations/lib/example/OtherClass.java\n@@ -4,12 +4,15 @@ package se.bjurr.violations.lib.example;\n * No ending dot\n */\n public class OtherClass {\n- public static String CoNstANT = \"yes\";\n+ public static String CoNstANT = \"yes\"; \n \n public void myMethod() {\n if (CoNstANT.equals(\"abc\")) {\n \n }\n+ if (CoNstANT.equals(\"abc\")) {\n+\n+ }\n }\n \n @Override\n";
87+
final Map<Integer, Optional<Integer>> map = getIntegerOptionalMap(patch);
88+
89+
assertThat(map.get(6).orElse(null)) //
90+
.isEqualTo(6);
91+
assertThat(map.get(7).orElse(null)) //
92+
.isNull();
93+
assertThat(map.get(8).orElse(null)) //
94+
.isEqualTo(8);
95+
96+
assertThat(map.get(12).orElse(null)) //
97+
.isEqualTo(12);
98+
assertThat(map.get(13).orElse(null)) //
99+
.isNull();
100+
assertThat(map.get(14).orElse(null)) //
101+
.isNull();
102+
assertThat(map.get(15).orElse(null)) //
103+
.isNull();
104+
assertThat(map.get(16).orElse(null)) //
105+
.isEqualTo(13);
106+
}
107+
108+
@Test
109+
public void testThatLineTableCanBeRetrieved2() {
110+
String patch =
111+
"--- a/src/main/java/se/bjurr/violations/lib/example/MyClass.java\n+++ b/src/main/java/se/bjurr/violations/lib/example/MyClass.java\n@@ -9,6 +9,8 @@ public class MyClass {\n } else {\n \n }\n+ if (a == null)\n+ a.charAt(123);\n a.length();\n }\n \n";
112+
final Map<Integer, Optional<Integer>> map = getIntegerOptionalMap(patch);
113+
114+
assertThat(map.get(11).orElse(null)) //
115+
.isEqualTo(11);
116+
assertThat(map.get(12).orElse(null)) //
117+
.isNull();
118+
assertThat(map.get(13).orElse(null)) //
119+
.isNull();
120+
assertThat(map.get(14).orElse(null)) //
121+
.isEqualTo(12);
122+
}
123+
124+
private Integer findLineToComment(String patch, int commentLint) {
125+
getIntegerOptionalMap(patch);
126+
127+
return new PatchParser(patch) //
128+
.findLineInDiff(commentLint) //
129+
.orElse(null);
130+
}
131+
132+
private Map<Integer, Optional<Integer>> getIntegerOptionalMap(final String patch) {
133+
String[] diffLines = patch.split("\n");
134+
StringBuilder sb = new StringBuilder();
135+
for (int i = 0; i < diffLines.length; i++) {
136+
sb.append(i + 1 + " | " + diffLines[i] + "\n");
137+
}
138+
final Map<Integer, Optional<Integer>> map =
139+
new PatchParser(patch) //
140+
.getNewLineToOldLineTable();
141+
for (Map.Entry<Integer, Optional<Integer>> e : map.entrySet()) {
142+
sb.append(e.getKey() + " : " + e.getValue().orElse(null) + "\n");
143+
}
144+
LOG.info("\n" + sb.toString());
145+
return map;
146+
}
147+
}

0 commit comments

Comments
 (0)