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

Statements: 93.75% (75 / 80)      Branches: 83.78% (31 / 37)      Functions: 94.44% (17 / 18)      Lines: 97.14% (68 / 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 51 51 51 51     1 51     1 345     345       1       1 65     1 65     1 180     1 19     1 32 32     1 64 64     1 161 159       1 376   52 52     1 916 857 857   825 32 32     825 481   481 481 280   481     344   344 344 344     1 1936   345     345     345     1936     1 2289 2289     1 1338     1 937 937   937 937    
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)) {
    Iif (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));
};