]>
git.proxmox.com Git - pve-eslint.git/blob - eslint/lib/rules/block-spacing.js
990b441e34dd8a7636b9d32c1bb245c8cd35e9bc
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",
21 url
: "https://eslint.org/docs/rules/block-spacing"
24 fixable
: "whitespace",
27 { enum: ["always", "never"] }
31 missing
: "Requires a space {{location}} '{{token}}'.",
32 extra
: "Unexpected space(s) {{location}} '{{token}}'."
37 const always
= (context
.options
[0] !== "never"),
38 messageId
= always
? "missing" : "extra",
39 sourceCode
= context
.getSourceCode();
42 * Gets the open brace token from a given node.
43 * @param {ASTNode} node A BlockStatement/StaticBlock/SwitchStatement node to get.
44 * @returns {Token} The token of the open brace.
46 function getOpenBrace(node
) {
47 if (node
.type
=== "SwitchStatement") {
48 if (node
.cases
.length
> 0) {
49 return sourceCode
.getTokenBefore(node
.cases
[0]);
51 return sourceCode
.getLastToken(node
, 1);
54 if (node
.type
=== "StaticBlock") {
55 return sourceCode
.getFirstToken(node
, { skip
: 1 }); // skip the `static` token
59 return sourceCode
.getFirstToken(node
);
63 * Checks whether or not:
64 * - given tokens are on same line.
65 * - there is/isn't a space between given tokens.
66 * @param {Token} left A token to check.
67 * @param {Token} right The token which is next to `left`.
69 * When the option is `"always"`, `true` if there are one or more spaces between given tokens.
70 * When the option is `"never"`, `true` if there are not any spaces between given tokens.
71 * If given tokens are not on same line, it's always `true`.
73 function isValid(left
, right
) {
75 !util
.isTokenOnSameLine(left
, right
) ||
76 sourceCode
.isSpaceBetweenTokens(left
, right
) === always
81 * Checks and reports invalid spacing style inside braces.
82 * @param {ASTNode} node A BlockStatement/StaticBlock/SwitchStatement node to check.
85 function checkSpacingInsideBraces(node
) {
87 // Gets braces and the first/last token of content.
88 const openBrace
= getOpenBrace(node
);
89 const closeBrace
= sourceCode
.getLastToken(node
);
90 const firstToken
= sourceCode
.getTokenAfter(openBrace
, { includeComments
: true });
91 const lastToken
= sourceCode
.getTokenBefore(closeBrace
, { includeComments
: true });
93 // Skip if the node is invalid or empty.
94 if (openBrace
.type
!== "Punctuator" ||
95 openBrace
.value
!== "{" ||
96 closeBrace
.type
!== "Punctuator" ||
97 closeBrace
.value
!== "}" ||
98 firstToken
=== closeBrace
103 // Skip line comments for option never
104 if (!always
&& firstToken
.type
=== "Line") {
109 if (!isValid(openBrace
, firstToken
)) {
110 let loc
= openBrace
.loc
;
112 if (messageId
=== "extra") {
114 start
: openBrace
.loc
.end
,
115 end
: firstToken
.loc
.start
125 token
: openBrace
.value
129 return fixer
.insertTextBefore(firstToken
, " ");
132 return fixer
.removeRange([openBrace
.range
[1], firstToken
.range
[0]]);
136 if (!isValid(lastToken
, closeBrace
)) {
137 let loc
= closeBrace
.loc
;
139 if (messageId
=== "extra") {
141 start
: lastToken
.loc
.end
,
142 end
: closeBrace
.loc
.start
151 token
: closeBrace
.value
155 return fixer
.insertTextAfter(lastToken
, " ");
158 return fixer
.removeRange([lastToken
.range
[1], closeBrace
.range
[0]]);
165 BlockStatement
: checkSpacingInsideBraces
,
166 StaticBlock
: checkSpacingInsideBraces
,
167 SwitchStatement
: checkSpacingInsideBraces