prettier 2.1.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -6
  3. data/README.md +17 -16
  4. data/exe/rbprettier +2 -2
  5. data/lib/prettier/rake/task.rb +5 -5
  6. data/lib/prettier.rb +11 -11
  7. data/package.json +11 -25
  8. data/rubocop.yml +32 -12
  9. data/{dist/parser → src}/getInfo.js +0 -1
  10. data/{dist/parser → src}/netcat.js +0 -1
  11. data/src/parseSync.js +216 -0
  12. data/src/plugin.js +170 -0
  13. data/{dist/parser → src}/server.rb +50 -31
  14. metadata +94 -78
  15. data/bin/console +0 -7
  16. data/dist/haml/embed.js +0 -53
  17. data/dist/haml/parser.js +0 -31
  18. data/dist/haml/parser.rb +0 -149
  19. data/dist/haml/printer.js +0 -336
  20. data/dist/parser/parseSync.js +0 -179
  21. data/dist/plugin.js +0 -143
  22. data/dist/prettier.js +0 -15
  23. data/dist/rbs/parser.js +0 -34
  24. data/dist/rbs/parser.rb +0 -155
  25. data/dist/rbs/printer.js +0 -525
  26. data/dist/ruby/embed.js +0 -115
  27. data/dist/ruby/location.js +0 -19
  28. data/dist/ruby/nodes/alias.js +0 -60
  29. data/dist/ruby/nodes/aref.js +0 -51
  30. data/dist/ruby/nodes/args.js +0 -138
  31. data/dist/ruby/nodes/arrays.js +0 -122
  32. data/dist/ruby/nodes/assign.js +0 -37
  33. data/dist/ruby/nodes/blocks.js +0 -90
  34. data/dist/ruby/nodes/calls.js +0 -263
  35. data/dist/ruby/nodes/case.js +0 -50
  36. data/dist/ruby/nodes/class.js +0 -54
  37. data/dist/ruby/nodes/commands.js +0 -138
  38. data/dist/ruby/nodes/conditionals.js +0 -246
  39. data/dist/ruby/nodes/constants.js +0 -35
  40. data/dist/ruby/nodes/flow.js +0 -59
  41. data/dist/ruby/nodes/hashes.js +0 -126
  42. data/dist/ruby/nodes/heredocs.js +0 -30
  43. data/dist/ruby/nodes/hooks.js +0 -35
  44. data/dist/ruby/nodes/ints.js +0 -27
  45. data/dist/ruby/nodes/lambdas.js +0 -70
  46. data/dist/ruby/nodes/loops.js +0 -75
  47. data/dist/ruby/nodes/massign.js +0 -60
  48. data/dist/ruby/nodes/methods.js +0 -50
  49. data/dist/ruby/nodes/operators.js +0 -68
  50. data/dist/ruby/nodes/params.js +0 -95
  51. data/dist/ruby/nodes/patterns.js +0 -119
  52. data/dist/ruby/nodes/regexp.js +0 -45
  53. data/dist/ruby/nodes/rescue.js +0 -86
  54. data/dist/ruby/nodes/return.js +0 -100
  55. data/dist/ruby/nodes/statements.js +0 -110
  56. data/dist/ruby/nodes/strings.js +0 -220
  57. data/dist/ruby/nodes/super.js +0 -26
  58. data/dist/ruby/nodes/undef.js +0 -31
  59. data/dist/ruby/nodes.js +0 -177
  60. data/dist/ruby/parser.js +0 -35
  61. data/dist/ruby/parser.rb +0 -9134
  62. data/dist/ruby/printer.js +0 -67
  63. data/dist/ruby/toProc.js +0 -91
  64. data/dist/types/haml.js +0 -4
  65. data/dist/types/plugin.js +0 -3
  66. data/dist/types/rbs.js +0 -4
  67. data/dist/types/ruby.js +0 -4
  68. data/dist/types/utils.js +0 -2
  69. data/dist/types.js +0 -34
  70. data/dist/utils/containsAssignment.js +0 -18
  71. data/dist/utils/getChildNodes.js +0 -305
  72. data/dist/utils/getTrailingComma.js +0 -6
  73. data/dist/utils/hasAncestor.js +0 -15
  74. data/dist/utils/inlineEnsureParens.js +0 -49
  75. data/dist/utils/isEmptyBodyStmt.js +0 -10
  76. data/dist/utils/isEmptyParams.js +0 -12
  77. data/dist/utils/isEmptyStmts.js +0 -10
  78. data/dist/utils/literal.js +0 -8
  79. data/dist/utils/literallineWithoutBreakParent.js +0 -8
  80. data/dist/utils/makeCall.js +0 -14
  81. data/dist/utils/noIndent.js +0 -11
  82. data/dist/utils/printEmptyCollection.js +0 -46
  83. data/dist/utils/skipAssignIndent.js +0 -19
  84. data/dist/utils.js +0 -32
