Sha256: 2fe905d907fc503e34ce7945693f7a2a40d8522175d0a7fa265a83d6cbfa90f4

Contents?: true

Size: 1.75 KB

Versions: 5

Compression:

Stored size: 1.75 KB

Contents

const {
  align,
  concat,
  fill,
  group,
  hardline,
  indent,
  line
} = require("../prettier");

module.exports = {
  case: (path, opts, print) => {
    const statement = ["case"];

    // You don't need to explicitly have something to test against in a case
    // statement (without it it effectively becomes an if/elsif chain).
    if (path.getValue().body[0]) {
      statement.push(" ", path.call(print, "body", 0));
    }

    return concat(
      statement.concat([hardline, path.call(print, "body", 1), hardline, "end"])
    );
  },
  when: (path, opts, print) => {
    const [_preds, _stmts, addition] = path.getValue().body;

    // The `fill` builder command expects an array of docs alternating with
    // line breaks. This is so it can loop through and determine where to break.
    const preds = fill(
      path.call(print, "body", 0).reduce((accum, pred, index) => {
        if (index === 0) {
          return [pred];
        }

        // Pull off the last element and make it concat with a comma so that
        // we can maintain alternating lines and docs.
        return accum
          .slice(0, -1)
          .concat([concat([accum[accum.length - 1], ","]), line, pred]);
      }, null)
    );

    const stmts = path.call(print, "body", 1);
    const parts = [concat(["when ", align("when ".length, preds)])];

    // It's possible in a when to just have empty void statements, in which case
    // we would skip adding the body.
    if (!stmts.parts.every((part) => !part)) {
      parts.push(indent(concat([hardline, stmts])));
    }

    // This is the next clause on the case statement, either another `when` or
    // an `else` clause.
    if (addition) {
      parts.push(hardline, path.call(print, "body", 2));
    }

    return group(concat(parts));
  }
};

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
prettier-1.2.0 src/nodes/case.js
prettier-1.1.0 src/nodes/case.js
prettier-1.0.1 src/nodes/case.js
prettier-1.0.0 src/nodes/case.js
prettier-1.0.0.pre.rc2 src/nodes/case.js