Code coverage report for 6to5/generation/buffer.js

Statements: 96.25% (77 / 80)      Branches: 86.49% (32 / 37)      Functions: 100% (18 / 18)      Lines: 98.57% (69 / 70)      Ignored: none     

All files » 6to5/generation/ » buffer.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 1261   1 1   1 315 315 315 315     1 315     1 8379     8379       1 19     1 560     1 560     1 1472     1 26     1 400 400     1 239 239     1 1329 1242       1 3647   618 618     1 7340 7017 7017   6617 400 400     6617 3417   3331 3331 2400   3331     3200   3200 3200 3200     1 16806   8288     8288     8288     16806     1 20152 20152     1 10434     1 13724 13724   13724 13724    
module.exports = Buffer;
 
var util = require("../util");
var _    = require("lodash");
 
function Buffer(position, format) {
  this.position = position;
  this._indent  = format.indent.base;
  this.format   = format;
  this.buf      = "";
}
 
Buffer.prototype.get = function () {
  return util.trimRight(this.buf);
};
 
Buffer.prototype.getIndent = function () {
  Iif (this.format.compact) {
    return "";
  } else {
    return util.repeat(this._indent, this.format.indent.style);
  }
};
 
Buffer.prototype.indentSize = function () {
  return this.getIndent().length;
};
 
Buffer.prototype.indent = function () {
  this._indent++;
};
 
Buffer.prototype.dedent = function () {
  this._indent--;
};
 
Buffer.prototype.semicolon = function () {
  Eif (this.format.semicolons) this.push(";");
};
 
Buffer.prototype.ensureSemicolon = function () {
  Eif (!this.isLast(";")) this.semicolon();
};
 
Buffer.prototype.rightBrace = function () {
  this.newline(true);
  this.push("}");
};
 
Buffer.prototype.keyword = function (name) {
  this.push(name);
  this.push(" ");
};
 
Buffer.prototype.space = function () {
  if (this.buf && !this.isLast([" ", "\n"])) {
    this.push(" ");
  }
};
 
Buffer.prototype.removeLast = function (cha) {
  if (!this.isLast(cha)) return;
 
  this.buf = this.buf.slice(0, -1);
  this.position.unshift(cha);
};
 
Buffer.prototype.newline = function (i, removeLast) {
  if (!this.buf) return;
  Iif (this.format.compact) return;
  if (this.endsWith("{\n")) return;
 
  if (_.isBoolean(i)) {
    removeLast = i;
    i = null;
  }
 
  if (_.isNumber(i)) {
    if (this.endsWith(util.repeat(i, "\n"))) return;
 
    var self = this;
    _.times(i, function () {
      self.newline(null, removeLast);
    });
    return;
  }
 
  if (removeLast && this.isLast("\n")) this.removeLast("\n");
 
  this.removeLast(" ");
  this.buf = this.buf.replace(/\n +$/, "\n");
  this._push("\n");
};
 
Buffer.prototype.push = function (str, noIndent) {
  if (this._indent && !noIndent && str !== "\n") {
    // we have an indent level and we aren't pushing a newline
    var indent = this.getIndent();
 
    // replace all newlines with newlines with the indentation
    str = str.replace(/\n/g, "\n" + indent);
 
    // we've got a newline before us so prepend on the indentation
    if (this.isLast("\n")) str = indent + str;
  }
 
  this._push(str);
};
 
Buffer.prototype._push = function (str) {
  this.position.push(str);
  this.buf += str;
};
 
Buffer.prototype.endsWith = function (str) {
  return this.buf.slice(-str.length) === str;
};
 
Buffer.prototype.isLast = function (cha, trimRight) {
  var buf = this.buf;
  Iif (trimRight) buf = util.trimRight(buf);
 
  var chars = [].concat(cha);
  return _.contains(chars, _.last(buf));
};