@@ -1,263 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printCallContainer = exports.printMethodAddBlock = exports.printMethodAddArg = exports.printCall = void 0;
7
- const prettier_1 = __importDefault(require("../../prettier"));
8
- const utils_1 = require("../../utils");
9
- const toProc_1 = __importDefault(require("../toProc"));
10
- const { group, hardline, ifBreak, indent, join, softline } = prettier_1.default;
11
- const chained = ["call", "method_add_arg", "method_add_block"];
12
- function hasLeadingComments(node) {
13
- var _a;
14
- return (_a = node.comments) === null || _a === void 0 ? void 0 : _a.some(({ leading }) => leading);
15
- }
16
- const printCall = (path, opts, print) => {
17
- const node = path.getValue();
18
- const receiverDoc = path.call(print, "receiver");
19
- const operatorDoc = (0, utils_1.makeCall)(path, opts, print);
20
- // You can call lambdas with a special syntax that looks like func.(*args).
21
- // In this case, "call" is returned for the 3rd child node. We don't alter
22
- // call syntax so if `call` is implicit, we don't print it out.
23
- const messageDoc = node.message === "call" ? "" : path.call(print, "message");
24
- // Create some arrays that are going to represent each side of our call.
25
- let leftSideDoc = [receiverDoc];
26
- let rightSideDoc = [operatorDoc, messageDoc];
27
- // If there are leading comments on the right side of the call, then it means
28
- // we have a structure where there's a receiver and an operator together, then
29
- // a comment, then the message, as in:
30
- //
31
- // foo.
32
- // # comment
33
- // baz
34
- //
35
- // In the case we need to group the receiver and the operator together or
36
- // we'll end up with a syntax error.
37
- const operatorIsTrailing = node.message !== "call" && hasLeadingComments(node.message);
38
- if (operatorIsTrailing) {
39
- leftSideDoc = [receiverDoc, operatorDoc];
40
- rightSideDoc = [messageDoc];
41
- }
42
- // For certain left sides of the call nodes, we want to attach directly to
43
- // the } or end.
44
- if (utils_1.noIndent.includes(node.receiver.type)) {
45
- return [leftSideDoc, rightSideDoc];
46
- }
47
- if (node.receiver.type === "call" &&
48
- node.receiver.message !== "call" &&
49
- node.receiver.message.value === "where" &&
50
- messageDoc === "not") {
51
- // This is very specialized behavior wherein we group .where.not calls
52
- // together because it looks better. For more information, see
53
- // https://github.com/prettier/plugin-ruby/issues/862.
54
- }
55
- else {
56
- // Otherwise, we're going to put a line node into the right side doc.
57
- rightSideDoc.unshift(node.receiver.comments ? hardline : softline);
58
- }
59
- // Get a reference to the parent node so we can check if we're inside a chain
60
- const parentNode = path.getParentNode();
61
- // If our parent node is a chained node then we're not going to group the
62
- // right side of the expression, as we want to have a nice multi-line layout.
63
- if (chained.includes(parentNode.type) && !node.comments) {
64
- parentNode.chain = (node.chain || 0) + 1;
65
- parentNode.callChain = (node.callChain || 0) + 1;
66
- parentNode.firstReceiverType = node.firstReceiverType || node.receiver.type;
67
- // Here we're going to determine what doc nodes to send up to the parent
68
- // node to represent when we're in the multi-line form.
69
- let breakDocLHS;
70
- if (node.breakDoc && operatorIsTrailing) {
71
- // Here we already have a child node that has passed up its
72
- // representation. In this case node.breakDoc represents the receiver
73
- // without any lines inserted. With regard to this node, it means it's
74
- // everything up until the operator. So we're just going to append the
75
- // operator.
76
- breakDocLHS = node.breakDoc.concat(operatorDoc);
77
- }
78
- else if (node.breakDoc) {
79
- // Here we don't need a trailing operator, so we're just going to use the
80
- // existing node.breakDoc. The operator will be a part of the rightSideDoc
81
- // variable.
82
- breakDocLHS = node.breakDoc;
83
- }
84
- else {
85
- // Here we're at the bottom of the chain, so there's no representation yet
86
- // for the receiver. So we're just going to pass up the left side.
87
- breakDocLHS = leftSideDoc;
88
- }
89
- parentNode.breakDoc = breakDocLHS.concat(rightSideDoc);
90
- }
91
- // If we're at the top of a chain, then we're going to print out a nice
92
- // multi-line layout if this doesn't break into multiple lines.
93
- if (!chained.includes(parentNode.type) &&
94
- (node.chain || 0) >= 3 &&
95
- node.breakDoc) {
96
- return ifBreak(group(indent(node.breakDoc.concat(rightSideDoc))), [
97
- leftSideDoc,
98
- group(rightSideDoc)
99
- ]);
100
- }
101
- return group([leftSideDoc, group(indent(rightSideDoc))]);
102
- };
103
- exports.printCall = printCall;
104
- const printMethodAddArg = (path, opts, print) => {
105
- const node = path.getValue();
106
- const methodDoc = path.call(print, "call");
107
- const argsDoc = path.call(print, "args");
108
- // You can end up here if you have a method with a ? ending, presumably
109
- // because the parser knows that it cannot be a local variable. You can also
110
- // end up here if you are explicitly using an empty set of parentheses.
111
- if (argsDoc.length === 0) {
112
- // If you're using an explicit set of parentheses on something that looks
113
- // like a constant, then we need to match that in order to maintain valid
114
- // Ruby. For example, you could do something like Foo(), on which we would
115
- // need to keep the parentheses to make it look like a method call.
116
- if (node.call.type === "fcall" && node.call.value.type === "const") {
117
- return [methodDoc, "()"];
118
- }
119
- // If you're using an explicit set parentheses with the special call syntax,
120
- // then we need to explicitly print out an extra set of parentheses. For
121
- // example, if you call something like Foo.new.() (implicitly calling the
122
- // #call method on a new instance of the Foo class), then we have to print
123
- // out those parentheses, otherwise we'll end up with Foo.new.
124
- if (node.call.type === "call" && node.call.message === "call") {
125
- return [methodDoc, "()"];
126
- }
127
- return methodDoc;
128
- }
129
- // This case will ONLY be hit if we can successfully turn the block into a
130
- // to_proc call. In that case, we just explicitly add the parens around it.
131
- if (node.args.type === "args" && argsDoc.length > 0) {
132
- return [methodDoc, "(", ...argsDoc, ")"];
133
- }
134
- // Get a reference to the parent node so we can check if we're inside a chain
135
- const parentNode = path.getParentNode();
136
- // If our parent node is a chained node then we're not going to group the
137
- // right side of the expression, as we want to have a nice multi-line layout.
138
- if (chained.includes(parentNode.type) && !node.comments) {
139
- parentNode.chain = (node.chain || 0) + 1;
140
- parentNode.breakDoc = (node.breakDoc || [methodDoc]).concat(argsDoc);
141
- parentNode.firstReceiverType = node.firstReceiverType;
142
- }
143
- // This is the threshold at which we will start to try to make a nicely
144
- // indented call chain. For the most part, it's always 3.
145
- let threshold = 3;
146
- // Here, we have very specialized behavior where if we're within a sig block,
147
- // then we're going to assume we're creating a Sorbet type signature. In that
148
- // case, we really want the threshold to be lowered to 2 so that we create
149
- // method chains off of any two method calls within the block. For more
150
- // details, see
151
- // https://github.com/prettier/plugin-ruby/issues/863.
152
- let sigBlock = path.getParentNode(2);
153
- if (sigBlock) {
154
- // If we're at a do_block, then we want to go one more level up. This is
155
- // because do_blocks have bodystmt nodes instead of just stmt nodes.
156
- if (sigBlock.type === "do_block") {
157
- sigBlock = path.getParentNode(3);
158
- }
159
- if (sigBlock.type === "method_add_block") {
160
- // Pulling this out into a separate variable so we can get back some of
161
- // our type safety.
162
- const sigBlockNode = sigBlock;
163
- if (sigBlockNode.block &&
164
- sigBlockNode.call.type === "method_add_arg" &&
165
- sigBlockNode.call.call.type === "fcall" &&
166
- sigBlockNode.call.call.value.value === "sig") {
167
- threshold = 2;
168
- }
169
- }
170
- }
171
- // If we're at the top of a chain, then we're going to print out a nice
172
- // multi-line layout if this doesn't break into multiple lines.
173
- if (!chained.includes(parentNode.type) &&
174
- (node.chain || 0) >= threshold &&
175
- node.breakDoc) {
176
- // This is pretty specialized behavior. Basically if we're at the top of a
177
- // chain but we've only had method calls without arguments and now we have
178
- // arguments, then we're effectively trying to call a method with arguments
179
- // that is nested under a bunch of stuff. So we group together to first part
180
- // to make it so just the arguments break. This looks like, for example:
181
- //
182
- // config.action_dispatch.rescue_responses.merge!(
183
- // 'ActiveRecord::ConnectionTimeoutError' => :service_unavailable,
184
- // 'ActiveRecord::QueryCanceled' => :service_unavailable
185
- // )
186
- //
187
- if (node.callChain === node.chain) {
188
- return [group(indent(node.breakDoc)), group(argsDoc)];
189
- }
190
- return ifBreak(group(indent(node.breakDoc.concat(argsDoc))), [
191
- methodDoc,
192
- argsDoc
193
- ]);
194
- }
195
- // If there are already parentheses, then we can just use the doc that's
196
- // already printed.
197
- if (node.args.type == "arg_paren") {
198
- return group([methodDoc, argsDoc]);
199
- }
200
- return [methodDoc, " ", join(", ", argsDoc), " "];
201
- };
202
- exports.printMethodAddArg = printMethodAddArg;
203
- const printMethodAddBlock = (path, opts, print) => {
204
- const node = path.getValue();
205
- const callDoc = path.call(print, "call");
206
- const blockDoc = path.call(print, "block");
207
- // Don't bother trying to do any kind of fancy toProc transform if the option
208
- // is disabled.
209
- if (opts.rubyToProc) {
210
- const proc = (0, toProc_1.default)(path, node.block);
211
- if (proc && node.call.type === "call") {
212
- return group([
213
- path.call(print, "call"),
214
- "(",
215
- indent([softline, proc]),
216
- [softline, ")"]
217
- ]);
218
- }
219
- if (proc) {
220
- return path.call(print, "call");
221
- }
222
- }
223
- // Get a reference to the parent node so we can check if we're inside a chain
224
- const parentNode = path.getParentNode();
225
- // If our parent node is a chained node then we're not going to group the
226
- // right side of the expression, as we want to have a nice multi-line layout.
227
- if (chained.includes(parentNode.type)) {
228
- parentNode.chain = (node.chain || 0) + 1;
229
- parentNode.breakDoc = (node.breakDoc || [callDoc]).concat(blockDoc);
230
- parentNode.firstReceiverType = node.firstReceiverType;
231
- }
232
- // If we're at the top of a chain, then we're going to print out a nice
233
- // multi-line layout if this doesn't break into multiple lines.
234
- if (!chained.includes(parentNode.type) &&
235
- (node.chain || 0) >= 3 &&
236
- node.breakDoc) {
237
- // This is pretty specialized behavior. Basically if we're at the top of a
238
- // chain but we've only had method calls without arguments and now we have
239
- // a method call with a block, then we're effectively trying to call a
240
- // method with arguments that is nested under a bunch of stuff. So we group
241
- // together to first part to make it so just the block breaks. This looks
242
- // like, for example:
243
- //
244
- // Rails.application.routes.draw do
245
- // root 'articles#index'
246
- // resources :articles
247
- // end
248
- //
249
- if (node.callChain === node.chain) {
250
- return [group(indent(node.breakDoc)), group(blockDoc)];
251
- }
252
- return ifBreak(group(indent(node.breakDoc.concat(blockDoc))), [
253
- callDoc,
254
- blockDoc
255
- ]);
256
- }
257
- return [callDoc, blockDoc];
258
- };
259
- exports.printMethodAddBlock = printMethodAddBlock;
260
- const printCallContainer = (path, opts, print) => {
261
- return path.call(print, "value");
262
- };
263
- exports.printCallContainer = printCallContainer;
@@ -1,50 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printWhen = exports.printCase = void 0;
7
- const prettier_1 = __importDefault(require("../../prettier"));
8
- const { align, fill, group, hardline, indent, line } = prettier_1.default;
9
- const printCase = (path, opts, print) => {
10
- const parts = ["case"];
11
- // You don't need to explicitly have something to test against in a case
12
- // statement (without it it effectively becomes an if/elsif chain).
13
- if (path.getValue().value) {
14
- parts.push(" ", path.call(print, "value"));
15
- }
16
- return [...parts, hardline, path.call(print, "cons"), hardline, "end"];
17
- };
18
- exports.printCase = printCase;
19
- const printWhen = (path, opts, print) => {
20
- const node = path.getValue();
21
- // The `fill` builder command expects an array of docs alternating with
22
- // line breaks. This is so it can loop through and determine where to break.
23
- const preds = fill(path.call(print, "args").reduce((accum, pred, index) => {
24
- if (index === 0) {
25
- return [pred];
26
- }
27
- // Pull off the last element and make it concat with a comma so that
28
- // we can maintain alternating lines and docs.
29
- return [
30
- ...accum.slice(0, -1),
31
- [accum[accum.length - 1], ","],
32
- line,
33
- pred
34
- ];
35
- }, []));
36
- const stmts = path.call(print, "stmts");
37
- const parts = [["when ", align("when ".length, preds)]];
38
- // It's possible in a when to just have empty void statements, in which case
39
- // we would skip adding the body.
40
- if (!stmts.every((part) => !part)) {
41
- parts.push(indent([hardline, stmts]));
42
- }
43
- // This is the next clause on the case statement, either another `when` or
44
- // an `else` clause.
45
- if (node.cons) {
46
- parts.push(hardline, path.call(print, "cons"));
47
- }
48
- return group(parts);
49
- };
50
- exports.printWhen = printWhen;
@@ -1,54 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printSClass = exports.printModule = exports.printClass = void 0;
7
- const prettier_1 = __importDefault(require("../../prettier"));
8
- const utils_1 = require("../../utils");
9
- const { group, hardline, indent } = prettier_1.default;
10
- const printClass = (path, opts, print) => {
11
- const node = path.getValue();
12
- const parts = ["class ", path.call(print, "constant")];
13
- if (node.superclass) {
14
- parts.push(" < ", path.call(print, "superclass"));
15
- }
16
- const declaration = group(parts);
17
- if ((0, utils_1.isEmptyBodyStmt)(node.bodystmt)) {
18
- return group([declaration, hardline, "end"]);
19
- }
20
- return group([
21
- declaration,
22
- indent([hardline, path.call(print, "bodystmt")]),
23
- [hardline, "end"]
24
- ]);
25
- };
26
- exports.printClass = printClass;
27
- const printModule = (path, opts, print) => {
28
- const node = path.getValue();
29
- const declaration = group(["module ", path.call(print, "constant")]);
30
- if ((0, utils_1.isEmptyBodyStmt)(node.bodystmt)) {
31
- return group([declaration, hardline, "end"]);
32
- }
33
- return group([
34
- declaration,
35
- indent([hardline, path.call(print, "bodystmt")]),
36
- hardline,
37
- "end"
38
- ]);
39
- };
40
- exports.printModule = printModule;
41
- const printSClass = (path, opts, print) => {
42
- const node = path.getValue();
43
- const declaration = ["class << ", path.call(print, "target")];
44
- if ((0, utils_1.isEmptyBodyStmt)(node.bodystmt)) {
45
- return group([declaration, hardline, "end"]);
46
- }
47
- return group([
48
- declaration,
49
- indent([hardline, path.call(print, "bodystmt")]),
50
- hardline,
51
- "end"
52
- ]);
53
- };
54
- exports.printSClass = printSClass;
@@ -1,138 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.printCommandCall = exports.printCommand = void 0;
7
- const prettier_1 = __importDefault(require("../../prettier"));
8
- const utils_1 = require("../../utils");
9
- const { align, group, ifBreak, indent, join, line, softline } = prettier_1.default;
10
- function throwBadDoc(doc) {
11
- throw new Error(`Unknown doc ${doc}`);
12
- }
13
- function reduceDocLength(sum, doc) {
14
- // If we've hit a line, then we're going to start the counting back at 0 since
15
- // it will be starting from the beginning of a line.
16
- if (typeof doc === "object" && !Array.isArray(doc) && doc.type === "line") {
17
- return 0;
18
- }
19
- return sum + docBreakLength(doc);
20
- }
21
- // Loop through the already created doc nodes and determine the overall length
22
- // so that we can properly align the command arguments.
23
- function docBreakLength(doc) {
24
- if (Array.isArray(doc)) {
25
- return doc.reduce(reduceDocLength, 0);
26
- }
27
- if (typeof doc === "string") {
28
- return doc.length;
29
- }
30
- switch (doc.type) {
31
- case "concat":
32
- case "fill":
33
- return doc.parts.reduce(reduceDocLength, 0);
34
- case "align":
35
- case "group":
36
- case "indent":
37
- case "line-suffix":
38
- return docBreakLength(doc.contents);
39
- case "if-break":
40
- return docBreakLength(doc.breakContents);
41
- case "line":
42
- return 0;
43
- case "break-parent":
44
- case "cursor":
45
- case "indent-if-break":
46
- case "label":
47
- case "line-suffix-boundary":
48
- case "trim":
49
- return 0;
50
- default:
51
- throwBadDoc(doc);
52
- }
53
- }
54
- function hasDef(node) {
55
- return (node.args.type === "args_add_block" &&
56
- node.args.args.type === "args" &&
57
- node.args.args.parts[0] &&
58
- ["def", "defs"].includes(node.args.args.parts[0].type));
59
- }
60
- // Very special handling case for rspec matchers. In general with rspec matchers
61
- // you expect to see something like:
62
- //
63
- // expect(foo).to receive(:bar).with(
64
- // 'one',
65
- // 'two',
66
- // 'three',
67
- // 'four',
68
- // 'five'
69
- // )
70
- //
71
- // In this case the arguments are aligned to the left side as opposed to being
72
- // aligned with the `receive` call.
73
- function skipArgsAlign(node) {
74
- return ["to", "not_to", "to_not"].includes(node.message.value);
75
- }
76
- // If there is a ternary argument to a command and it's going to get broken
77
- // into multiple lines, then we're going to have to use parentheses around the
78
- // command in order to make sure operator precedence doesn't get messed up.
79
- function hasTernaryArg(node) {
80
- var _a;
81
- switch (node.type) {
82
- case "args":
83
- return node.parts.some((child) => child.type === "ifop");
84
- case "args_add_block":
85
- return hasTernaryArg(node.args) || ((_a = node.block) === null || _a === void 0 ? void 0 : _a.type) === "ifop";
86
- }
87
- }
88
- const printCommand = (path, opts, print) => {
89
- const node = path.getValue();
90
- const command = path.call(print, "message");
91
- const joinedArgs = join([",", line], path.call(print, "args"));
92
- const hasTernary = hasTernaryArg(node.args);
93
- let breakArgs;
94
- if (hasTernary) {
95
- breakArgs = indent([softline, joinedArgs]);
96
- }
97
- else if (hasDef(node)) {
98
- breakArgs = joinedArgs;
99
- }
100
- else {
101
- breakArgs = align(docBreakLength(command) + 1, joinedArgs);
102
- }
103
- return group(ifBreak([
104
- command,
105
- hasTernary ? "(" : " ",
106
- breakArgs,
107
- hasTernary ? [softline, ")"] : ""
108
- ], [command, " ", joinedArgs]));
109
- };
110
- exports.printCommand = printCommand;
111
- const printCommandCall = (path, opts, print) => {
112
- const node = path.getValue();
113
- const parts = [
114
- path.call(print, "receiver"),
115
- (0, utils_1.makeCall)(path, opts, print),
116
- path.call(print, "message")
117
- ];
118
- if (!node.args) {
119
- return parts;
120
- }
121
- const argDocs = join([",", line], path.call(print, "args"));
122
- let breakDoc;
123
- if (hasTernaryArg(node.args)) {
124
- breakDoc = parts.concat("(", indent([softline, argDocs]), softline, ")");
125
- parts.push(" ");
126
- }
127
- else if (skipArgsAlign(node)) {
128
- parts.push(" ");
129
- breakDoc = parts.concat(argDocs);
130
- }
131
- else {
132
- parts.push(" ");
133
- breakDoc = parts.concat(align(docBreakLength(parts), argDocs));
134
- }
135
- const joinedDoc = parts.concat(argDocs);
136
- return group(ifBreak(breakDoc, joinedDoc));
137
- };
138
- exports.printCommandCall = printCommandCall;