prettier 2.0.0.pre.rc3 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -4
  3. data/dist/haml/parser.rb +6 -0
  4. data/dist/parser/getInfo.js +9 -2
  5. data/dist/parser/parseSync.js +53 -16
  6. data/dist/parser/server.rb +6 -2
  7. data/dist/rbs/parser.rb +59 -2
  8. data/dist/rbs/printer.js +14 -6
  9. data/dist/ruby/embed.js +10 -5
  10. data/dist/ruby/location.js +19 -0
  11. data/dist/ruby/nodes/alias.js +6 -5
  12. data/dist/ruby/nodes/aref.js +4 -6
  13. data/dist/ruby/nodes/args.js +29 -56
  14. data/dist/ruby/nodes/arrays.js +31 -35
  15. data/dist/ruby/nodes/assign.js +19 -23
  16. data/dist/ruby/nodes/blocks.js +18 -15
  17. data/dist/ruby/nodes/calls.js +33 -30
  18. data/dist/ruby/nodes/case.js +8 -8
  19. data/dist/ruby/nodes/class.js +13 -13
  20. data/dist/ruby/nodes/commands.js +36 -22
  21. data/dist/ruby/nodes/conditionals.js +56 -52
  22. data/dist/ruby/nodes/constants.js +10 -13
  23. data/dist/ruby/nodes/flow.js +39 -46
  24. data/dist/ruby/nodes/hashes.js +26 -30
  25. data/dist/ruby/nodes/heredocs.js +9 -9
  26. data/dist/ruby/nodes/hooks.js +2 -2
  27. data/dist/ruby/nodes/ints.js +5 -5
  28. data/dist/ruby/nodes/lambdas.js +7 -6
  29. data/dist/ruby/nodes/loops.js +26 -24
  30. data/dist/ruby/nodes/massign.js +22 -35
  31. data/dist/ruby/nodes/methods.js +20 -40
  32. data/dist/ruby/nodes/operators.js +26 -28
  33. data/dist/ruby/nodes/params.js +31 -25
  34. data/dist/ruby/nodes/patterns.js +52 -42
  35. data/dist/ruby/nodes/regexp.js +6 -6
  36. data/dist/ruby/nodes/rescue.js +28 -24
  37. data/dist/ruby/nodes/return.js +61 -36
  38. data/dist/ruby/nodes/statements.js +24 -25
  39. data/dist/ruby/nodes/strings.js +36 -34
  40. data/dist/ruby/nodes/super.js +6 -10
  41. data/dist/ruby/nodes/undef.js +19 -14
  42. data/dist/ruby/nodes.js +47 -21
  43. data/dist/ruby/parser.js +3 -2
  44. data/dist/ruby/parser.rb +8470 -2972
  45. data/dist/ruby/printer.js +9 -71
  46. data/dist/ruby/toProc.js +33 -35
  47. data/dist/types.js +5 -1
  48. data/dist/utils/containsAssignment.js +5 -2
  49. data/dist/utils/getChildNodes.js +305 -0
  50. data/dist/utils/inlineEnsureParens.js +1 -1
  51. data/dist/utils/isEmptyBodyStmt.js +1 -1
  52. data/dist/utils/isEmptyParams.js +12 -0
  53. data/dist/utils/isEmptyStmts.js +1 -1
  54. data/dist/utils/makeCall.js +5 -4
  55. data/dist/utils/printEmptyCollection.js +3 -1
  56. data/dist/utils/skipAssignIndent.js +6 -2
  57. data/dist/utils.js +5 -3
  58. data/exe/rbprettier +1 -2
  59. data/lib/prettier.rb +37 -5
  60. data/node_modules/prettier/bin-prettier.js +48 -18924
  61. data/node_modules/prettier/cli.js +12335 -0
  62. data/node_modules/prettier/doc.js +1306 -4755
  63. data/node_modules/prettier/index.js +37468 -57614
  64. data/node_modules/prettier/package.json +3 -2
  65. data/node_modules/prettier/parser-angular.js +2 -66
  66. data/node_modules/prettier/parser-babel.js +27 -22
  67. data/node_modules/prettier/parser-espree.js +26 -22
  68. data/node_modules/prettier/parser-flow.js +26 -22
  69. data/node_modules/prettier/parser-glimmer.js +27 -1
  70. data/node_modules/prettier/parser-graphql.js +15 -1
  71. data/node_modules/prettier/parser-html.js +21 -117
  72. data/node_modules/prettier/parser-markdown.js +61 -19
  73. data/node_modules/prettier/parser-meriyah.js +19 -22
  74. data/node_modules/prettier/parser-postcss.js +76 -22
  75. data/node_modules/prettier/parser-typescript.js +280 -22
  76. data/node_modules/prettier/parser-yaml.js +150 -15
  77. data/node_modules/prettier/third-party.js +8660 -11030
  78. data/package.json +8 -8
  79. data/rubocop.yml +9 -3
  80. metadata +9 -5
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printHash = exports.printHashContents = exports.printAssocSplat = exports.printAssocNew = void 0;
6
+ exports.printHash = exports.printHashContents = exports.printAssocSplat = exports.printAssoc = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
8
  const utils_1 = require("../../utils");
