131 class HunkCoalescer {
132 private final int numContextLines;
133 private final List<String> sourceContent;
134 private final List<String> destContent;
135
136 public HunkCoalescer(int numContextLines, List<String> sourceContent, List<String> destContent) {
137 this.numContextLines = numContextLines;
138 this.sourceContent = sourceContent;
139 this.destContent = destContent;
140 }
141
142 public List<Hunk> nextGroup(LinkedList<Hunk> hunks) {
143 var hunksInRange = new ArrayList<Hunk>();
144 hunksInRange.add(hunks.removeFirst());
145
146 while (!hunks.isEmpty()) {
147 var next = hunks.peekFirst();
148 var last = hunksInRange.get(hunksInRange.size() - 1);
149 var destEnd = last.target().range().end() + numContextLines;
150 var sourceEnd = last.source().range().end() + numContextLines;
151 if (sourceEnd >= next.source().range().start() ||
152 destEnd >= next.target().range().start()) {
153 hunksInRange.add(hunks.removeFirst());
154 } else {
155 break;
156 }
157 }
158 return hunksInRange;
159 }
160
161 private Header calculateCoalescedHeader(Hunk first, Hunk last) {
162 var sourceStart = first.source().range().start() - numContextLines;
163 sourceStart = Math.max(sourceStart, 1);
164
165 var destStart = first.target().range().start() - numContextLines;
166 destStart = Math.max(destStart, 1);
167
168 var sourceEnd = last.source().range().end() + numContextLines;
169 sourceEnd = Math.min(sourceEnd, sourceContent.size() + 1);
170
171 var destEnd = last.target().range().end() + numContextLines;
172 destEnd = Math.min(destEnd, destContent.size() + 1);
224 private List<Line> addedLines(Hunk hunk) {
225 var added = new ArrayList<Line>();
226 var addedStart = hunk.target().range().start();
227 var addedEnd = hunk.target().range().end();
228 for (var lineNum = addedStart; lineNum < addedEnd; lineNum++) {
229 var text = destContent.get(lineNum - 1);
230 added.add(new Line(lineNum, text));
231 }
232
233 assert added.size() == hunk.target().lines().size();
234
235 return added;
236 }
237
238 private Context createContextAfterHunk(Hunk hunk, Hunk nextNonEmptySourceHunk, Hunk nextNonEmptyTargetHunk) {
239 var sourceAfterContextStart = hunk.source().range().end();
240 var sourceAfterContextEnd = hunk.source().range().end() + numContextLines;
241 sourceAfterContextEnd = Math.min(sourceAfterContextEnd, sourceContent.size() + 1);
242 if (nextNonEmptySourceHunk != null) {
243 var nextNonEmptySourceHunkStart = nextNonEmptySourceHunk.source().range().start();
244 sourceAfterContextEnd = Math.min(sourceAfterContextEnd, nextNonEmptySourceHunkStart);
245 }
246 var sourceAfterContextCount = sourceAfterContextEnd - sourceAfterContextStart;
247
248 var destAfterContextStart = hunk.target().range().end();
249 var destAfterContextEnd = hunk.target().range().end() + numContextLines;
250 destAfterContextEnd = Math.min(destAfterContextEnd, destContent.size() + 1);
251 if (nextNonEmptyTargetHunk != null) {
252 var nextNonEmptyTargetHunkStart = nextNonEmptyTargetHunk.target().range().start();
253 destAfterContextEnd = Math.min(destAfterContextEnd, nextNonEmptyTargetHunkStart);
254 }
255 var destAfterContextCount = destAfterContextEnd - destAfterContextStart;
256
257 var afterContextCount = Math.min(sourceAfterContextCount, destAfterContextCount);
258
259 var sourceLineNumStart = hunk.source().lines().isEmpty() && hunk.source().range().start() == 0 ?
260 sourceAfterContextStart + 1 : sourceAfterContextStart;
261 var sourceEndingLineNum = sourceLineNumStart + afterContextCount;
262 var sourceContextAfter = new ArrayList<Line>();
263 for (var lineNum = sourceLineNumStart; lineNum < sourceEndingLineNum; lineNum++) {
264 var text = sourceContent.get(lineNum - 1);
265 sourceContextAfter.add(new Line(lineNum, text));
266 }
267
268 var destLineNumStart = hunk.target().lines().isEmpty() && hunk.target().range().start() == 0 ?
269 destAfterContextStart + 1 : destAfterContextStart;
270 var destEndingLineNum = destLineNumStart + afterContextCount;
271 var destContextAfter = new ArrayList<Line>();
272 for (var lineNum = destLineNumStart; lineNum < destEndingLineNum; lineNum++) {
273 var text = destContent.get(lineNum - 1);
|
131 class HunkCoalescer {
132 private final int numContextLines;
133 private final List<String> sourceContent;
134 private final List<String> destContent;
135
136 public HunkCoalescer(int numContextLines, List<String> sourceContent, List<String> destContent) {
137 this.numContextLines = numContextLines;
138 this.sourceContent = sourceContent;
139 this.destContent = destContent;
140 }
141
142 public List<Hunk> nextGroup(LinkedList<Hunk> hunks) {
143 var hunksInRange = new ArrayList<Hunk>();
144 hunksInRange.add(hunks.removeFirst());
145
146 while (!hunks.isEmpty()) {
147 var next = hunks.peekFirst();
148 var last = hunksInRange.get(hunksInRange.size() - 1);
149 var destEnd = last.target().range().end() + numContextLines;
150 var sourceEnd = last.source().range().end() + numContextLines;
151 var nextDestStart = next.target().range().start() - numContextLines;
152 var nextSourceStart = next.source().range().start() - numContextLines;
153 if (sourceEnd >= nextSourceStart ||
154 destEnd >= nextDestStart) {
155 hunksInRange.add(hunks.removeFirst());
156 } else {
157 break;
158 }
159 }
160 return hunksInRange;
161 }
162
163 private Header calculateCoalescedHeader(Hunk first, Hunk last) {
164 var sourceStart = first.source().range().start() - numContextLines;
165 sourceStart = Math.max(sourceStart, 1);
166
167 var destStart = first.target().range().start() - numContextLines;
168 destStart = Math.max(destStart, 1);
169
170 var sourceEnd = last.source().range().end() + numContextLines;
171 sourceEnd = Math.min(sourceEnd, sourceContent.size() + 1);
172
173 var destEnd = last.target().range().end() + numContextLines;
174 destEnd = Math.min(destEnd, destContent.size() + 1);
226 private List<Line> addedLines(Hunk hunk) {
227 var added = new ArrayList<Line>();
228 var addedStart = hunk.target().range().start();
229 var addedEnd = hunk.target().range().end();
230 for (var lineNum = addedStart; lineNum < addedEnd; lineNum++) {
231 var text = destContent.get(lineNum - 1);
232 added.add(new Line(lineNum, text));
233 }
234
235 assert added.size() == hunk.target().lines().size();
236
237 return added;
238 }
239
240 private Context createContextAfterHunk(Hunk hunk, Hunk nextNonEmptySourceHunk, Hunk nextNonEmptyTargetHunk) {
241 var sourceAfterContextStart = hunk.source().range().end();
242 var sourceAfterContextEnd = hunk.source().range().end() + numContextLines;
243 sourceAfterContextEnd = Math.min(sourceAfterContextEnd, sourceContent.size() + 1);
244 if (nextNonEmptySourceHunk != null) {
245 var nextNonEmptySourceHunkStart = nextNonEmptySourceHunk.source().range().start();
246 sourceAfterContextEnd = sourceAfterContextEnd > nextNonEmptySourceHunkStart
247 ? Math.min(sourceAfterContextEnd, nextNonEmptySourceHunkStart)
248 : Math.max(sourceAfterContextEnd, nextNonEmptySourceHunkStart);
249 }
250 var sourceAfterContextCount = sourceAfterContextEnd - sourceAfterContextStart;
251
252 var destAfterContextStart = hunk.target().range().end();
253 var destAfterContextEnd = hunk.target().range().end() + numContextLines;
254 destAfterContextEnd = Math.min(destAfterContextEnd, destContent.size() + 1);
255 if (nextNonEmptyTargetHunk != null) {
256 var nextNonEmptyTargetHunkStart = nextNonEmptyTargetHunk.target().range().start();
257 destAfterContextEnd = destAfterContextEnd > nextNonEmptyTargetHunkStart
258 ? Math.min(destAfterContextEnd, nextNonEmptyTargetHunkStart)
259 : Math.max(destAfterContextEnd, nextNonEmptyTargetHunkStart);
260 }
261 var destAfterContextCount = destAfterContextEnd - destAfterContextStart;
262
263 var afterContextCount = Math.min(sourceAfterContextCount, destAfterContextCount);
264
265 var sourceLineNumStart = hunk.source().lines().isEmpty() && hunk.source().range().start() == 0 ?
266 sourceAfterContextStart + 1 : sourceAfterContextStart;
267 var sourceEndingLineNum = sourceLineNumStart + afterContextCount;
268 var sourceContextAfter = new ArrayList<Line>();
269 for (var lineNum = sourceLineNumStart; lineNum < sourceEndingLineNum; lineNum++) {
270 var text = sourceContent.get(lineNum - 1);
271 sourceContextAfter.add(new Line(lineNum, text));
272 }
273
274 var destLineNumStart = hunk.target().lines().isEmpty() && hunk.target().range().start() == 0 ?
275 destAfterContextStart + 1 : destAfterContextStart;
276 var destEndingLineNum = destLineNumStart + afterContextCount;
277 var destContextAfter = new ArrayList<Line>();
278 for (var lineNum = destLineNumStart; lineNum < destEndingLineNum; lineNum++) {
279 var text = destContent.get(lineNum - 1);
|