UNPKG

3.66 kBJavaScriptView Raw
1/**
2 * @fileoverview Enforce spacing between rest and spread operators and their expressions.
3 * @author Kai Cataldo
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Rule Definition
10//------------------------------------------------------------------------------
11
12module.exports = {
13 meta: {
14 docs: {
15 description: "enforce spacing between rest and spread operators and their expressions",
16 category: "ECMAScript 6",
17 recommended: false
18 },
19 fixable: "whitespace",
20 schema: [
21 {
22 enum: ["always", "never"]
23 }
24 ]
25 },
26
27 create(context) {
28 const sourceCode = context.getSourceCode(),
29 alwaysSpace = context.options[0] === "always";
30
31 //--------------------------------------------------------------------------
32 // Helpers
33 //--------------------------------------------------------------------------
34
35 /**
36 * Checks whitespace between rest/spread operators and their expressions
37 * @param {ASTNode} node - The node to check
38 * @returns {void}
39 */
40 function checkWhiteSpace(node) {
41 const operator = sourceCode.getFirstToken(node),
42 nextToken = sourceCode.getTokenAfter(operator),
43 hasWhitespace = sourceCode.isSpaceBetweenTokens(operator, nextToken);
44 let type;
45
46 switch (node.type) {
47 case "SpreadElement":
48 type = "spread";
49 break;
50 case "RestElement":
51 type = "rest";
52 break;
53 case "ExperimentalSpreadProperty":
54 type = "spread property";
55 break;
56 case "ExperimentalRestProperty":
57 type = "rest property";
58 break;
59 default:
60 return;
61 }
62
63 if (alwaysSpace && !hasWhitespace) {
64 context.report({
65 node,
66 loc: {
67 line: operator.loc.end.line,
68 column: operator.loc.end.column
69 },
70 message: "Expected whitespace after {{type}} operator.",
71 data: {
72 type
73 },
74 fix(fixer) {
75 return fixer.replaceTextRange([operator.range[1], nextToken.range[0]], " ");
76 }
77 });
78 } else if (!alwaysSpace && hasWhitespace) {
79 context.report({
80 node,
81 loc: {
82 line: operator.loc.end.line,
83 column: operator.loc.end.column
84 },
85 message: "Unexpected whitespace after {{type}} operator.",
86 data: {
87 type
88 },
89 fix(fixer) {
90 return fixer.removeRange([operator.range[1], nextToken.range[0]]);
91 }
92 });
93 }
94 }
95
96 //--------------------------------------------------------------------------
97 // Public
98 //--------------------------------------------------------------------------
99
100 return {
101 SpreadElement: checkWhiteSpace,
102 RestElement: checkWhiteSpace,
103 ExperimentalSpreadProperty: checkWhiteSpace,
104 ExperimentalRestProperty: checkWhiteSpace
105 };
106 }
107};