9
9
  const { group, ifBreak, indent, join, line } = prettier_1.default;
@@ -18,19 +18,19 @@ const { group, ifBreak, indent, join, line } = prettier_1.default;
18
18
  // This function represents that check, as it determines if it can convert the
19
19
  // symbol node into a hash label.
20
20
  function isValidHashLabel(symbolLiteral) {
21
- const label = symbolLiteral.body[0].body;
21
+ const label = symbolLiteral.value.value;
22
22
  return label.match(/^[_A-Za-z]/) && !label.endsWith("=");
23
23
  }
24
24
  function canUseHashLabels(contentsNode) {
25
- return contentsNode.body.every((assocNode) => {
25
+ return contentsNode.assocs.every((assocNode) => {
26
26
  if (assocNode.type === "assoc_splat") {
27
27
  return true;
28
28
  }
29
- switch (assocNode.body[0].type) {
30
- case "@label":
29
+ switch (assocNode.key.type) {
30
+ case "label":
31
31
  return true;
32
32
  case "symbol_literal":
33
- return isValidHashLabel(assocNode.body[0]);
33
+ return isValidHashLabel(assocNode.key);
34
34
  case "dyna_symbol":
35
35
  return true;
36
36
  default:
@@ -41,12 +41,10 @@ function canUseHashLabels(contentsNode) {
41
41
  const printHashKeyLabel = (path, print) => {
42
42
  const node = path.getValue();
43
43
  switch (node.type) {
44
- case "@label":
44
+ case "label":
45
45
  return print(path);
46
- case "symbol_literal": {
47
- const nodePath = path;
48
- return [nodePath.call(print, "body", 0), ":"];
49
- }
46
+ case "symbol_literal":
47
+ return [path.call(print, "value"), ":"];
50
48
  case "dyna_symbol":
51
49
  return [print(path), ":"];
52
50
  default:
@@ -58,7 +56,7 @@ const printHashKeyLabel = (path, print) => {
58
56
  const printHashKeyRocket = (path, print) => {
59
57
  const node = path.getValue();
60
58
  let doc = print(path);
61
- if (node.type === "@label") {
59
+ if (node.type === "label") {
62
60
  const sDoc = doc; // since we know this is a label
63
61
  doc = [":", sDoc.slice(0, sDoc.length - 1)];
64
62
  }
@@ -67,18 +65,18 @@ const printHashKeyRocket = (path, print) => {
67
65
  }
68
66
  return [doc, " =>"];
69
67
  };
70
- const printAssocNew = (path, opts, print) => {
71
- const [keyNode, valueNode] = path.getValue().body;
68
+ const printAssoc = (path, opts, print) => {
69
+ const node = path.getValue();
72
70
  const { keyPrinter } = path.getParentNode();
73
- const parts = [path.call((keyPath) => keyPrinter(keyPath, print), "body", 0)];
74
- const valueDoc = path.call(print, "body", 1);
71
+ const parts = [path.call((keyPath) => keyPrinter(keyPath, print), "key")];
72
+ const valueDoc = path.call(print, "value");
75
73
  // If we're printing a child hash then we want it to break along with its
76
74
  // parent hash, so we don't group the parts.
77
- if (valueNode.type === "hash") {
75
+ if (node.value.type === "hash") {
78
76
  parts.push(" ", valueDoc);
79
77
  return parts;
80
78
  }
81
- if (!(0, utils_1.skipAssignIndent)(valueNode) || keyNode.comments) {
79
+ if (!(0, utils_1.skipAssignIndent)(node.value) || node.key.comments) {
82
80
  parts.push(indent([line, valueDoc]));
83
81
  }
84
82
  else {
@@ -86,10 +84,8 @@ const printAssocNew = (path, opts, print) => {
86
84
  }
87
85
  return group(parts);
88
86
  };
89
- exports.printAssocNew = printAssocNew;
90
- const printAssocSplat = (path, opts, print) => {
91
- return ["**", path.call(print, "body", 0)];
92
- };
87
+ exports.printAssoc = printAssoc;
88
+ const printAssocSplat = (path, opts, print) => ["**", path.call(print, "value")];
93
89
  exports.printAssocSplat = printAssocSplat;
94
90
  const printHashContents = (path, opts, print) => {
95
91
  const node = path.getValue();
@@ -99,22 +95,22 @@ const printHashContents = (path, opts, print) => {
99
95
  opts.rubyHashLabel && canUseHashLabels(path.getValue())
100
96
  ? printHashKeyLabel
101
97
  : printHashKeyRocket;
102
- return join([",", line], path.map(print, "body"));
98
+ return join([",", line], path.map(print, "assocs"));
103
99
  };
104
100
  exports.printHashContents = printHashContents;
105
101
  const printHash = (path, opts, print) => {
106
- const hashNode = path.getValue();
102
+ const node = path.getValue();
107
103
  // Hashes normally have a single assoclist_from_args child node. If it's
108
104
  // missing, then it means we're dealing with an empty hash, so we can just
109
105
  // exit here and print.
110
- if (hashNode.body[0] === null) {
106
+ if (node.cnts === null) {
111
107
  return (0, utils_1.printEmptyCollection)(path, opts, "{", "}");
112
108
  }
113
- const hashDoc = [
109
+ const doc = [
114
110
  "{",
115
111
  indent([
116
112
  line,
117
- path.call(print, "body", 0),
113
+ path.call(print, "cnts"),
118
114
  (0, utils_1.getTrailingComma)(opts) ? ifBreak(",", "") : ""
119
115
  ]),
120
116
  line,
@@ -122,9 +118,9 @@ const printHash = (path, opts, print) => {
122
118
  ];
123
119
  // If we're inside another hash, then we don't want to group our contents
124
120
  // because we want this hash to break along with its parent hash.
125
- if (path.getParentNode().type === "assoc_new") {
126
- return hashDoc;
121
+ if (path.getParentNode().type === "assoc") {
122
+ return doc;
127
123
  }
128
- return group(hashDoc);
124
+ return group(doc);
129
125
  };
130
126
  exports.printHash = printHash;
@@ -8,15 +8,15 @@ const prettier_1 = __importDefault(require("../../prettier"));
8
8
  const utils_1 = require("../../utils");
9
9
  const { group, lineSuffix, join } = prettier_1.default;
10
10
  const printHeredoc = (path, opts, print) => {
11
- const { body, ending } = path.getValue();
12
- const parts = body.map((part, index) => {
13
- if (part.type !== "@tstring_content") {
14
- // In this case, the part of the string is an embedded expression
15
- return path.call(print, "body", index);
11
+ const node = path.getValue();
12
+ // Print out each part of the heredoc to its own doc node.
13
+ const parts = path.map((partPath) => {
14
+ const part = partPath.getValue();
15
+ if (part.type !== "tstring_content") {
16
+ return print(partPath);
16
17
  }
17
- // In this case, the part of the string is just regular string content
18
- return join(utils_1.literallineWithoutBreakParent, part.body.split(/\r?\n/));
19
- });
18
+ return join(utils_1.literallineWithoutBreakParent, part.value.split(/\r?\n/));
19
+ }, "parts");
20
20
  // We use a literalline break because matching indentation is required
21
21
  // for the heredoc contents and ending. If the line suffix contains a
22
22
  // break-parent, all ancestral groups are broken, and heredocs automatically
@@ -24,7 +24,7 @@ const printHeredoc = (path, opts, print) => {
24
24
  // possible, so we use a literalline without the break-parent.
25
25
  return group([
26
26
  path.call(print, "beging"),
27
- lineSuffix(group([utils_1.literallineWithoutBreakParent, ...parts, ending]))
27
+ lineSuffix(group([utils_1.literallineWithoutBreakParent, ...parts, node.ending]))
28
28
  ]);
29
29
  };
30
30
  exports.printHeredoc = printHeredoc;
@@ -25,8 +25,8 @@ function printHook(name) {
25
25
  return group([
26
26
  name,
27
27
  " ",
28
- path.call(print, "body", 0),
29
- indent([line, path.call(print, "body", 1)]),
28
+ path.call(print, "lbrace"),
29
+ indent([line, path.call(print, "stmts")]),
30
30
  [line, "}"]
31
31
  ]);
32
32
  };
@@ -6,22 +6,22 @@ exports.printInt = void 0;
6
6
  //
7
7
  // Binary (2) - 0b0110
8
8
  // Octal (8) - 0o34 or 034
9
- // Decimal (10) - a normal number like 159
9
+ // Decimal (10) - 159 or 0d159
10
10
  // Hexidecimal (16) - 0xac5
11
11
  //
12
12
  // If it's a decimal number, it can be optional separated by any number of
13
13
  // arbitrarily places underscores. This can be useful for dollars and cents
14
14
  // (34_99), dates (2020_11_30), and normal 3 digit separation (1_222_333).
15
15
  const printInt = (path) => {
16
- const { body } = path.getValue();
16
+ const { value } = path.getValue();
17
17
  // If the number is a base 10 number, is sufficiently large, and is not
18
18
  // already formatted with underscores, then add them in in between the
19
19
  // numbers every three characters starting from the right.
20
- if (!body.startsWith("0") && body.length >= 5 && !body.includes("_")) {
20
+ if (!value.startsWith("0") && value.length >= 5 && !value.includes("_")) {
21
21
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
22
- const segments = ` ${body}`.slice((body.length + 2) % 3).match(/.{3}/g);
22
+ const segments = ` ${value}`.slice((value.length + 2) % 3).match(/.{3}/g);
23
23
  return segments.join("_").trim();
24
24
  }
25
- return body;
25
+ return value;
26
26
  };
27
27
  exports.printInt = printInt;
@@ -12,19 +12,19 @@ const { group, ifBreak, indent, line } = prettier_1.default;
12
12
  // though it's possible to omit the parens if you only have one argument, we're
13
13
  // going to keep them in no matter what for consistency.
14
14
  function printLambdaParams(path, print) {
15
- let node = path.getValue().body[0];
15
+ let node = path.getValue().params;
16
16
  // In this case we had something like -> (foo) { bar } which would mean that
17
17
  // we're looking at a paren node, so we'll descend one level deeper to get at
18
18
  // the actual params node.
19
19
  if (node.type !== "params") {
20
- node = node.body[0];
20
+ node = node.cnts;
21
21
  }
22
22
  // If we don't have any params at all, then we're just going to bail out and
23
23
  // print nothing. This is to avoid printing an empty set of parentheses.
24
- if (node.body.every((type) => !type)) {
24
+ if ((0, utils_1.isEmptyParams)(node)) {
25
25
  return "";
26
26
  }
27
- return path.call(print, "body", 0);
27
+ return path.call(print, "params");
28
28
  }
29
29
  // Lambda nodes represent stabby lambda literals, which can come in a couple of
30
30
  // flavors. They can use either braces or do...end for their block, and their
@@ -56,14 +56,15 @@ function printLambdaParams(path, print) {
56
56
  const printLambda = (path, opts, print) => {
57
57
  const params = printLambdaParams(path, print);
58
58
  const inCommand = (0, utils_1.hasAncestor)(path, ["command", "command_call"]);
59
+ const stmtsDoc = path.call(print, "stmts");
59
60
  return group(ifBreak([
60
61
  "->",
61
62
  params,
62
63
  " ",
63
64
  inCommand ? "{" : "do",
64
- indent([line, path.call(print, "body", 1)]),
65
+ indent([line, stmtsDoc]),
65
66
  line,
66
67
  inCommand ? "}" : "end"
67
- ], ["->", params, " { ", path.call(print, "body", 1), " }"]));
68
+ ], ["->", params, " { ", stmtsDoc, " }"]));
68
69
  };
69
70
  exports.printLambda = printLambda;
@@ -3,26 +3,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printUntilModifer = exports.printUntil = exports.printWhileModifier = exports.printWhile = exports.printFor = void 0;
6
+ exports.printUntil = exports.printWhile = exports.printFor = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
8
  const utils_1 = require("../../utils");
9
9
  const { align, breakParent, group, hardline, ifBreak, indent, join, softline } = prettier_1.default;
10
- function printLoop(keyword, modifier) {
10
+ function isModifier(node) {
11
+ return node.type === "while_mod" || node.type === "until_mod";
12
+ }
13
+ function printLoop(keyword) {
11
14
  return function printLoopWithOptions(path, { rubyModifier }, print) {
12
- const [, stmts] = path.getValue().body;
15
+ const node = path.getValue();
16
+ const predicateDoc = path.call(print, "pred");
13
17
  // If the only statement inside this while loop is a void statement, then we
14
18
  // can shorten to just displaying the predicate and then a semicolon.
15
- if ((0, utils_1.isEmptyStmts)(stmts)) {
16
- return group([
17
- group([keyword, " ", path.call(print, "body", 0)]),
18
- hardline,
19
- "end"
20
- ]);
19
+ if (!isModifier(node) && (0, utils_1.isEmptyStmts)(node.stmts)) {
20
+ return group([group([keyword, " ", predicateDoc]), hardline, "end"]);
21
21
  }
22
+ const statementDoc = path.call(print, isModifier(node) ? "stmt" : "stmts");
22
23
  const inlineLoop = (0, utils_1.inlineEnsureParens)(path, [
23
- path.call(print, "body", 1),
24
+ statementDoc,
24
25
  ` ${keyword} `,
25
- path.call(print, "body", 0)
26
+ predicateDoc
26
27
  ]);
27
28
  // If we're in the modifier form and we're modifying a `begin`, then this is
28
29
  // a special case where we need to explicitly use the modifier form because
@@ -34,12 +35,12 @@ function printLoop(keyword, modifier) {
34
35
  //
35
36
  // The above is effectively a `do...while` loop (which we don't have in
36
37
  // ruby).
37
- if (modifier && path.getValue().body[1].type === "begin") {
38
+ if (isModifier(node) && node.stmt.type === "begin") {
38
39
  return inlineLoop;
39
40
  }
40
41
  const blockLoop = [
41
- [`${keyword} `, align(keyword.length + 1, path.call(print, "body", 0))],
42
- indent([softline, path.call(print, "body", 1)]),
42
+ [`${keyword} `, align(keyword.length + 1, predicateDoc)],
43
+ indent([softline, statementDoc]),
43
44
  softline,
44
45
  "end"
45
46
  ];
@@ -47,27 +48,28 @@ function printLoop(keyword, modifier) {
47
48
  // contains an assignment (in which case we can't know for certain that that
48
49
  // assignment doesn't impact the statements inside the loop) then we can't
49
50
  // use the modifier form and we must use the block form.
50
- if (!rubyModifier || (0, utils_1.containsAssignment)(path.getValue().body[0])) {
51
+ if (!rubyModifier || (0, utils_1.containsAssignment)(node.pred)) {
51
52
  return [breakParent, blockLoop];
52
53
  }
53
54
  return group(ifBreak(blockLoop, inlineLoop));
54
55
  };
55
56
  }
56
57
  const printFor = (path, opts, print) => {
57
- const [varDoc, rangeDoc, stmtsDoc] = path.map(print, "body");
58
- const varsDoc = path.getValue().body[0].type === "mlhs" ? join(", ", varDoc) : varDoc;
58
+ const node = path.getValue();
59
+ let indexDoc = path.call(print, "index");
60
+ if (node.index.type === "mlhs") {
61
+ indexDoc = join(", ", indexDoc);
62
+ }
59
63
  return group([
60
64
  "for ",
61
- varsDoc,
65
+ indexDoc,
62
66
  " in ",
63
- rangeDoc,
64
- indent([hardline, stmtsDoc]),
67
+ path.call(print, "collection"),
68
+ indent([hardline, path.call(print, "stmts")]),
65
69
  hardline,
66
70
  "end"
67
71
  ]);
68
72
  };
69
73
  exports.printFor = printFor;
70
- exports.printWhile = printLoop("while", false);
71
- exports.printWhileModifier = printLoop("while", true);
72
- exports.printUntil = printLoop("until", false);
73
- exports.printUntilModifer = printLoop("until", true);
74
+ exports.printWhile = printLoop("while");
75
+ exports.printUntil = printLoop("until");
@@ -3,71 +3,58 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printMRHSNewFromArgs = exports.printMRHSAddStar = exports.printMRHS = exports.printMLHSParen = exports.printMLHSAddStar = exports.printMLHSAddPost = exports.printMLHS = exports.printMAssign = void 0;
6
+ exports.printMRHSNewFromArgs = exports.printMRHSAddStar = exports.printMRHS = exports.printMLHSParen = exports.printMLHS = exports.printMAssign = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
8
  const { group, indent, join, line, softline } = prettier_1.default;
9
9
  const printMAssign = (path, opts, print) => {
10
- let right = path.call(print, "body", 1);
11
- if (["mrhs_add_star", "mrhs_new_from_args"].includes(path.getValue().body[1].type)) {
12
- right = group(join([",", line], right));
10
+ const node = path.getValue();
11
+ let valueDoc = path.call(print, "value");
12
+ if (["mrhs", "mrhs_add_star", "mrhs_new_from_args"].includes(node.value.type)) {
13
+ valueDoc = group(join([",", line], valueDoc));
13
14
  }
14
- const parts = [join([",", line], path.call(print, "body", 0))];
15
- if (path.getValue().body[0].comma) {
16
- parts.push(",");
15
+ const targetDoc = [
16
+ join([",", line], path.call(print, "target"))
17
+ ];
18
+ if (node.target.type === "mlhs" && node.target.comma) {
19
+ targetDoc.push(",");
17
20
  }
18
- return group([group(parts), " =", indent([line, right])]);
21
+ return group([group(targetDoc), " =", indent([line, valueDoc])]);
19
22
  };
20
23
  exports.printMAssign = printMAssign;
21
24
  const printMLHS = (path, opts, print) => {
22
- return path.map(print, "body");
25
+ return path.map(print, "parts");
23
26
  };
24
27
  exports.printMLHS = printMLHS;
25
- const printMLHSAddPost = (path, opts, print) => {
26
- return [
27
- ...path.call(print, "body", 0),
28
- ...path.call(print, "body", 1)
29
- ];
30
- };
31
- exports.printMLHSAddPost = printMLHSAddPost;
32
- const printMLHSAddStar = (path, opts, print) => {
33
- const parts = ["*"];
34
- if (path.getValue().body[1]) {
35
- parts.push(path.call(print, "body", 1));
36
- }
37
- return [...path.call(print, "body", 0), parts];
38
- };
39
- exports.printMLHSAddStar = printMLHSAddStar;
40
28
  const printMLHSParen = (path, opts, print) => {
41
29
  if (["massign", "mlhs_paren"].includes(path.getParentNode().type)) {
42
30
  // If we're nested in brackets as part of the left hand side of an
43
31
  // assignment, i.e., (a, b, c) = 1, 2, 3
44
32
  // ignore the current node and just go straight to the content
45
- return path.call(print, "body", 0);
33
+ return path.call(print, "cnts");
46
34
  }
35
+ const node = path.getValue();
47
36
  const parts = [
48
37
  softline,
49
- join([",", line], path.call(print, "body", 0))
38
+ join([",", line], path.call(print, "cnts"))
50
39
  ];
51
- if (path.getValue().body[0].comma) {
40
+ if (node.cnts.comma) {
52
41
  parts.push(",");
53
42
  }
54
43
  return group(["(", indent(parts), [softline, ")"]]);
55
44
  };
56
45
  exports.printMLHSParen = printMLHSParen;
57
46
  const printMRHS = (path, opts, print) => {
58
- return path.map(print, "body");
47
+ return path.map(print, "parts");
59
48
  };
60
49
  exports.printMRHS = printMRHS;
61
50
  const printMRHSAddStar = (path, opts, print) => {
62
- const [leftDoc, rightDoc] = path.map(print, "body");
63
- return [...leftDoc, ["*", rightDoc]];
51
+ return [
52
+ ...path.call(print, "mrhs"),
53
+ ["*", path.call(print, "star")]
54
+ ];
64
55
  };
65
56
  exports.printMRHSAddStar = printMRHSAddStar;
66
57
  const printMRHSNewFromArgs = (path, opts, print) => {
67
- const parts = path.call(print, "body", 0);
68
- if (path.getValue().body[1]) {
69
- parts.push(path.call(print, "body", 1));
70
- }
71
- return parts;
58
+ return path.call(print, "args");
72
59
  };
73
60
  exports.printMRHSNewFromArgs = printMRHSNewFromArgs;
@@ -3,68 +3,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printAccessControl = exports.printSingleLineMethod = exports.printDef = void 0;
6
+ exports.printAccessControl = exports.printDefEndless = exports.printDef = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
8
  const utils_1 = require("../../utils");
9
9
  const { group, hardline, indent, line } = prettier_1.default;
10
10
  const printDef = (path, opts, print) => {
11
11
  const node = path.getValue();
12
12
  const declaration = ["def "];
13
- let paramsNode;
14
- let bodystmtNode;
15
- let nameDoc;
16
- let paramsDoc;
17
- let bodystmtDoc;
18
- if (node.type === "def") {
19
- paramsNode = node.body[1];
20
- bodystmtNode = node.body[2];
21
- nameDoc = path.call(print, "body", 0);
22
- paramsDoc = path.call(print, "body", 1);
23
- bodystmtDoc = path.call(print, "body", 2);
13
+ // In this case, we're printing a method that's defined as a singleton, so
14
+ // we need to include the target and the operator before the name.
15
+ if (node.type === "defs") {
16
+ declaration.push(path.call(print, "target"), path.call(print, "op"));
24
17
  }
25
- else {
26
- // In this case, we're printing a method that's defined as a singleton, so
27
- // we need to include the target and the operator
28
- declaration.push(path.call(print, "body", 0), path.call(print, "body", 1));
29
- paramsNode = node.body[3];
30
- bodystmtNode = node.body[4];
31
- nameDoc = path.call(print, "body", 2);
32
- paramsDoc = path.call(print, "body", 3);
33
- bodystmtDoc = path.call(print, "body", 4);
34
- }
35
- // In case there are no parens but there are arguments
36
- const parens = paramsNode.type === "params" && paramsNode.body.some((type) => type);
37
- declaration.push(nameDoc, parens ? "(" : "", paramsDoc, parens ? ")" : "");
38
- if ((0, utils_1.isEmptyBodyStmt)(bodystmtNode)) {
18
+ // In case there are no parens but there are parameters
19
+ const useParens = node.params.type === "params" && !(0, utils_1.isEmptyParams)(node.params);
20
+ declaration.push(path.call(print, "name"), useParens ? "(" : "", path.call(print, "params"), useParens ? ")" : "");
21
+ if ((0, utils_1.isEmptyBodyStmt)(node.bodystmt)) {
39
22
  return group([...declaration, "; end"]);
40
23
  }
41
24
  return group([
42
25
  group(declaration),
43
- indent([hardline, bodystmtDoc]),
26
+ indent([hardline, path.call(print, "bodystmt")]),
44
27
  hardline,
45
28
  "end"
46
29
  ]);
47
30
  };
48
31
  exports.printDef = printDef;
49
- const printSingleLineMethod = (path, opts, print) => {
50
- const parensNode = path.getValue().body[1];
32
+ const printDefEndless = (path, opts, print) => {
33
+ const node = path.getValue();
51
34
  let paramsDoc = "";
52
- if (parensNode) {
53
- const paramsNode = parensNode.body[0];
54
- if (paramsNode.body.some((type) => type)) {
55
- paramsDoc = path.call(print, "body", 1);
56
- }
35
+ // If we have any kind of parameters, we're going to print the whole
36
+ // parentheses. If we don't, then we're just going to skip them entirely.
37
+ if (node.paren && !(0, utils_1.isEmptyParams)(node.paren.cnts)) {
38
+ paramsDoc = path.call(print, "paren");
57
39
  }
58
40
  return group([
59
41
  "def ",
60
- path.call(print, "body", 0),
42
+ path.call(print, "name"),
61
43
  paramsDoc,
62
44
  " =",
63
- indent(group([line, path.call(print, "body", 2)]))
45
+ indent(group([line, path.call(print, "stmt")]))
64
46
  ]);
65
47
  };
66
- exports.printSingleLineMethod = printSingleLineMethod;
67
- const printAccessControl = (path, opts, print) => {
68
- return path.call(print, "body", 0);
69
- };
48
+ exports.printDefEndless = printDefEndless;
49
+ const printAccessControl = (path, opts, print) => path.call(print, "value");
70
50
  exports.printAccessControl = printAccessControl;
@@ -3,29 +3,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printUnary = exports.printDot3 = exports.printDot2 = exports.printBinary = void 0;
6
+ exports.printNot = exports.printUnary = exports.printDot3 = exports.printDot2 = exports.printBinary = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
8
  const utils_1 = require("../../utils");
9
9
  const { group, indent, line, softline } = prettier_1.default;
10
10
  const printBinary = (path, opts, print) => {
11
- const [, operator, rightNode] = path.getValue().body;
12
- const space = operator === "**" ? "" : " ";
13
- if (utils_1.noIndent.includes(rightNode.type)) {
11
+ const node = path.getValue();
12
+ const space = node.op === "**" ? "" : " ";
13
+ if (utils_1.noIndent.includes(node.right.type)) {
14
14
  return group([
15
- group(path.call(print, "body", 0)),
15
+ group(path.call(print, "left")),
16
16
  space,
17
- operator,
17
+ node.op,
18
18
  space,
19
- group(path.call(print, "body", 2))
19
+ group(path.call(print, "right"))
20
20
  ]);
21
21
  }
22
22
  return group([
23
- group(path.call(print, "body", 0)),
23
+ group(path.call(print, "left")),
24
24
  space,
25
25
  group(indent([
26
- operator,
26
+ node.op,
27
27
  space === "" ? softline : line,
28
- path.call(print, "body", 2)
28
+ path.call(print, "right")
29
29
  ]))
30
30
  ]);
31
31
  };
@@ -33,38 +33,36 @@ exports.printBinary = printBinary;
33
33
  // dot2 nodes are used with ranges (or flip-flops). They can optionally drop
34
34
  // their left side for beginless ranges or their right side for endless ranges.
35
35
  const printDot2 = (path, opts, print) => {
36
- const [leftNode, rightNode] = path.getValue().body;
36
+ const node = path.getValue();
37
37
  return [
38
- leftNode ? path.call(print, "body", 0) : "",
38
+ node.left ? path.call(print, "left") : "",
39
39
  "..",
40
- rightNode ? path.call(print, "body", 1) : ""
40
+ node.right ? path.call(print, "right") : ""
41
41
  ];
42
42
  };
43
43
  exports.printDot2 = printDot2;
44
44
  // dot3 nodes are used with ranges (or flip-flops). They can optionally drop
45
45
  // their left side for beginless ranges or their right side for endless ranges.
46
46
  const printDot3 = (path, opts, print) => {
47
- const [leftNode, rightNode] = path.getValue().body;
47
+ const node = path.getValue();
48
48
  return [
49
- leftNode ? path.call(print, "body", 0) : "",
49
+ node.left ? path.call(print, "left") : "",
50
50
  "...",
51
- rightNode ? path.call(print, "body", 1) : ""
51
+ node.right ? path.call(print, "right") : ""
52
52
  ];
53
53
  };
54
54
  exports.printDot3 = printDot3;
55
55
  const printUnary = (path, opts, print) => {
56
56
  const node = path.getValue();
57
- const contentsDoc = path.call(print, "body", 0);
58
- if (node.oper === "not") {
59
- // Here we defer to the original source, as it's kind of difficult to
60
- // determine if we can actually remove the parentheses being used.
61
- if (node.paren) {
62
- return ["not", "(", contentsDoc, ")"];
63
- }
64
- else {
65
- return ["not", " ", contentsDoc];
66
- }
67
- }
68
- return [node.oper, contentsDoc];
57
+ return [node.op, path.call(print, "value")];
69
58
  };
70
59
  exports.printUnary = printUnary;
60
+ const printNot = (path, opts, print) => {
61
+ const node = path.getValue();
62
+ const valueDoc = path.call(print, "value");
63
+ if (node.paren) {
64
+ return ["not", "(", valueDoc, ")"];
65
+ }
66
+ return ["not", " ", valueDoc];
67
+ };
68
+ exports.printNot = printNot;