prettier 0.12.2 → 0.12.3

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.
@@ -0,0 +1,25 @@
1
+ const { concat, group, indent, join, softline } = require("../prettier");
2
+ const { first, makeCall, prefix } = require("../utils");
3
+
4
+ module.exports = {
5
+ const_path_field: (path, opts, print) => join("::", path.map(print, "body")),
6
+ const_path_ref: (path, opts, print) => join("::", path.map(print, "body")),
7
+ const_ref: first,
8
+ defined: (path, opts, print) =>
9
+ group(
10
+ concat([
11
+ "defined?(",
12
+ indent(concat([softline, path.call(print, "body", 0)])),
13
+ concat([softline, ")"])
14
+ ])
15
+ ),
16
+ field: (path, opts, print) =>
17
+ group(
18
+ concat([
19
+ path.call(print, "body", 0),
20
+ concat([makeCall(path, opts, print), path.call(print, "body", 2)])
21
+ ])
22
+ ),
23
+ top_const_field: prefix("::"),
24
+ top_const_ref: prefix("::")
25
+ };
data/src/nodes/flow.js ADDED
@@ -0,0 +1,64 @@
1
+ const { concat, join } = require("../prettier");
2
+ const { literal } = require("../utils");
3
+
4
+ module.exports = {
5
+ break: (path, opts, print) => {
6
+ const content = path.getValue().body[0];
7
+
8
+ if (content.body.length === 0) {
9
+ return "break";
10
+ }
11
+
12
+ if (content.body[0].body[0].type === "paren") {
13
+ return concat([
14
+ "break ",
15
+ path.call(print, "body", 0, "body", 0, "body", 0, "body", 0)
16
+ ]);
17
+ }
18
+
19
+ return concat(["break ", join(", ", path.call(print, "body", 0))]);
20
+ },
21
+ next: (path, opts, print) => {
22
+ const args = path.getValue().body[0].body[0];
23
+
24
+ if (!args) {
25
+ return "next";
26
+ }
27
+
28
+ if (args.body[0].type === "paren") {
29
+ // Ignoring the parens node and just going straight to the content
30
+ return concat([
31
+ "next ",
32
+ path.call(print, "body", 0, "body", 0, "body", 0, "body", 0)
33
+ ]);
34
+ }
35
+
36
+ return concat(["next ", join(", ", path.call(print, "body", 0))]);
37
+ },
38
+ return: (path, opts, print) => {
39
+ const args = path.getValue().body[0].body[0];
40
+
41
+ if (!args) {
42
+ return "return";
43
+ }
44
+
45
+ if (args.body[0] && args.body[0].type === "paren") {
46
+ // Ignoring the parens node and just going straight to the content
47
+ return concat([
48
+ "return ",
49
+ path.call(print, "body", 0, "body", 0, "body", 0, "body", 0)
50
+ ]);
51
+ }
52
+
53
+ return concat(["return ", join(", ", path.call(print, "body", 0))]);
54
+ },
55
+ return0: literal("return"),
56
+ yield: (path, opts, print) => {
57
+ if (path.getValue().body[0].type === "paren") {
58
+ return concat(["yield", path.call(print, "body", 0)]);
59
+ }
60
+
61
+ return concat(["yield ", join(", ", path.call(print, "body", 0))]);
62
+ },
63
+ yield0: literal("yield")
64
+ };
data/src/nodes/hashes.js CHANGED
@@ -6,8 +6,8 @@ const {
6
6
  join,
7
7
  line,
8
8
  literalline
9
- } = require("../builders");
10
- const { skipAssignIndent } = require("../utils");
9
+ } = require("../prettier");
10
+ const { prefix, skipAssignIndent } = require("../utils");
11
11
 
