UNPKG

3.99 kBJavaScriptView Raw
1/**
2 * @fileoverview Rule to check the spacing around the * in yield* expressions.
3 * @author Bryan Smith
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Rule Definition
10//------------------------------------------------------------------------------
11
12module.exports = {
13 meta: {
14 docs: {
15 description: "require or disallow spacing around the `*` in `yield*` expressions",
16 category: "ECMAScript 6",
17 recommended: false,
18 url: "https://eslint.org/docs/rules/yield-star-spacing"
19 },
20
21 fixable: "whitespace",
22
23 schema: [
24 {
25 oneOf: [
26 {
27 enum: ["before", "after", "both", "neither"]
28 },
29 {
30 type: "object",
31 properties: {
32 before: { type: "boolean" },
33 after: { type: "boolean" }
34 },
35 additionalProperties: false
36 }
37 ]
38 }
39 ]
40 },
41
42 create(context) {
43 const sourceCode = context.getSourceCode();
44
45 const mode = (function(option) {
46 if (!option || typeof option === "string") {
47 return {
48 before: { before: true, after: false },
49 after: { before: false, after: true },
50 both: { before: true, after: true },
51 neither: { before: false, after: false }
52 }[option || "after"];
53 }
54 return option;
55 }(context.options[0]));
56
57 /**
58 * Checks the spacing between two tokens before or after the star token.
59 * @param {string} side Either "before" or "after".
60 * @param {Token} leftToken `function` keyword token if side is "before", or
61 * star token if side is "after".
62 * @param {Token} rightToken Star token if side is "before", or identifier
63 * token if side is "after".
64 * @returns {void}
65 */
66 function checkSpacing(side, leftToken, rightToken) {
67 if (sourceCode.isSpaceBetweenTokens(leftToken, rightToken) !== mode[side]) {
68 const after = leftToken.value === "*";
69 const spaceRequired = mode[side];
70 const node = after ? leftToken : rightToken;
71 const type = spaceRequired ? "Missing" : "Unexpected";
72 const message = "{{type}} space {{side}} *.";
73
74 context.report({
75 node,
76 message,
77 data: {
78 type,
79 side
80 },
81 fix(fixer) {
82 if (spaceRequired) {
83 if (after) {
84 return fixer.insertTextAfter(node, " ");
85 }
86 return fixer.insertTextBefore(node, " ");
87 }
88 return fixer.removeRange([leftToken.range[1], rightToken.range[0]]);
89 }
90 });
91 }
92 }
93
94 /**
95 * Enforces the spacing around the star if node is a yield* expression.
96 * @param {ASTNode} node A yield expression node.
97 * @returns {void}
98 */
99 function checkExpression(node) {
100 if (!node.delegate) {
101 return;
102 }
103
104 const tokens = sourceCode.getFirstTokens(node, 3);
105 const yieldToken = tokens[0];
106 const starToken = tokens[1];
107 const nextToken = tokens[2];
108
109 checkSpacing("before", yieldToken, starToken);
110 checkSpacing("after", starToken, nextToken);
111 }
112
113 return {
114 YieldExpression: checkExpression
115 };
116
117 }
118};