| |
| |
| |
| |
| |
| |
| "use strict"; |
|
|
| const util = require("./utils/ast-utils"); |
|
|
| |
| |
| |
|
|
| |
| module.exports = { |
| meta: { |
| deprecated: { |
| message: "Formatting rules are being moved out of ESLint core.", |
| url: "https://eslint.org/blog/2023/10/deprecating-formatting-rules/", |
| deprecatedSince: "8.53.0", |
| availableUntil: "11.0.0", |
| replacedBy: [ |
| { |
| message: |
| "ESLint Stylistic now maintains deprecated stylistic core rules.", |
| url: "https://eslint.style/guide/migration", |
| plugin: { |
| name: "@stylistic/eslint-plugin", |
| url: "https://eslint.style", |
| }, |
| rule: { |
| name: "block-spacing", |
| url: "https://eslint.style/rules/block-spacing", |
| }, |
| }, |
| ], |
| }, |
| type: "layout", |
|
|
| docs: { |
| description: |
| "Disallow or enforce spaces inside of blocks after opening block and before closing block", |
| recommended: false, |
| url: "https://eslint.org/docs/latest/rules/block-spacing", |
| }, |
|
|
| fixable: "whitespace", |
|
|
| schema: [{ enum: ["always", "never"] }], |
|
|
| messages: { |
| missing: "Requires a space {{location}} '{{token}}'.", |
| extra: "Unexpected space(s) {{location}} '{{token}}'.", |
| }, |
| }, |
|
|
| create(context) { |
| const always = context.options[0] !== "never", |
| messageId = always ? "missing" : "extra", |
| sourceCode = context.sourceCode; |
|
|
| |
| |
| |
| |
| |
| function getOpenBrace(node) { |
| if (node.type === "SwitchStatement") { |
| if (node.cases.length > 0) { |
| return sourceCode.getTokenBefore(node.cases[0]); |
| } |
| return sourceCode.getLastToken(node, 1); |
| } |
|
|
| if (node.type === "StaticBlock") { |
| return sourceCode.getFirstToken(node, { skip: 1 }); |
| } |
|
|
| |
| return sourceCode.getFirstToken(node); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function isValid(left, right) { |
| return ( |
| !util.isTokenOnSameLine(left, right) || |
| sourceCode.isSpaceBetween(left, right) === always |
| ); |
| } |
|
|
| |
| |
| |
| |
| |
| function checkSpacingInsideBraces(node) { |
| |
| const openBrace = getOpenBrace(node); |
| const closeBrace = sourceCode.getLastToken(node); |
| const firstToken = sourceCode.getTokenAfter(openBrace, { |
| includeComments: true, |
| }); |
| const lastToken = sourceCode.getTokenBefore(closeBrace, { |
| includeComments: true, |
| }); |
|
|
| |
| if ( |
| openBrace.type !== "Punctuator" || |
| openBrace.value !== "{" || |
| closeBrace.type !== "Punctuator" || |
| closeBrace.value !== "}" || |
| firstToken === closeBrace |
| ) { |
| return; |
| } |
|
|
| |
| if (!always && firstToken.type === "Line") { |
| return; |
| } |
|
|
| |
| if (!isValid(openBrace, firstToken)) { |
| let loc = openBrace.loc; |
|
|
| if (messageId === "extra") { |
| loc = { |
| start: openBrace.loc.end, |
| end: firstToken.loc.start, |
| }; |
| } |
|
|
| context.report({ |
| node, |
| loc, |
| messageId, |
| data: { |
| location: "after", |
| token: openBrace.value, |
| }, |
| fix(fixer) { |
| if (always) { |
| return fixer.insertTextBefore(firstToken, " "); |
| } |
|
|
| return fixer.removeRange([ |
| openBrace.range[1], |
| firstToken.range[0], |
| ]); |
| }, |
| }); |
| } |
| if (!isValid(lastToken, closeBrace)) { |
| let loc = closeBrace.loc; |
|
|
| if (messageId === "extra") { |
| loc = { |
| start: lastToken.loc.end, |
| end: closeBrace.loc.start, |
| }; |
| } |
| context.report({ |
| node, |
| loc, |
| messageId, |
| data: { |
| location: "before", |
| token: closeBrace.value, |
| }, |
| fix(fixer) { |
| if (always) { |
| return fixer.insertTextAfter(lastToken, " "); |
| } |
|
|
| return fixer.removeRange([ |
| lastToken.range[1], |
| closeBrace.range[0], |
| ]); |
| }, |
| }); |
| } |
| } |
|
|
| return { |
| BlockStatement: checkSpacingInsideBraces, |
| StaticBlock: checkSpacingInsideBraces, |
| SwitchStatement: checkSpacingInsideBraces, |
| }; |
| }, |
| }; |
|
|