Move the key positions calculation up from gr-diff-builder to gr-diff

This change removes the comment model dependency in gr-diff-builder,
allowing an easier reuse of the component.

A follow up change will remove the comment model dependency in gr-diff
by replacing it with threadEl model.

Change-Id: I2b8c3394a5aaa5b8880af24a057008eb2692b245
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
index 862db10..e587953 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.html
@@ -293,8 +293,7 @@
               line-wrapping="[[lineWrapping]]"
               is-image-diff="[[isImageDiff]]"
               base-image="[[baseImage]]"
-              revision-image="[[revisionImage]]"
-              line-of-interest="[[lineOfInterest]]">
+              revision-image="[[revisionImage]]">
             <slot></slot>
             <table
                 id="diffTable"
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
index f87e46f..d5f92f1 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff.js
@@ -35,6 +35,18 @@
     RIGHT: 'right',
   };
 
+  const Defs = {};
+
+  /**
+   * Special line number which should not be collapsed into a shared region.
+   *
+   * @typedef {{
+   *  number: number,
+   *  leftSide: boolean
+   * }}
+   */
+  Defs.LineOfInterest;
+
   const LARGE_DIFF_THRESHOLD_LINES = 10000;
   const FULL_CONTEXT = -1;
   const LIMITED_CONTEXT = 10;
@@ -121,13 +133,7 @@
         observer: '_viewModeObserver',
       },
 
-      /**
-       * Special line number which should not be collapsed into a shared region.
-       * @type {{
-       *  number: number,
-       *  leftSide: {boolean}
-       * }|null}
-       */
+       /** @type ?Defs.LineOfInterest */
       lineOfInterest: Object,
 
       loading: {
@@ -639,7 +645,9 @@
       }
 
       this._showWarning = false;
-      this.$.diffBuilder.render(this.comments, this._getBypassPrefs());
+      const keyLocations = this._getKeyLocations(this.comments,
+          this.lineOfInterest);
+      this.$.diffBuilder.render(keyLocations, this._getBypassPrefs());
     },
 
     _handleRenderContent() {
@@ -676,6 +684,39 @@
     },
 
     /**
+     * Returns the key locations based on the comments and line of interests,
+     * where lines should not be collapsed.
+     *
+     * @param {!Object} comments
+     * @param {Defs.LineOfInterest|null} lineOfInterest
+     *
+     * @return {{left: Object<(string|number), boolean>,
+     *     right: Object<(string|number), boolean>}}
+     */
+    _getKeyLocations(comments, lineOfInterest) {
+      const result = {
+        left: {},
+        right: {},
+      };
+      for (const side in comments) {
+        if (side !== GrDiffBuilder.Side.LEFT &&
+            side !== GrDiffBuilder.Side.RIGHT) {
+          continue;
+        }
+        for (const c of comments[side]) {
+          result[side][c.line || GrDiffLine.FILE] = true;
+        }
+      }
+
+      if (lineOfInterest) {
+        const side = lineOfInterest.leftSide ? 'left' : 'right';
+        result[side][lineOfInterest.number] = true;
+      }
+
+      return result;
+    },
+
+    /**
      * Get the preferences object including the safety bypass context (if any).
      */
     _getBypassPrefs() {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
index 62284ad..c6ef806 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff/gr-diff_test.html
@@ -1127,6 +1127,33 @@
         assert.equal(element._computeNewlineWarningClass('foo', false), shown);
       });
     });
+
+    test('_getKeyLocations', () => {
+      assert.deepEqual(element._getKeyLocations({left: [], right: []}, null),
+          {left: {}, right: {}});
+      const comments = {
+        left: [{line: 123}, {}],
+        right: [{line: 456}],
+      };
+      assert.deepEqual(element._getKeyLocations(comments, null), {
+        left: {FILE: true, 123: true},
+        right: {456: true},
+      });
+
+      const lineOfInterest = {number: 789, leftSide: true};
+      assert.deepEqual(
+          element._getKeyLocations(comments, lineOfInterest), {
+            left: {FILE: true, 123: true, 789: true},
+            right: {456: true},
+          });
+
+      delete lineOfInterest.leftSide;
+      assert.deepEqual(
+          element._getKeyLocations(comments, lineOfInterest), {
+            left: {FILE: true, 123: true},
+            right: {456: true, 789: true},
+          });
+    });
   });
 
   a11ySuite('basic');