From 7bbc6b49c0294d662186b416b989b1f2367f70ef Mon Sep 17 00:00:00 2001 From: Wyatt Allen Date: Thu, 30 Jun 2016 16:59:53 -0700 Subject: [PATCH] Add line range information to group objects Group objects now keep track of the range of line numbers for the lines they contain, making specific groups easier to identify. Change-Id: I37873d83e1003d75df7da77e619e23208d1c30b3 --- .../diff/gr-diff-builder/gr-diff-builder.js | 23 +++---------- .../elements/diff/gr-diff/gr-diff-group.js | 34 +++++++++++++++++++ .../diff/gr-diff/gr-diff-group_test.html | 21 ++++++++++++ 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js index f68825c352..cf94c4fbbe 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js +++ b/polygerrit-ui/app/elements/diff/gr-diff-builder/gr-diff-builder.js @@ -91,26 +91,11 @@ } var groupStartLine = 0; var groupEndLine = 0; - switch (group.type) { - case GrDiffGroup.Type.BOTH: - if (opt_side === GrDiffBuilder.Side.LEFT) { - groupStartLine = group.lines[0].beforeNumber; - groupEndLine = group.lines[group.lines.length - 1].beforeNumber; - } else if (opt_side === GrDiffBuilder.Side.RIGHT) { - groupStartLine = group.lines[0].afterNumber; - groupEndLine = group.lines[group.lines.length - 1].afterNumber; - } - break; - case GrDiffGroup.Type.DELTA: - if (opt_side === GrDiffBuilder.Side.LEFT && group.removes.length) { - groupStartLine = group.removes[0].beforeNumber; - groupEndLine = group.removes[group.removes.length - 1].beforeNumber; - } else if (group.adds.length) { - groupStartLine = group.adds[0].afterNumber; - groupEndLine = group.adds[group.adds.length - 1].afterNumber; - } - break; + if (opt_side) { + groupStartLine = group.lineRange[opt_side].start; + groupEndLine = group.lineRange[opt_side].end; } + if (groupStartLine === 0) { // Line was removed or added. groupStartLine = groupEndLine; } diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js index 638d7f5ce0..2dc495a61d 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js +++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group.js @@ -23,6 +23,11 @@ this.adds = []; this.removes = []; + this.lineRange = { + left: {start: null, end: null}, + right: {start: null, end: null}, + }; + if (opt_lines) { opt_lines.forEach(this.addLine, this); } @@ -51,6 +56,7 @@ } else if (line.type === GrDiffLine.Type.REMOVE) { this.removes.push(line); } + this._updateRange(line); }; GrDiffGroup.prototype.getSideBySidePairs = function() { @@ -78,5 +84,33 @@ return pairs; }; + GrDiffGroup.prototype._updateRange = function(line) { + if (line.beforeNumber === 'FILE' || line.afterNumber === 'FILE') { return; } + + if (line.type === GrDiffLine.Type.ADD || + line.type === GrDiffLine.Type.BOTH) { + if (this.lineRange.right.start === null || + line.afterNumber < this.lineRange.right.start) { + this.lineRange.right.start = line.afterNumber; + } + if (this.lineRange.right.end === null || + line.afterNumber > this.lineRange.right.end) { + this.lineRange.right.end = line.afterNumber; + } + } + + if (line.type === GrDiffLine.Type.REMOVE || + line.type === GrDiffLine.Type.BOTH) { + if (this.lineRange.left.start === null || + line.beforeNumber < this.lineRange.left.start) { + this.lineRange.left.start = line.beforeNumber; + } + if (this.lineRange.left.end === null || + line.beforeNumber > this.lineRange.left.end) { + this.lineRange.left.end = line.beforeNumber; + } + } + }; + window.GrDiffGroup = GrDiffGroup; })(window, GrDiffLine); diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html index d3063e7ae6..563825e90a 100644 --- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html +++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff-group_test.html @@ -30,12 +30,19 @@ limitations under the License. var l1 = new GrDiffLine(GrDiffLine.Type.ADD); var l2 = new GrDiffLine(GrDiffLine.Type.ADD); var l3 = new GrDiffLine(GrDiffLine.Type.REMOVE); + l1.afterNumber = 128; + l2.afterNumber = 129; + l3.beforeNumber = 64; group.addLine(l1); group.addLine(l2); group.addLine(l3); assert.deepEqual(group.lines, [l1, l2, l3]); assert.deepEqual(group.adds, [l1, l2]); assert.deepEqual(group.removes, [l3]); + assert.deepEqual(group.lineRange, { + left: {start: 64, end: 64}, + right: {start: 128, end: 129}, + }); var pairs = group.getSideBySidePairs(); assert.deepEqual(pairs, [ @@ -57,14 +64,28 @@ limitations under the License. test('group/header line pairs', function() { var l1 = new GrDiffLine(GrDiffLine.Type.BOTH); + l1.beforeNumber = 64; + l1.afterNumber = 128; + var l2 = new GrDiffLine(GrDiffLine.Type.BOTH); + l2.beforeNumber = 65; + l2.afterNumber = 129; + var l3 = new GrDiffLine(GrDiffLine.Type.BOTH); + l3.beforeNumber = 66; + l3.afterNumber = 130; + var group = new GrDiffGroup(GrDiffGroup.Type.BOTH, [l1, l2, l3]); assert.deepEqual(group.lines, [l1, l2, l3]); assert.deepEqual(group.adds, []); assert.deepEqual(group.removes, []); + assert.deepEqual(group.lineRange, { + left: {start: 64, end: 66}, + right: {start: 128, end: 130}, + }); + var pairs = group.getSideBySidePairs(); assert.deepEqual(pairs, [ {left: l1, right: l1},