| /** |
| * @license |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the 'License'); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an 'AS IS' BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| (function(window, GrDiffLine) { |
| 'use strict'; |
| |
| // Prevent redefinition. |
| if (window.GrDiffGroup) { return; } |
| |
| /** |
| * A chunk of the diff that should be rendered together. |
| */ |
| function GrDiffGroup(type, opt_lines) { |
| this.type = type; |
| |
| /** @type{!Array<!GrDiffLine>} */ |
| this.lines = []; |
| /** @type{!Array<!GrDiffLine>} */ |
| this.adds = []; |
| /** @type{!Array<!GrDiffLine>} */ |
| this.removes = []; |
| |
| /** @type{boolean|undefined} */ |
| this.dueToRebase = undefined; |
| |
| this.lineRange = { |
| left: {start: null, end: null}, |
| right: {start: null, end: null}, |
| }; |
| |
| if (opt_lines) { |
| opt_lines.forEach(this.addLine, this); |
| } |
| } |
| |
| GrDiffGroup.prototype.element = null; |
| |
| GrDiffGroup.Type = { |
| /** Unchanged context. */ |
| BOTH: 'both', |
| |
| /** A widget used to show more context. */ |
| CONTEXT_CONTROL: 'contextControl', |
| |
| /** Added, removed or modified chunk. */ |
| DELTA: 'delta', |
| }; |
| |
| GrDiffGroup.prototype.addLine = function(line) { |
| this.lines.push(line); |
| |
| const notDelta = (this.type === GrDiffGroup.Type.BOTH || |
| this.type === GrDiffGroup.Type.CONTEXT_CONTROL); |
| if (notDelta && (line.type === GrDiffLine.Type.ADD || |
| line.type === GrDiffLine.Type.REMOVE)) { |
| throw Error('Cannot add delta line to a non-delta group.'); |
| } |
| |
| if (line.type === GrDiffLine.Type.ADD) { |
| this.adds.push(line); |
| } else if (line.type === GrDiffLine.Type.REMOVE) { |
| this.removes.push(line); |
| } |
| this._updateRange(line); |
| }; |
| |
| GrDiffGroup.prototype.getSideBySidePairs = function() { |
| if (this.type === GrDiffGroup.Type.BOTH || |
| this.type === GrDiffGroup.Type.CONTEXT_CONTROL) { |
| return this.lines.map(line => { |
| return { |
| left: line, |
| right: line, |
| }; |
| }); |
| } |
| |
| const pairs = []; |
| let i = 0; |
| let j = 0; |
| while (i < this.removes.length || j < this.adds.length) { |
| pairs.push({ |
| left: this.removes[i] || GrDiffLine.BLANK_LINE, |
| right: this.adds[j] || GrDiffLine.BLANK_LINE, |
| }); |
| i++; |
| j++; |
| } |
| 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); |