12
12
  const nodeDive = (node, steps) => {
13
13
  let current = node;
@@ -67,6 +67,7 @@ module.exports = {
67
67
 
68
68
  return group(concat(parts));
69
69
  },
70
+ assoc_splat: prefix("**"),
70
71
  assoclist_from_args: (path, opts, print) => {
71
72
  const { addTrailingCommas } = opts;
72
73
 
data/src/nodes/hooks.js CHANGED
@@ -1,4 +1,4 @@
1
- const { concat, group, indent, line } = require("../builders");
1
+ const { concat, group, indent, line } = require("../prettier");
2
2
 
3
3
  const printHook = name => (path, opts, print) =>
4
4
  group(
data/src/nodes/ints.js ADDED
@@ -0,0 +1,24 @@
1
+ module.exports = {
2
+ "@int": (path, _opts, _print) => {
3
+ const { body } = path.getValue();
4
+
5
+ // If the number is octal and does not contain the optional "o" character
6
+ // after the leading 0, add it in.
7
+ if (/^0[0-9]/.test(body)) {
8
+ return `0o${body.slice(1)}`;
9
+ }
10
+
11
+ // If the number is a base 10 number, is sufficiently large, and is not
12
+ // already formatted with underscores, then add them in in between the
13
+ // numbers every three characters starting from the right.
14
+ if (!body.startsWith("0") && body.length >= 4 && !body.includes("_")) {
15
+ return ` ${body}`
16
+ .slice((body.length + 2) % 3)
17
+ .match(/.{3}/g)
18
+ .join("_")
19
+ .trim();
20
+ }
21
+
22
+ return body;
23
+ }
24
+ };
data/src/nodes/lambdas.js CHANGED
@@ -6,7 +6,7 @@ const {
6
6
  line,
7
7
  removeLines,
8
8
  softline
9
- } = require("../builders");
9
+ } = require("../prettier");
10
10
  const { hasAncestor } = require("../utils");
11
11
 
12
12
  module.exports = {
data/src/nodes/loops.js CHANGED
@@ -6,7 +6,7 @@ const {
6
6
  ifBreak,
7
7
  indent,
8
8
  softline
9
- } = require("../builders");
9
+ } = require("../prettier");
10
10
 
11
11
  const printLoop = keyword => (path, { inlineLoops }, print) =>
12
12
  group(
@@ -0,0 +1,70 @@
1
+ const { concat, group, indent, join, line, softline } = require("../prettier");
2
+ const { makeList } = require("../utils");
3
+
4
+ module.exports = {
5
+ massign: (path, opts, print) => {
6
+ let right = path.call(print, "body", 1);
7
+
8
+ if (
9
+ ["mrhs_add_star", "mrhs_new_from_args"].includes(
10
+ path.getValue().body[1].type
11
+ )
12
+ ) {
13
+ right = group(join(concat([",", line]), right));
14
+ }
15
+
16
+ return group(
17
+ concat([
18
+ group(join(concat([",", line]), path.call(print, "body", 0))),
19
+ " =",
20
+ indent(concat([line, right]))
21
+ ])
22
+ );
23
+ },
24
+ mlhs: makeList,
25
+ mlhs_add_post: (path, opts, print) =>
26
+ path.call(print, "body", 0).concat(path.call(print, "body", 1)),
27
+ mlhs_add_star: (path, opts, print) =>
28
+ path
29
+ .call(print, "body", 0)
30
+ .concat([
31
+ path.getValue().body[1]
32
+ ? concat(["*", path.call(print, "body", 1)])
33
+ : "*"
34
+ ]),
35
+ mlhs_paren: (path, opts, print) => {
36
+ if (["massign", "mlhs_paren"].includes(path.getParentNode().type)) {
37
+ // If we're nested in brackets as part of the left hand side of an
38
+ // assignment, i.e., (a, b, c) = 1, 2, 3
39
+ // ignore the current node and just go straight to the content
40
+ return path.call(print, "body", 0);
41
+ }
42
+
43
+ return group(
44
+ concat([
45
+ "(",
46
+ indent(
47
+ concat([
48
+ softline,
49
+ join(concat([",", line]), path.call(print, "body", 0))
50
+ ])
51
+ ),
52
+ concat([softline, ")"])
53
+ ])
54
+ );
55
+ },
56
+ mrhs: makeList,
57
+ mrhs_add_star: (path, opts, print) =>
58
+ path
59
+ .call(print, "body", 0)
60
+ .concat([concat(["*", path.call(print, "body", 1)])]),
61
+ mrhs_new_from_args: (path, opts, print) => {
62
+ const parts = path.call(print, "body", 0);
63
+
64
+ if (path.getValue().body.length > 1) {
65
+ parts.push(path.call(print, "body", 1));
66
+ }
67
+
68
+ return parts;
69
+ }
70
+ };
data/src/nodes/methods.js CHANGED
@@ -1,4 +1,13 @@
1
- const { concat, group, hardline, indent } = require("../builders");
1
+ const {
2
+ align,
3
+ concat,
4
+ group,
5
+ hardline,
6
+ indent,
7
+ join,
8
+ line
9
+ } = require("../prettier");
10
+ const { first, literal } = require("../utils");
2
11
 
3
12
  const printMethod = offset => (path, opts, print) => {
4
13
  const [_name, params, body] = path.getValue().body.slice(offset);
@@ -37,6 +46,35 @@ const printMethod = offset => (path, opts, print) => {
37
46
  };
38
47
 
39
48
  module.exports = {
49
+ access_ctrl: first,
40
50
  def: printMethod(0),
41
- defs: printMethod(2)
51
+ defs: printMethod(2),
52
+ methref: (path, opts, print) => join(".:", path.map(print, "body")),
53
+ super: (path, opts, print) => {
54
+ const args = path.getValue().body[0];
55
+
56
+ if (args.type === "arg_paren") {
57
+ // In case there are explicitly no arguments but they are using parens,
58
+ // we assume they are attempting to override the initializer and pass no
59
+ // arguments up.
60
+ if (args.body[0] === null) {
61
+ return "super()";
62
+ }
63
+
64
+ return concat(["super", path.call(print, "body", 0)]);
65
+ }
66
+
67
+ return concat(["super ", join(", ", path.call(print, "body", 0))]);
68
+ },
69
+ undef: (path, opts, print) =>
70
+ group(
71
+ concat([
72
+ "undef ",
73
+ align(
74
+ "undef ".length,
75
+ join(concat([",", line]), path.map(print, "body", 0))
76
+ )
77
+ ])
78
+ ),
79
+ zsuper: literal("super")
42
80
  };
@@ -0,0 +1,44 @@
1
+ const { concat, group, indent, line, softline } = require("../prettier");
2
+
3
+ module.exports = {
4
+ binary: (path, opts, print) => {
5
+ const operator = path.getValue().body[1];
6
+ const useNoSpace = operator === "**";
7
+
8
+ return group(
9
+ concat([
10
+ concat([path.call(print, "body", 0), useNoSpace ? "" : " "]),
11
+ operator,
12
+ indent(
13
+ concat([useNoSpace ? softline : line, path.call(print, "body", 2)])
14
+ )
15
+ ])
16
+ );
17
+ },
18
+ dot2: (path, opts, print) =>
19
+ concat([
20
+ path.call(print, "body", 0),
21
+ "..",
22
+ path.getValue().body[1] ? path.call(print, "body", 1) : ""
23
+ ]),
24
+ dot3: (path, opts, print) =>
25
+ concat([
26
+ path.call(print, "body", 0),
27
+ "...",
28
+ path.getValue().body[1] ? path.call(print, "body", 1) : ""
29
+ ]),
30
+ unary: (path, opts, print) => {
31
+ const oper = path.getValue().body[0];
32
+ const doc = path.call(print, "body", 1);
33
+
34
+ if (oper === "not") {
35
+ // For the `not` operator, we're explicitly making the space character
36
+ // another element in the `concat` because there are some circumstances
37
+ // where we need to force parentheses (e.g., ternaries). In that case the
38
+ // printer for those nodes can just take out the space and put in parens.
39
+ return concat(["not", " ", doc]);
40
+ }
41
+
42
+ return concat([oper[0], doc]);
43
+ }
44
+ };
data/src/nodes/params.js CHANGED
@@ -1,4 +1,4 @@
1
- const { concat, group, join, line } = require("../builders");
1
+ const { concat, group, join, line } = require("../prettier");
2
2
 
3
3
  const printGenericRestParam = symbol => (path, opts, print) =>
4
4
  path.getValue().body[0]
@@ -33,7 +33,7 @@ const printParams = (path, opts, print) => {
33
33
  );
34
34
  }
35
35
 
36
- if (rest) {
36
+ if (rest && rest.type !== "excessed_comma") {
37
37
  parts.push(path.call(print, "body", 2));
38
38
  }
39
39
 
@@ -60,7 +60,18 @@ const printParams = (path, opts, print) => {
60
60
  parts.push(path.call(print, "body", 6));
61
61
  }
62
62
 
63
- return group(join(concat([",", line]), parts));
63
+ // You can put an extra comma at the end of block args between pipes to
64
+ // change what it does. Below is the difference:
65
+ //
66
+ // [[1, 2], [3, 4]].each { |x| p x } # prints [1, 2] then [3, 4]
67
+ // [[1, 2], [3, 4]].each { |x,| p x } # prints 1 then 3
68
+ //
69
+ // In ruby 2.5, the excessed comma is indicated by having a 0 in the rest
70
+ // param position. In ruby 2.6+ it's indicated by having an "excessed_comma"
71
+ // node in the rest position. Seems odd, but it's true.
72
+ const comma = rest === 0 || (rest && rest.type === "excessed_comma");
73
+
74
+ return group(concat([join(concat([",", line]), parts), comma ? "," : ""]));
64
75
  };
65
76
 
66
77
  const paramError = () => {
data/src/nodes/regexp.js CHANGED
@@ -1,4 +1,4 @@
1
- const { concat } = require("../builders");
1
+ const { concat } = require("../prettier");
2
2
  const { makeList } = require("../utils");
3
3
 
4
4
  module.exports = {
data/src/nodes/rescue.js CHANGED
@@ -6,7 +6,7 @@ const {
6
6
  indent,
7
7
  join,
8
8
  line
9
- } = require("../builders");
9
+ } = require("../prettier");
10
10
  const { literal } = require("../utils");
11
11
 
12
12
  module.exports = {
@@ -0,0 +1,61 @@
1
+ const {
2
+ concat,
3
+ group,
4
+ hardline,
5
+ ifBreak,
6
+ indent,
7
+ line
8
+ } = require("../prettier");
9
+
10
+ module.exports = {
11
+ class: (path, opts, print) => {
12
+ const [_constant, superclass, statements] = path.getValue().body;
13
+
14
+ const parts = ["class ", path.call(print, "body", 0)];
15
+ if (superclass) {
16
+ parts.push(" < ", path.call(print, "body", 1));
17
+ }
18
+
19
+ // If the body is empty, we can replace with a ;
20
+ const stmts = statements.body[0].body;
21
+ if (stmts.length === 1 && stmts[0].type === "void_stmt") {
22
+ return group(concat([concat(parts), ifBreak(line, "; "), "end"]));
23
+ }
24
+
25
+ return group(
26
+ concat([
27
+ concat(parts),
28
+ indent(concat([hardline, path.call(print, "body", 2)])),
29
+ concat([hardline, "end"])
30
+ ])
31
+ );
32
+ },
33
+ class_name_error: (_path, _opts, _print) => {
34
+ throw new Error("class/module name must be CONSTANT");
35
+ },
36
+ module: (path, opts, print) => {
37
+ const declaration = group(concat(["module ", path.call(print, "body", 0)]));
38
+
39
+ // If the body is empty, we can replace with a ;
40
+ const stmts = path.getValue().body[1].body[0].body;
41
+ if (stmts.length === 1 && stmts[0].type === "void_stmt") {
42
+ return group(concat([declaration, ifBreak(line, "; "), "end"]));
43
+ }
44
+
45
+ return group(
46
+ concat([
47
+ declaration,
48
+ indent(concat([hardline, path.call(print, "body", 1)])),
49
+ concat([hardline, "end"])
50
+ ])
51
+ );
52
+ },
53
+ sclass: (path, opts, print) =>
54
+ group(
55
+ concat([
56
+ concat(["class << ", path.call(print, "body", 0)]),
57
+ indent(concat([hardline, path.call(print, "body", 1)])),
58
+ concat([hardline, "end"])
59
+ ])
60
+ )
61
+ };