prettier 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
data/dist/ruby/printer.js CHANGED
@@ -4,18 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const prettier_1 = __importDefault(require("../prettier"));
7
+ const utils_1 = require("../utils");
7
8
  const embed_1 = __importDefault(require("./embed"));
8
9
  const nodes_1 = __importDefault(require("./nodes"));
9
10
  const { trim } = prettier_1.default;
10
- const noComments = [
11
- "args",
12
- "args_add_block",
13
- "args_add_star",
14
- "mlhs",
15
- "mlhs_add_post",
16
- "mlhs_add_star",
17
- "mlhs_paren"
18
- ];
11
+ const noComments = ["args", "args_add_block", "mlhs", "mlhs_paren"];
19
12
  const printer = {
20
13
  // Certain nodes are used more for organizational purposed than for actually
21
14
  // displaying content, so we tell prettier that we don't want comments
@@ -25,61 +18,9 @@ const printer = {
25
18
  },
26
19
  embed: embed_1.default,
27
20
  // This function tells prettier how to recurse down our AST so that it can
28
- // find where it needs to attach the comments. The types on this are a little
29
- // abysmal, but we're going to leave it as is to get this out.
21
+ // find where it needs to attach the comments.
30
22
  getCommentChildNodes(node) {
31
- switch (node.type) {
32
- case "heredoc":
33
- return [node.beging];
34
- case "aryptn":
35
- return [node.body[0]]
36
- .concat(node.body[1])
37
- .concat(node.body[2])
38
- .concat(node.body[3]);
39
- case "hshptn": {
40
- const pairs = node.body[1];
41
- const values = pairs.reduce((left, right) => left.concat(right), []);
42
- return [node.body[0]].concat(values).concat(node.body[2]);
43
- }
44
- case "params": {
45
- const [reqs, optls, rest, post, kwargs, kwargRest, block] = node.body;
46
- let parts = reqs || [];
47
- (optls || []).forEach((optl) => {
48
- parts = parts.concat(optl);
49
- });
50
- if (rest) {
51
- parts.push(rest);
52
- }
53
- parts = parts.concat(post || []);
54
- (kwargs || []).forEach((kwarg) => {
55
- if (kwarg[1]) {
56
- parts = parts.concat(kwarg);
57
- }
58
- else {
59
- parts.push(kwarg[0]);
60
- }
61
- });
62
- if (kwargRest && kwargRest !== "nil") {
63
- parts.push(kwargRest);
64
- }
65
- if (block) {
66
- parts.push(block);
67
- }
68
- return parts;
69
- }
70
- case "brace_block":
71
- return [node.body[0], node.body[1], node.beging];
72
- case "do_block":
73
- return [node.body[0], node.body[1], node.beging];
74
- case "paren":
75
- return [node.lparen, node.body[0]];
76
- default: {
77
- if (Array.isArray(node.body)) {
78
- return node.body.filter((child) => child && typeof child === "object");
79
- }
80
- return [];
81
- }
82
- }
23
+ return (0, utils_1.getChildNodes)(node);
83
24
  },
84
25
  // This is an escape-hatch to ignore nodes in the tree. If you have a comment
85
26
  // that includes this pattern, then the entire node will be ignored and just
@@ -94,7 +35,7 @@ const printer = {
94
35
  // *feels* like a block comment equivalent in JavaScript so I'm going to leave
95
36
  // it in place for now.
96
37
  isBlockComment(comment) {
97
- return comment.type === "@embdoc";
38
+ return comment.type === "embdoc";
98
39
  },
99
40
  // This function handles adding the format pragma to a source string. This is
100
41
  // an optional workflow for incremental adoption.
@@ -107,20 +48,17 @@ const printer = {
107
48
  print(path, opts, print) {
108
49
  const node = path.getValue();
109
50
  const printer = nodes_1.default[node.type];
110
- if (printer) {
111
- return printer(path, opts, print);
112
- }
113
- if (node.type[0] === "@") {
114
- return node.body;
51
+ if (!printer) {
52
+ throw new Error(`Unsupported node type: ${node.type}`);
115
53
  }
116
- throw new Error(`Unsupported node encountered: ${node.type}`);
54
+ return printer(path, opts, print);
117
55
  },
118
56
  // This is the generic print function for any comment in the AST. It handles
119
57
  // both regular comments that begin with a # and embdoc comments, which are
120
58
  // surrounded by =begin..=end.
121
59
  printComment(path) {
122
60
  const comment = path.getValue();
123
- if (comment.type === "@comment") {
61
+ if (comment.type === "comment") {
124
62
  return `#${comment.value}`;
125
63
  }
126
64
  return [trim, comment.value];
data/dist/ruby/toProc.js CHANGED
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- function isCall(node) {
3
+ function isPeriod(node) {
4
4
  // Older versions of Ruby didn't have a @period ripper event, so we need to
5
5
  // explicitly cast to any here.
6
6
  if (node === "::" || node === ".") {
7
7
  return true;
8
8
  }
9
- return node.type === "@period";
9
+ return node.type === "period";
10
10
  }
11
11
  // If you have a simple block that only calls a method on the single required
12
12
  // parameter that is passed to it, then you can replace that block with the
@@ -20,74 +20,72 @@ function isCall(node) {
20
20
  //
21
21
  // This works with `do` blocks as well.
22
22
  function toProc(path, node) {
23
- const [variables, blockContents] = node.body;
24
23
  // Ensure that there are variables being passed to this block.
25
- const params = variables && variables.body[0];
24
+ const params = node.block_var && node.block_var.params;
26
25
  if (!params) {
27
26
  return null;
28
27
  }
29
28
  // Ensure there is one and only one parameter, and that it is required.
30
- const reqParams = params.body[0];
31
- const otherParams = params.body.slice(1);
32
- if (!Array.isArray(reqParams) ||
33
- reqParams.length !== 1 ||
34
- otherParams.some(Boolean)) {
29
+ if (params.reqs.length !== 1 ||
30
+ params.opts.length !== 0 ||
31
+ params.rest ||
32
+ params.posts.length !== 0 ||
33
+ params.keywords.length !== 0 ||
34
+ params.kwrest ||
35
+ params.block) {
35
36
  return null;
36
37
  }
38
+ // Get the list of statements from the block
37
39
  let statements;
38
- if (blockContents.type === "bodystmt") {
39
- // We’re in a `do` block
40
- const blockStatements = blockContents.body[0];
41
- const rescueElseEnsure = blockContents.body.slice(1);
42
- // You can’t use the to_proc shortcut if you’re rescuing
43
- if (rescueElseEnsure.some(Boolean)) {
40
+ if (node.type === "do_block") {
41
+ // If you have any other clauses on the bodystmt, then we can't transform.
42
+ if (node.bodystmt.rsc || node.bodystmt.els || node.bodystmt.ens) {
44
43
  return null;
45
44
  }
46
- statements = blockStatements;
45
+ statements = node.bodystmt.stmts.body;
47
46
  }
48
47
  else {
49
- // We’re in a brace block
50
- statements = blockContents;
48
+ statements = node.stmts.body;
51
49
  }
52
50
  // Ensure the block contains only one statement
53
- if (statements.body.length !== 1) {
51
+ if (statements.length !== 1) {
54
52
  return null;
55
53
  }
56
54
  // Ensure that statement is a call and that it has no comments attached
57
- const [statement] = statements.body;
58
- if (statement.type !== "call" || statement.comments) {
55
+ const [call] = statements;
56
+ if (call.type !== "call" || call.comments) {
59
57
  return null;
60
58
  }
61
59
  // Ensure the call is a method of the block argument
62
- const [varRef, call, method] = statement.body;
63
- if (varRef.type !== "var_ref" ||
64
- varRef.body[0].body !== reqParams[0].body ||
65
- !isCall(call) ||
66
- method === "call" ||
67
- method.type !== "@ident") {
60
+ if (call.receiver.type !== "var_ref" ||
61
+ call.receiver.value.value !== params.reqs[0].value ||
62
+ !isPeriod(call.op) ||
63
+ call.message === "call" ||
64
+ call.message.type !== "ident") {
68
65
  return null;
69
66
  }
70
67
  // Ensure that we're not inside of a hash that is being passed to a key that
71
68
  // corresponds to `:if` or `:unless` to avoid problems with callbacks with
72
69
  // Rails. For more context, see:
73
70
  // https://github.com/prettier/plugin-ruby/issues/449
74
- let assocNode = null;
71
+ let parentNode = null;
75
72
  if (path.getValue().type === "method_add_block") {
76
- assocNode = path.getParentNode();
73
+ parentNode = path.getParentNode();
77
74
  }
78
75
  else {
79
- assocNode = path.getParentNode(2);
76
+ parentNode = path.getParentNode(2);
80
77
  }
81
- if (assocNode && assocNode.type === "assoc_new") {
82
- const [key] = assocNode.body;
83
- if (key.type === "@label" && ["if:", "unless:"].includes(key.body)) {
78
+ if (parentNode && parentNode.type === "assoc") {
79
+ const assocNode = parentNode;
80
+ const key = assocNode.key;
81
+ if (key.type === "label" && ["if:", "unless:"].includes(key.value)) {
84
82
  return null;
85
83
  }
86
84
  if (key.type === "symbol_literal" &&
87
- ["if", "unless"].includes(key.body[0].body)) {
85
+ ["if", "unless"].includes(key.value.value)) {
88
86
  return null;
89
87
  }
90
88
  }
91
- return `&:${method.body}`;
89
+ return `&:${call.message.value}`;
92
90
  }
93
91
  exports.default = toProc;
data/dist/types.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -1,5 +1,9 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const getChildNodes_1 = __importDefault(require("./getChildNodes"));
3
7
  // If the node is a type of assignment or if the node is a paren and nested
4
8
  // inside that paren is a node that is a type of assignment.
5
9
  function containsAssignment(node) {
@@ -9,7 +13,6 @@ function containsAssignment(node) {
9
13
  if (["assign", "massign", "opassign"].includes(node.type)) {
10
14
  return true;
11
15
  }
12
- const anyNode = node;
13
- return Array.isArray(anyNode.body) && anyNode.body.some(containsAssignment);
16
+ return (0, getChildNodes_1.default)(node).some(containsAssignment);
14
17
  }
15
18
  exports.default = containsAssignment;
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function throwBadNode(node) {
4
+ throw new Error(`Unknown node ${node.type}`);
5
+ }
6
+ function getChildNodes(node) {
7
+ switch (node.type) {
8
+ case "CHAR":
9
+ case "__end__":
10
+ case "backref":
11
+ case "backtick":
12
+ case "const":
13
+ case "cvar":
14
+ case "float":
15
+ case "gvar":
16
+ case "heredoc_beg":
17
+ case "ident":
18
+ case "imaginary":
19
+ case "int":
20
+ case "ivar":
21
+ case "kw":
22
+ case "label":
23
+ case "lbrace":
24
+ case "lparen":
25
+ case "op":
26
+ case "period":
27
+ case "rational":
28
+ case "tstring_content":
29
+ return [];
30
+ case "BEGIN":
31
+ return [node.lbrace, node.stmts];
32
+ case "END":
33
+ return [node.lbrace, node.stmts];
34
+ case "access_ctrl":
35
+ return [node.value];
36
+ case "alias":
37
+ return [node.left, node.right];
38
+ case "aref":
39
+ return [node.collection, node.index];
40
+ case "aref_field":
41
+ return [node.collection, node.index];
42
+ case "arg_paren":
43
+ return [node.args];
44
+ case "args":
45
+ return node.parts;
46
+ case "args_add_block":
47
+ return [node.args, node.block];
48
+ case "args_forward":
49
+ return [];
50
+ case "arg_star":
51
+ return [node.value];
52
+ case "array":
53
+ return [node.cnts];
54
+ case "aryptn":
55
+ return [node.constant, ...node.reqs, node.rest, ...node.posts];
56
+ case "assign":
57
+ return [node.target, node.value];
58
+ case "assoc":
59
+ return [node.key, node.value];
60
+ case "assoc_splat":
61
+ return [node.value];
62
+ case "assoclist_from_args":
63
+ return node.assocs;
64
+ case "bare_assoc_hash":
65
+ return node.assocs;
66
+ case "begin":
67
+ return [node.bodystmt];
68
+ case "binary":
69
+ return [node.left, node.right];
70
+ case "block_var":
71
+ return [node.params, ...node.locals];
72
+ case "blockarg":
73
+ return [node.name];
74
+ case "bodystmt":
75
+ return [node.stmts, node.rsc, node.els, node.ens];
76
+ case "brace_block":
77
+ return [node.lbrace, node.block_var, node.stmts];
78
+ case "break":
79
+ return [node.args];
80
+ case "call": {
81
+ const childNodes = [node.receiver];
82
+ if (node.op !== "::") {
83
+ childNodes.push(node.op);
84
+ }
85
+ if (node.message !== "call") {
86
+ childNodes.push(node.message);
87
+ }
88
+ return childNodes;
89
+ }
90
+ case "case":
91
+ return [node.value, node.cons];
92
+ case "class":
93
+ return [node.constant, node.superclass, node.bodystmt];
94
+ case "command":
95
+ return [node.message, node.args];
96
+ case "command_call":
97
+ return [node.receiver, node.message, node.args];
98
+ case "const_path_field":
99
+ return [node.parent, node.constant];
100
+ case "const_path_ref":
101
+ return [node.parent, node.constant];
102
+ case "const_ref":
103
+ return [node.constant];
104
+ case "def":
105
+ return [node.name, node.params, node.bodystmt];
106
+ case "def_endless":
107
+ return [node.name, node.paren, node.stmt];
108
+ case "defined":
109
+ return [node.value];
110
+ case "defs":
111
+ return [node.target, node.op, node.name, node.params, node.bodystmt];
112
+ case "do_block":
113
+ return [node.keyword, node.block_var, node.bodystmt];
114
+ case "dot2":
115
+ return [node.left, node.right];
116
+ case "dot3":
117
+ return [node.left, node.right];
118
+ case "dyna_symbol":
119
+ return node.parts;
120
+ case "else":
121
+ return [node.stmts];
122
+ case "elsif":
123
+ return [node.pred, node.stmts, node.cons];
124
+ case "ensure":
125
+ return [node.keyword, node.stmts];
126
+ case "excessed_comma":
127
+ return [];
128
+ case "fcall":
129
+ return [node.value];
130
+ case "field": {
131
+ const childNodes = [node.parent];
132
+ if (node.op !== "::") {
133
+ childNodes.push(node.op);
134
+ }
135
+ childNodes.push(node.name);
136
+ return childNodes;
137
+ }
138
+ case "fndptn":
139
+ return [node.constant, node.left, ...node.values, node.right];
140
+ case "for":
141
+ return [node.index, node.collection, node.stmts];
142
+ case "hash":
143
+ return [node.cnts];
144
+ case "heredoc":
145
+ return [node.beging, ...node.parts];
146
+ case "hshptn": {
147
+ const childNodes = [node.constant];
148
+ node.keywords.forEach(([key, value]) => {
149
+ childNodes.push(key, value);
150
+ });
151
+ childNodes.push(node.kwrest);
152
+ return childNodes;
153
+ }
154
+ case "if":
155
+ return [node.pred, node.stmts, node.cons];
156
+ case "ifop":
157
+ return [node.pred, node.tthy, node.flsy];
158
+ case "if_mod":
159
+ return [node.stmt, node.pred];
160
+ case "in":
161
+ return [node.pattern, node.stmts, node.cons];
162
+ case "kwrest_param":
163
+ return [node.name];
164
+ case "lambda":
165
+ return [node.params, node.stmts];
166
+ case "massign":
167
+ return [node.target, node.value];
168
+ case "method_add_arg":
169
+ return [node.call, node.args];
170
+ case "method_add_block":
171
+ return [node.call, node.block];
172
+ case "mlhs":
173
+ return node.parts;
174
+ case "mlhs_paren":
175
+ return [node.cnts];
176
+ case "module":
177
+ return [node.constant, node.bodystmt];
178
+ case "mrhs":
179
+ return node.parts;
180
+ case "mrhs_add_star":
181
+ return [node.mrhs, node.star];
182
+ case "mrhs_new_from_args":
183
+ return [node.args];
184
+ case "next":
185
+ return [node.args];
186
+ case "not":
187
+ return [node.value];
188
+ case "opassign":
189
+ return [node.target, node.op, node.value];
190
+ case "params": {
191
+ let childNodes = [...node.reqs];
192
+ node.opts.forEach(([key, value]) => {
193
+ childNodes.push(key, value);
194
+ });
195
+ childNodes.push(node.rest);
196
+ childNodes = childNodes.concat(node.posts);
197
+ node.keywords.forEach(([key, value]) => {
198
+ childNodes.push(key);
199
+ if (value) {
200
+ childNodes.push(value);
201
+ }
202
+ });
203
+ if (node.kwrest && node.kwrest !== "nil") {
204
+ childNodes.push(node.kwrest);
205
+ }
206
+ if (node.block) {
207
+ childNodes.push(node.block);
208
+ }
209
+ return childNodes;
210
+ }
211
+ case "paren":
212
+ return [node.lparen, node.cnts];
213
+ case "program":
214
+ return [node.stmts];
215
+ case "qsymbols":
216
+ return [];
217
+ case "qwords":
218
+ return [];
219
+ case "rassign":
220
+ return [node.value, node.op, node.pattern];
221
+ case "redo":
222
+ return [];
223
+ case "regexp_literal":
224
+ return node.parts;
225
+ case "rescue":
226
+ return [node.extn, node.stmts, node.cons];
227
+ case "rescue_ex":
228
+ return [node.extns, node.var];
229
+ case "rescue_mod":
230
+ return [node.stmt, node.value];
231
+ case "rest_param":
232
+ return [node.name];
233
+ case "retry":
234
+ return [];
235
+ case "return":
236
+ return [node.args];
237
+ case "return0":
238
+ return [];
239
+ case "sclass":
240
+ return [node.target, node.bodystmt];
241
+ case "statements":
242
+ return node.body;
243
+ case "string_concat":
244
+ return [node.left, node.right];
245
+ case "string_dvar":
246
+ return [node.var];
247
+ case "string_embexpr":
248
+ return [node.stmts];
249
+ case "string_literal":
250
+ return node.parts;
251
+ case "super":
252
+ return [node.args];
253
+ case "symbol_literal":
254
+ return [node.value];
255
+ case "symbols":
256
+ return [];
257
+ case "top_const_field":
258
+ return [node.constant];
259
+ case "top_const_ref":
260
+ return [node.constant];
261
+ case "unary":
262
+ return [node.value];
263
+ case "undef":
264
+ return node.syms;
265
+ case "unless":
266
+ return [node.pred, node.stmts, node.cons];
267
+ case "unless_mod":
268
+ return [node.stmt, node.pred];
269
+ case "until":
270
+ return [node.pred, node.stmts];
271
+ case "until_mod":
272
+ return [node.stmt, node.pred];
273
+ case "var_alias":
274
+ return [node.left, node.right];
275
+ case "var_field":
276
+ return [node.value];
277
+ case "var_ref":
278
+ return [node.value];
279
+ case "vcall":
280
+ return [node.value];
281
+ case "void_stmt":
282
+ return [];
283
+ case "when":
284
+ return [node.args, node.stmts, node.cons];
285
+ case "while":
286
+ return [node.pred, node.stmts];
287
+ case "while_mod":
288
+ return [node.stmt, node.pred];
289
+ case "word":
290
+ return node.parts;
291
+ case "words":
292
+ return [];
293
+ case "xstring_literal":
294
+ return node.parts;
295
+ case "yield":
296
+ return [node.args];
297
+ case "yield0":
298
+ return [];
299
+ case "zsuper":
300
+ return [];
301
+ default:
302
+ throwBadNode(node);
303
+ }
304
+ }
305
+ exports.default = getChildNodes;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const needsParens = [
4
4
  "args",
5
5
  "assign",
6
- "assoc_new",
6
+ "assoc",
7
7
  "binary",
8
8
  "call",
9
9
  "massign",
@@ -5,6 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const isEmptyStmts_1 = __importDefault(require("./isEmptyStmts"));
7
7
  function isEmptyBodyStmt(node) {
8
- return (0, isEmptyStmts_1.default)(node.body[0]) && !node.body.slice(1).some(Boolean);
8
+ return (0, isEmptyStmts_1.default)(node.stmts) && !node.rsc && !node.ens && !node.els;
9
9
  }
10
10
  exports.default = isEmptyBodyStmt;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function isEmptyParams(node) {
4
+ return (node.reqs.length === 0 &&
5
+ node.opts.length === 0 &&
6
+ !node.rest &&
7
+ node.posts.length === 0 &&
8
+ node.keywords.length === 0 &&
9
+ !node.kwrest &&
10
+ !node.block);
11
+ }
12
+ exports.default = isEmptyParams;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  function isEmptyStmts(node) {
4
4
  return (node &&
5
- node.type === "stmts" &&
5
+ node.type === "statements" &&
6
6
  node.body.length === 1 &&
7
7
  node.body[0].type === "void_stmt" &&
8
8
  !node.body[0].comments);
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const makeCall = (path, opts, print) => {
4
- const operation = path.getValue().body[1];
4
+ const node = path.getValue();
5
+ const operator = node.op;
5
6
  // Ignoring the next block for coverage information because it's only relevant
6
7
  // in Ruby 2.5 and below.
7
8
  /* istanbul ignore next */
8
- if ([".", "&."].includes(operation)) {
9
- return operation;
9
+ if ([".", "&."].includes(operator)) {
10
+ return operator;
10
11
  }
11
- return operation === "::" ? "." : path.call(print, "body", 1);
12
+ return operator === "::" ? "." : path.call(print, "op");
12
13
  };
13
14
  exports.default = makeCall;
@@ -4,10 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const prettier_1 = __importDefault(require("../prettier"));
7
+ const location_1 = require("../ruby/location");
7
8
  const { group, hardline, indent, join, line } = prettier_1.default;
8
9
  function containedWithin(node) {
9
10
  return function containedWithinNode(comment) {
10
- return comment.sc >= node.sc && comment.ec <= node.ec;
11
+ return ((0, location_1.getStartChar)(comment.loc) >= (0, location_1.getStartChar)(node.loc) &&
12
+ (0, location_1.getEndChar)(comment.loc) <= (0, location_1.getEndChar)(node.loc));
11
13
  };
12
14
  }
13
15
  // Empty collections are array or hash literals that do not contain any
@@ -6,10 +6,14 @@ const skippable = [
6
6
  "hash",
7
7
  "heredoc",
8
8
  "lambda",
9
- "regexp_literal"
9
+ "qsymbols",
10
+ "qwords",
11
+ "regexp_literal",
12
+ "symbols",
13
+ "words"
10
14
  ];
11
15
  function skipAssignIndent(node) {
12
16
  return (skippable.includes(node.type) ||
13
- (node.type === "call" && skipAssignIndent(node.body[0])));
17
+ (node.type === "call" && skipAssignIndent(node.receiver)));
14
18
  }
15
19
  exports.default = skipAssignIndent;