]>
git.proxmox.com Git - pve-eslint.git/blob - eslint/lib/rules/block-spacing.js
c4b30b0b70b9839bd145fdd36c5e947d0d1d1a72
2 * @fileoverview A rule to disallow or enforce spaces inside of single line blocks.
3 * @author Toru Nagashima
8 const util
= require("./utils/ast-utils");
10 //------------------------------------------------------------------------------
12 //------------------------------------------------------------------------------
19 description
: "disallow or enforce spaces inside of blocks after opening block and before closing block",
20 category
: "Stylistic Issues",
22 url
: "https://eslint.org/docs/rules/block-spacing"
25 fixable
: "whitespace",
28 { enum: ["always", "never"] }
32 missing
: "Requires a space {{location}} '{{token}}'.",
33 extra
: "Unexpected space(s) {{location}} '{{token}}'."
38 const always
= (context
.options
[0] !== "never"),
39 messageId
= always
? "missing" : "extra",
40 sourceCode
= context
.getSourceCode();
43 * Gets the open brace token from a given node.
44 * @param {ASTNode} node A BlockStatement/SwitchStatement node to get.
45 * @returns {Token} The token of the open brace.
47 function getOpenBrace(node
) {
48 if (node
.type
=== "SwitchStatement") {
49 if (node
.cases
.length
> 0) {
50 return sourceCode
.getTokenBefore(node
.cases
[0]);
52 return sourceCode
.getLastToken(node
, 1);
54 return sourceCode
.getFirstToken(node
);
58 * Checks whether or not:
59 * - given tokens are on same line.
60 * - there is/isn't a space between given tokens.
61 * @param {Token} left A token to check.
62 * @param {Token} right The token which is next to `left`.
64 * When the option is `"always"`, `true` if there are one or more spaces between given tokens.
65 * When the option is `"never"`, `true` if there are not any spaces between given tokens.
66 * If given tokens are not on same line, it's always `true`.
68 function isValid(left
, right
) {
70 !util
.isTokenOnSameLine(left
, right
) ||
71 sourceCode
.isSpaceBetweenTokens(left
, right
) === always
76 * Reports invalid spacing style inside braces.
77 * @param {ASTNode} node A BlockStatement/SwitchStatement node to get.
80 function checkSpacingInsideBraces(node
) {
82 // Gets braces and the first/last token of content.
83 const openBrace
= getOpenBrace(node
);
84 const closeBrace
= sourceCode
.getLastToken(node
);
85 const firstToken
= sourceCode
.getTokenAfter(openBrace
, { includeComments
: true });
86 const lastToken
= sourceCode
.getTokenBefore(closeBrace
, { includeComments
: true });
88 // Skip if the node is invalid or empty.
89 if (openBrace
.type
!== "Punctuator" ||
90 openBrace
.value
!== "{" ||
91 closeBrace
.type
!== "Punctuator" ||
92 closeBrace
.value
!== "}" ||
93 firstToken
=== closeBrace
98 // Skip line comments for option never
99 if (!always
&& firstToken
.type
=== "Line") {
104 if (!isValid(openBrace
, firstToken
)) {
105 let loc
= openBrace
.loc
;
107 if (messageId
=== "extra") {
109 start
: openBrace
.loc
.end
,
110 end
: firstToken
.loc
.start
120 token
: openBrace
.value
124 return fixer
.insertTextBefore(firstToken
, " ");
127 return fixer
.removeRange([openBrace
.range
[1], firstToken
.range
[0]]);
131 if (!isValid(lastToken
, closeBrace
)) {
132 let loc
= closeBrace
.loc
;
134 if (messageId
=== "extra") {
136 start
: lastToken
.loc
.end
,
137 end
: closeBrace
.loc
.start
146 token
: closeBrace
.value
150 return fixer
.insertTextAfter(lastToken
, " ");
153 return fixer
.removeRange([lastToken
.range
[1], closeBrace
.range
[0]]);
160 BlockStatement
: checkSpacingInsideBraces
,
161 SwitchStatement
: checkSpacingInsideBraces