prettier 2.0.0 → 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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -1
  3. data/dist/haml/parser.rb +6 -0
  4. data/dist/parser/getInfo.js +9 -2
  5. data/dist/parser/server.rb +6 -2
  6. data/dist/rbs/parser.rb +59 -2
  7. data/dist/rbs/printer.js +14 -6
  8. data/dist/ruby/embed.js +10 -5
  9. data/dist/ruby/location.js +19 -0
  10. data/dist/ruby/nodes/alias.js +6 -5
  11. data/dist/ruby/nodes/aref.js +4 -6
  12. data/dist/ruby/nodes/args.js +29 -56
  13. data/dist/ruby/nodes/arrays.js +31 -35
  14. data/dist/ruby/nodes/assign.js +19 -23
  15. data/dist/ruby/nodes/blocks.js +18 -15
  16. data/dist/ruby/nodes/calls.js +33 -30
  17. data/dist/ruby/nodes/case.js +8 -8
  18. data/dist/ruby/nodes/class.js +13 -13
  19. data/dist/ruby/nodes/commands.js +36 -22
  20. data/dist/ruby/nodes/conditionals.js +56 -52
  21. data/dist/ruby/nodes/constants.js +10 -13
  22. data/dist/ruby/nodes/flow.js +39 -46
  23. data/dist/ruby/nodes/hashes.js +26 -30
  24. data/dist/ruby/nodes/heredocs.js +9 -9
  25. data/dist/ruby/nodes/hooks.js +2 -2
  26. data/dist/ruby/nodes/ints.js +5 -5
  27. data/dist/ruby/nodes/lambdas.js +7 -6
  28. data/dist/ruby/nodes/loops.js +26 -24
  29. data/dist/ruby/nodes/massign.js +22 -35
  30. data/dist/ruby/nodes/methods.js +20 -40
  31. data/dist/ruby/nodes/operators.js +26 -28
  32. data/dist/ruby/nodes/params.js +31 -25
  33. data/dist/ruby/nodes/patterns.js +34 -37
  34. data/dist/ruby/nodes/regexp.js +6 -6
  35. data/dist/ruby/nodes/rescue.js +23 -22
  36. data/dist/ruby/nodes/return.js +61 -36
  37. data/dist/ruby/nodes/statements.js +24 -25
  38. data/dist/ruby/nodes/strings.js +36 -34
  39. data/dist/ruby/nodes/super.js +6 -10
  40. data/dist/ruby/nodes/undef.js +19 -14
  41. data/dist/ruby/nodes.js +47 -21
  42. data/dist/ruby/parser.js +3 -2
  43. data/dist/ruby/parser.rb +8470 -2972
  44. data/dist/ruby/printer.js +9 -71
  45. data/dist/ruby/toProc.js +33 -35
  46. data/dist/types.js +5 -1
  47. data/dist/utils/containsAssignment.js +5 -2
  48. data/dist/utils/getChildNodes.js +305 -0
  49. data/dist/utils/inlineEnsureParens.js +1 -1
  50. data/dist/utils/isEmptyBodyStmt.js +1 -1
  51. data/dist/utils/isEmptyParams.js +12 -0
  52. data/dist/utils/isEmptyStmts.js +1 -1
  53. data/dist/utils/makeCall.js +5 -4
  54. data/dist/utils/printEmptyCollection.js +3 -1
  55. data/dist/utils/skipAssignIndent.js +6 -2
  56. data/dist/utils.js +5 -3
  57. data/lib/prettier.rb +2 -1
  58. data/node_modules/prettier/bin-prettier.js +48 -18924
  59. data/node_modules/prettier/cli.js +12335 -0
  60. data/node_modules/prettier/doc.js +1306 -4755
  61. data/node_modules/prettier/index.js +37468 -57614
  62. data/node_modules/prettier/package.json +3 -2
  63. data/node_modules/prettier/parser-angular.js +2 -66
  64. data/node_modules/prettier/parser-babel.js +27 -22
  65. data/node_modules/prettier/parser-espree.js +26 -22
  66. data/node_modules/prettier/parser-flow.js +26 -22
  67. data/node_modules/prettier/parser-glimmer.js +27 -1
  68. data/node_modules/prettier/parser-graphql.js +15 -1
  69. data/node_modules/prettier/parser-html.js +21 -117
  70. data/node_modules/prettier/parser-markdown.js +61 -19
  71. data/node_modules/prettier/parser-meriyah.js +19 -22
  72. data/node_modules/prettier/parser-postcss.js +76 -22
  73. data/node_modules/prettier/parser-typescript.js +280 -22
  74. data/node_modules/prettier/parser-yaml.js +150 -15
  75. data/node_modules/prettier/third-party.js +8660 -11030
  76. data/package.json +7 -7
  77. metadata +7 -3
