message: Avoid Object.definePropert{y,ies} in lib/lines.js when possible.
diff: @@ -14,6 +14,12 @@ var Mapping = require("./mapping");
  // 4. Enforce immutability.
  // 5. No newline characters.
  +var useSymbol = typeof Symbol === "function";
  +var secretKey = "recastLinesSecret";
  +if (useSymbol) {
  + secretKey = Symbol.for(secretKey);
  +}
  +
  function getSecret(lines) {
  return lines[secretKey];
  }
  @@ -28,15 +34,16 @@ function Lines(infos, sourceFileName) {
  sourceFileName = null;
  }
  - Object.defineProperty(this, secretKey, {
  - value: {
  + setSymbolOrKey(this, secretKey, {
  infos: infos,
  mappings: [],
  name: sourceFileName,
  cachedSourceMap: null
  - }
  });
  + this.length = infos.length;
  + this.name = sourceFileName;
  +
  if (sourceFileName) {
  getSecret(this).mappings.push(new Mapping(this, {
  start: this.firstPos(),
  @@ -45,28 +52,26 @@ function Lines(infos, sourceFileName) {
  }
  }
  +function setSymbolOrKey(obj, key, value) {
  + if (useSymbol) {
  + return obj[key] = value;
  + }
  +
  + Object.defineProperty(obj, key, {
  + value: value,
  + enumerable: false,
  + writable: false,
  + configurable: true
  + });
  +
  + return value;
  +}
  +
  // Exposed for instanceof checks. The fromString function should be used
  // to create new Lines objects.
  exports.Lines = Lines;
  var Lp = Lines.prototype;
  -// These properties used to be assigned to each new object in the Lines
  -// constructor, but we can more efficiently stuff them into the secret and
  -// let these lazy accessors compute their values on-the-fly.
  -Object.defineProperties(Lp, {
  - length: {
  - get: function() {
  - return getSecret(this).infos.length;
  - }
  - },
  -
  - name: {
  - get: function() {
  - return getSecret(this).name;
  - }
  - }
  -});
  -
  function copyLineInfo(info) {
  return {
  line: info.line,
  