@@ -18,16 +18,16 @@ const printPatternArg = (path, opts, print) => {
18
18
  return path.call(print);
19
19
  };
20
20
  const printAryPtn = (path, opts, print) => {
21
- const [constant, preargs, splatarg, postargs] = path.getValue().body;
21
+ const node = path.getValue();
22
22
  let argDocs = [];
23
- if (preargs) {
24
- argDocs = argDocs.concat(path.map((argPath) => printPatternArg(argPath, opts, print), "body", 1));
23
+ if (node.reqs.length > 0) {
24
+ argDocs = argDocs.concat(path.map((argPath) => printPatternArg(argPath, opts, print), "reqs"));
25
25
  }
26
- if (splatarg) {
27
- argDocs.push(["*", path.call(print, "body", 2)]);
26
+ if (node.rest) {
27
+ argDocs.push(["*", path.call(print, "rest")]);
28
28
  }
29
- if (postargs) {
30
- argDocs = argDocs.concat(path.map(print, "body", 3));
29
+ if (node.posts.length > 0) {
30
+ argDocs = argDocs.concat(path.map(print, "posts"));
31
31
  }
32
32
  let argDoc = group(join([",", line], argDocs));
33
33
  // There are a couple of cases where we _must_ use brackets. They include:
@@ -41,37 +41,37 @@ const printAryPtn = (path, opts, print) => {
41
41
  // Consider the difference between `in key: first, second` and
42
42
  // `in key: [first, second]`.
43
43
  if (argDocs.length === 1 ||
44
- constant ||
44
+ node.constant ||
45
45
  patterns.includes(path.getParentNode().type)) {
46
46
  argDoc = ["[", argDoc, "]"];
47
47
  }
48
- if (constant) {
49
- return [path.call(print, "body", 0), argDoc];
48
+ if (node.constant) {
49
+ return [path.call(print, "constant"), argDoc];
50
50
  }
51
51
  return argDoc;
52
52
  };
53
53
  exports.printAryPtn = printAryPtn;
54
54
  const printFndPtn = (path, opts, print) => {
55
- const [constant] = path.getValue().body;
55
+ const node = path.getValue();
56
56
  const docs = [
57
57
  "[",
58
58
  group(join([",", line], [
59
- ["*", path.call(print, "body", 1)],
60
- ...path.map(print, "body", 2),
61
- ["*", path.call(print, "body", 3)]
59
+ ["*", path.call(print, "left")],
60
+ ...path.map(print, "values"),
61
+ ["*", path.call(print, "right")]
62
62
  ])),
63
63
  "]"
64
64
  ];
65
- if (constant) {
66
- return [path.call(print, "body", 0), docs];
65
+ if (node.constant) {
66
+ return [path.call(print, "constant"), docs];
67
67
  }
68
68
  return docs;
69
69
  };
70
70
  exports.printFndPtn = printFndPtn;
71
71
  const printHshPtn = (path, opts, print) => {
72
- const [constant, keyValuePairs, keyValueRest] = path.getValue().body;
72
+ const node = path.getValue();
73
73
  let args = [];
74
- if (keyValuePairs.length > 0) {
74
+ if (node.keywords.length > 0) {
75
75
  const printPair = (pairPath) => {
76
76
  const parts = [pairPath.call(print, 0)];
77
77
  if (pairPath.getValue()[1]) {
@@ -79,20 +79,20 @@ const printHshPtn = (path, opts, print) => {
79
79
  }
80
80
  return parts;
81
81
  };
82
- args = args.concat(path.map(printPair, "body", 1));
82
+ args = args.concat(path.map(printPair, "keywords"));
83
83
  }
84
- if (keyValueRest) {
85
- args.push(["**", path.call(print, "body", 2)]);
84
+ if (node.kwrest) {
85
+ args.push(["**", path.call(print, "kwrest")]);
86
86
  }
87
87
  args = group(join([",", line], args));
88
- if (constant) {
88
+ if (node.constant) {
89
89
  args = ["[", args, "]"];
90
90
  }
91
91
  else if (patterns.includes(path.getParentNode().type)) {
92
92
  args = ["{ ", args, " }"];
93
93
  }
94
- if (constant) {
95
- return [path.call(print, "body", 0), args];
94
+ if (node.constant) {
95
+ return [path.call(print, "constant"), args];
96
96
  }
97
97
  return args;
98
98
  };
@@ -101,22 +101,19 @@ const printIn = (path, opts, print) => {
101
101
  const keyword = "in ";
102
102
  const parts = [
103
103
  keyword,
104
- align(keyword.length, path.call((valuePath) => printPatternArg(valuePath, opts, print), "body", 0)),
105
- indent([hardline, path.call(print, "body", 1)])
104
+ align(keyword.length, path.call((valuePath) => printPatternArg(valuePath, opts, print), "pattern")),
105
+ indent([hardline, path.call(print, "stmts")])
106
106
  ];
107
- if (path.getValue().body[2]) {
108
- parts.push(hardline, path.call(print, "body", 2));
107
+ if (path.getValue().cons) {
108
+ parts.push(hardline, path.call(print, "cons"));
109
109
  }
110
110
  return group(parts);
111
111
  };
112
112
  exports.printIn = printIn;
113
- const printRAssign = (path, opts, print) => {
114
- const { keyword } = path.getValue();
115
- const [leftDoc, rightDoc] = path.map(print, "body");
116
- return group([
117
- leftDoc,
118
- keyword ? " in" : " =>",
119
- group(indent([line, rightDoc]))
120
- ]);
121
- };
113
+ const printRAssign = (path, opts, print) => group([
114
+ path.call(print, "value"),
115
+ " ",
116
+ path.call(print, "op"),
117
+ group(indent([line, path.call(print, "pattern")]))
118
+ ]);
122
119
  exports.printRAssign = printRAssign;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.printRegexpLiteral = void 0;
4
4
  const utils_1 = require("../../utils");
5
5
  function hasContent(node, pattern) {
6
- return node.body.some((child) => child.type === "@tstring_content" && pattern.test(child.body));
6
+ return node.parts.some((part) => part.type === "tstring_content" && pattern.test(part.value));
7
7
  }
8
8
  // If the first part of this regex is plain string content, we have a space
9
9
  // or an =, and we're contained within a command or command_call node, then we
@@ -11,10 +11,10 @@ function hasContent(node, pattern) {
11
11
  // operator, e.g. foo / bar/ or foo /=bar/
12
12
  function forwardSlashIsAmbiguous(path) {
13
13
  const node = path.getValue();
14
- const firstChildNode = node.body[0];
15
- return (firstChildNode &&
16
- firstChildNode.type === "@tstring_content" &&
17
- [" ", "="].includes(firstChildNode.body[0]) &&
14
+ const firstPart = node.parts[0];
15
+ return (firstPart &&
16
+ firstPart.type === "tstring_content" &&
17
+ [" ", "="].includes(firstPart.value[0]) &&
18
18
  (0, utils_1.hasAncestor)(path, ["command", "command_call"]));
19
19
  }
20
20
  // This function is responsible for printing out regexp_literal nodes. They can
@@ -26,7 +26,7 @@ function forwardSlashIsAmbiguous(path) {
26
26
  // itself. In that case we switch over to using %r with braces.
27
27
  const printRegexpLiteral = (path, opts, print) => {
28
28
  const node = path.getValue();
29
- const docs = path.map(print, "body");
29
+ const docs = path.map(print, "parts");
30
30
  // We should use braces if using a forward slash would be ambiguous in the
31
31
  // current context or if there's a forward slash in the content of the regexp.
32
32
  const useBraces = forwardSlashIsAmbiguous(path) || hasContent(node, /\//);
@@ -5,12 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.printRetry = exports.printRedo = exports.printRescueMod = exports.printRescueEx = exports.printRescue = exports.printEnsure = exports.printBegin = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
- const utils_1 = require("../../utils");
9
8
  const { align, group, hardline, indent, join, line } = prettier_1.default;
10
9
  const printBegin = (path, opts, print) => {
11
10
  return [
12
11
  "begin",
13
- indent([hardline, path.map(print, "body")]),
12
+ indent([hardline, path.call(print, "bodystmt")]),
14
13
  hardline,
15
14
  "end"
16
15
  ];
@@ -18,15 +17,16 @@ const printBegin = (path, opts, print) => {
18
17
  exports.printBegin = printBegin;
19
18
  const printEnsure = (path, opts, print) => {
20
19
  return [
21
- path.call(print, "body", 0),
22
- indent([hardline, path.call(print, "body", 1)])
20
+ path.call(print, "keyword"),
21
+ indent([hardline, path.call(print, "stmts")])
23
22
  ];
24
23
  };
25
24
  exports.printEnsure = printEnsure;
26
25
  const printRescue = (path, opts, print) => {
26
+ const node = path.getValue();
27
27
  const parts = ["rescue"];
28
- if (path.getValue().body[0]) {
29
- parts.push(align("rescue ".length, path.call(print, "body", 0)));
28
+ if (node.extn) {
29
+ parts.push(align("rescue ".length, path.call(print, "extn")));
30
30
  }
31
31
  else {
32
32
  // If you don't specify an error to rescue in a `begin/rescue` block, then
@@ -34,14 +34,14 @@ const printRescue = (path, opts, print) => {
34
34
  // just going to explicitly add it.
35
35
  parts.push(" StandardError");
36
36
  }
37
- const bodystmt = path.call(print, "body", 1);
38
- if (bodystmt.length > 0) {
39
- parts.push(indent([hardline, bodystmt]));
37
+ const stmtsDoc = path.call(print, "stmts");
38
+ if (stmtsDoc.length > 0) {
39
+ parts.push(indent([hardline, stmtsDoc]));
40
40
  }
41
41
  // This is the next clause on the `begin` statement, either another
42
42
  // `rescue`, and `ensure`, or an `else` clause.
43
- if (path.getValue().body[2]) {
44
- parts.push([hardline, path.call(print, "body", 2)]);
43
+ if (node.cons) {
44
+ parts.push([hardline, path.call(print, "cons")]);
45
45
  }
46
46
  return group(parts);
47
47
  };
@@ -49,37 +49,38 @@ exports.printRescue = printRescue;
49
49
  // This is a container node that we're adding into the AST that isn't present in
50
50
  // Ripper solely so that we have a nice place to attach inline comments.
51
51
  const printRescueEx = (path, opts, print) => {
52
- const [exception, variable] = path.getValue().body;
52
+ const node = path.getValue();
53
53
  const parts = [];
54
- if (exception) {
54
+ if (node.extns) {
55
55
  // If there's just one exception being rescued, then it's just going to be a
56
56
  // single doc node.
57
- let exceptionDoc = path.call(print, "body", 0);
57
+ let exceptionDoc = path.call(print, "extns");
58
58
  // If there are multiple exceptions being rescued, then we're going to have
59
59
  // multiple doc nodes returned as an array that we need to join together.
60
- if (["mrhs_add_star", "mrhs_new_from_args"].includes(exception.type)) {
60
+ if (["mrhs", "mrhs_add_star", "mrhs_new_from_args"].includes(node.extns.type)) {
61
61
  exceptionDoc = group(join([",", line], exceptionDoc));
62
62
  }
63
63
  parts.push(" ", exceptionDoc);
64
64
  }
65
- if (variable) {
66
- parts.push(" => ", path.call(print, "body", 1));
65
+ if (node.var) {
66
+ parts.push(" => ", path.call(print, "var"));
67
67
  }
68
68
  return group(parts);
69
69
  };
70
70
  exports.printRescueEx = printRescueEx;
71
71
  const printRescueMod = (path, opts, print) => {
72
- const [statementDoc, valueDoc] = path.map(print, "body");
73
72
  return [
74
73
  "begin",
75
- indent([hardline, statementDoc]),
74
+ indent([hardline, path.call(print, "stmt")]),
76
75
  hardline,
77
76
  "rescue StandardError",
78
- indent([hardline, valueDoc]),
77
+ indent([hardline, path.call(print, "value")]),
79
78
  hardline,
80
79
  "end"
81
80
  ];
82
81
  };
83
82
  exports.printRescueMod = printRescueMod;
84
- exports.printRedo = (0, utils_1.literal)("redo");
85
- exports.printRetry = (0, utils_1.literal)("retry");
83
+ const printRedo = (path) => path.getValue().value;
84
+ exports.printRedo = printRedo;
85
+ const printRetry = (path) => path.getValue().value;
86
+ exports.printRetry = printRetry;
@@ -5,12 +5,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.printReturn0 = exports.printReturn = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
- const utils_1 = require("../../utils");
9
8
  const { group, ifBreak, indent, line, join, softline } = prettier_1.default;
10
9
  // You can't skip the parentheses if you have comments or certain operators with
11
10
  // lower precedence than the return keyword.
12
- function canSkipParens(args) {
13
- const stmts = args.body[0].body[0];
11
+ function canSkipParens(paren) {
12
+ const stmts = paren.cnts;
13
+ // return(
14
+ // foo
15
+ // bar
16
+ // )
17
+ if (stmts.body.length !== 1) {
18
+ return false;
19
+ }
14
20
  // return(
15
21
  // # a
16
22
  // b
@@ -20,49 +26,67 @@ function canSkipParens(args) {
20
26
  }
21
27
  const stmt = stmts.body[0];
22
28
  // return (a or b)
23
- if (stmt.type === "binary" && ["and", "or"].includes(stmt.body[1])) {
29
+ if (stmt.type === "binary" && ["and", "or"].includes(stmt.op)) {
24
30
  return false;
25
31
  }
26
32
  // return (not a)
27
- if (stmt.type === "unary" && stmt.oper === "not") {
33
+ if (stmt.type === "not") {
28
34
  return false;
29
35
  }
30
36
  return true;
31
37
  }
32
38
  const printReturn = (path, opts, print) => {
33
- let args = path.getValue().body[0].body[0];
34
- let steps = ["body", 0, "body", 0];
35
- if (args.body.length === 1) {
36
- // If the body of the return contains parens, then just skip directly to the
37
- // content of the parens so that we can skip printing parens if we don't
38
- // want them.
39
- if (args.body[0] && args.body[0].type === "paren" && canSkipParens(args)) {
40
- args = args.body[0].body[0];
41
- steps = steps.concat("body", 0, "body", 0);
42
- }
43
- // If we're returning an array literal that isn't a special array, single
44
- // element array, or an empty array, then we want to grab the arguments so
45
- // that we can print them out as if they were normal return arguments.
46
- if (args.body[0] &&
47
- args.body[0].type === "array" &&
48
- args.body[0].body[0] &&
49
- args.body[0].body[0].body.length > 1 &&
50
- ["args", "args_add_star"].includes(args.body[0].body[0].type)) {
51
- steps = steps.concat("body", 0, "body", 0);
39
+ const node = path.getValue();
40
+ let parts = "";
41
+ let joining = false;
42
+ if (node.args.type === "args_add_block") {
43
+ const args = node.args.args;
44
+ const steps = ["args", "args"];
45
+ if (args.type === "args" && args.parts.length === 1 && args.parts[0]) {
46
+ // This is the first and only argument being passed to the return keyword.
47
+ let arg = args.parts[0];
48
+ steps.push("parts", 0);
49
+ // If the body of the return contains parens, then just skip directly to
50
+ // the content of the parens so that we can skip printing parens if we
51
+ // don't want them.
52
+ if (arg.type === "paren") {
53
+ // If we can't skip over the parentheses, then we know we can just bail
54
+ // out here and print the only argument as normal since it's a paren.
55
+ if (!canSkipParens(arg)) {
56
+ return ["return", path.call(print, "args")];
57
+ }
58
+ arg = arg.cnts.body[0];
59
+ steps.push("cnts", "body", 0);
60
+ }
61
+ // If we're returning an array literal that isn't a special array that has
62
+ // at least 2 elements, then we want to grab the arguments so that we can
63
+ // print them out as if they were normal return arguments.
64
+ if (arg.type === "array" && arg.cnts) {
65
+ const contents = arg.cnts;
66
+ if (contents.type === "args" && contents.parts.length > 1) {
67
+ // If we have just regular arguments and we have more than 1.
68
+ steps.push("cnts");
69
+ }
70
+ }
52
71
  }
72
+ // We're doing this weird dance with the steps variable because it's
73
+ // possible that you're printing an array nested under some parentheses, in
74
+ // which case we still want to descend down that far. For example,
75
+ // return([1, 2, 3]) should print as return 1, 2, 3.
76
+ parts = path.call((targetPath) => {
77
+ const target = targetPath.getValue();
78
+ joining = target.type === "args" || target.type === "args_add_block";
79
+ return print(targetPath);
80
+ }, ...steps);
53
81
  }
54
- // Now that we've established which actual node is the arguments to return,
55
- // we grab it out of the path by diving down the steps that we've set up.
56
- const parts = path.call(print, ...steps);
57
- const useBrackets = Array.isArray(parts) && parts.length > 1;
58
- // If we got the value straight out of the parens, then `parts` would only
59
- // be a singular doc as opposed to an array.
60
- const value = Array.isArray(parts) ? join([",", line], parts) : parts;
61
- // We only get here if we have comments somewhere that would prevent us from
62
- // skipping the parentheses.
63
- if (args.body.length === 1 && args.body[0].type === "paren") {
64
- return ["return", value];
82
+ // If we didn't hit any of our special cases, then just print out the
83
+ // arguments normally here.
84
+ if (parts === "") {
85
+ parts = path.call(print, "args");
86
+ joining = true;
65
87
  }
88
+ const useBrackets = Array.isArray(parts) && parts.length > 1;
89
+ const value = joining ? join([",", line], parts) : parts;
66
90
  return group([
67
91
  "return",
68
92
  ifBreak(useBrackets ? " [" : "(", " "),
@@ -72,4 +96,5 @@ const printReturn = (path, opts, print) => {
72
96
  ]);
73
97
  };
74
98
  exports.printReturn = printReturn;
75
- exports.printReturn0 = (0, utils_1.literal)("return");
99
+ const printReturn0 = (path) => path.getValue().value;
100
+ exports.printReturn0 = printReturn0;
@@ -3,40 +3,41 @@ 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.printStmts = exports.printProgram = exports.printComment = exports.printEndContent = exports.printParen = exports.printBodyStmt = void 0;
6
+ exports.printStatements = exports.printProgram = exports.printComment = exports.printEndContent = exports.printParen = exports.printBodyStmt = void 0;
7
7
  const prettier_1 = __importDefault(require("../../prettier"));
8
8
  const utils_1 = require("../../utils");
9
+ const location_1 = require("../location");
9
10
  const { breakParent, dedent, group, hardline, indent, join, line, literalline, softline, trim } = prettier_1.default;
10
11
  const printBodyStmt = (path, opts, print) => {
11
- const [stmts, rescue, elseClause, ensure] = path.getValue().body;
12
+ const node = path.getValue();
12
13
  const parts = [];
13
- if (!(0, utils_1.isEmptyStmts)(stmts)) {
14
- parts.push(path.call(print, "body", 0));
14
+ if (!(0, utils_1.isEmptyStmts)(node.stmts)) {
15
+ parts.push(path.call(print, "stmts"));
15
16
  }
16
- if (rescue) {
17
- parts.push(dedent([hardline, path.call(print, "body", 1)]));
17
+ if (node.rsc) {
18
+ parts.push(dedent([hardline, path.call(print, "rsc")]));
18
19
  }
19
- if (elseClause) {
20
+ if (node.els) {
20
21
  // Before Ruby 2.6, this piece of bodystmt was an explicit "else" node
21
22
  /* istanbul ignore next */
22
- const stmts = elseClause.type === "else"
23
- ? path.call(print, "body", 2, "body", 0)
24
- : path.call(print, "body", 2);
23
+ const stmts = node.els.type === "else"
24
+ ? path.call(print, "els", "body", 0)
25
+ : path.call(print, "els");
25
26
  parts.push([dedent([hardline, "else"]), hardline, stmts]);
26
27
  }
27
- if (ensure) {
28
- parts.push(dedent([hardline, path.call(print, "body", 3)]));
28
+ if (node.ens) {
29
+ parts.push(dedent([hardline, path.call(print, "ens")]));
29
30
  }
30
31
  return group(parts);
31
32
  };
32
33
  exports.printBodyStmt = printBodyStmt;
33
- const argNodeTypes = ["args", "args_add_star", "args_add_block"];
34
+ const argNodeTypes = ["args", "args_add_block"];
34
35
  const printParen = (path, opts, print) => {
35
- const contentNode = path.getValue().body[0];
36
+ const contentNode = path.getValue().cnts;
36
37
  if (!contentNode) {
37
38
  return [path.call(print, "lparen"), ")"];
38
39
  }
39
- let contentDoc = path.call(print, "body", 0);
40
+ let contentDoc = path.call(print, "cnts");
40
41
  // If the content is params, we're going to let it handle its own parentheses
41
42
  // so that it breaks nicely.
42
43
  if (contentNode.type === "params") {
@@ -56,19 +57,17 @@ const printParen = (path, opts, print) => {
56
57
  };
57
58
  exports.printParen = printParen;
58
59
  const printEndContent = (path) => {
59
- const { body } = path.getValue();
60
- return [trim, "__END__", literalline, body];
60
+ const node = path.getValue();
61
+ return [trim, "__END__", literalline, node.value];
61
62
  };
62
63
  exports.printEndContent = printEndContent;
63
64
  const printComment = (path, opts) => {
64
65
  return opts.printer.printComment(path, opts);
65
66
  };
66
67
  exports.printComment = printComment;
67
- const printProgram = (path, opts, print) => {
68
- return [join(hardline, path.map(print, "body")), hardline];
69
- };
68
+ const printProgram = (path, opts, print) => [path.call(print, "stmts"), hardline];
70
69
  exports.printProgram = printProgram;
71
- const printStmts = (path, opts, print) => {
70
+ const printStatements = (path, opts, print) => {
72
71
  const stmts = path.getValue().body;
73
72
  // This is a special case where we have only comments inside a statement
74
73
  // list. In this case we want to avoid doing any kind of line number
@@ -93,19 +92,19 @@ const printStmts = (path, opts, print) => {
93
92
  if (lineNo === null) {
94
93
  parts.push(printed);
95
94
  }
96
- else if (stmt.sl - lineNo > 1 ||
95
+ else if ((0, location_1.getStartLine)(stmt.loc) - lineNo > 1 ||
97
96
  [stmt.type, stmts[index - 1].type].includes("access_ctrl")) {
98
97
  parts.push(hardline, hardline, printed);
99
98
  }
100
- else if (stmt.sl !== lineNo ||
99
+ else if ((0, location_1.getStartLine)(stmt.loc) !== lineNo ||
101
100
  path.getParentNode().type !== "string_embexpr") {
102
101
  parts.push(hardline, printed);
103
102
  }
104
103
  else {
105
104
  parts.push("; ", printed);
106
105
  }
107
- lineNo = stmt.el;
106
+ lineNo = (0, location_1.getEndLine)(stmt.loc);
108
107
  });
109
108
  return parts;
110
109
  };
111
- exports.printStmts = printStmts;
110
+ exports.printStatements = printStatements;