.
This commit is contained in:
		
							
								
								
									
										158
									
								
								qwen/nodejs/node_modules/eslint/lib/rules/semi-style.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								qwen/nodejs/node_modules/eslint/lib/rules/semi-style.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @fileoverview Rule to enforce location of semicolons.
 | 
			
		||||
 * @author Toru Nagashima
 | 
			
		||||
 * @deprecated in ESLint v8.53.0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
const astUtils = require("./utils/ast-utils");
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Rule Definition
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
const SELECTOR = [
 | 
			
		||||
    "BreakStatement", "ContinueStatement", "DebuggerStatement",
 | 
			
		||||
    "DoWhileStatement", "ExportAllDeclaration",
 | 
			
		||||
    "ExportDefaultDeclaration", "ExportNamedDeclaration",
 | 
			
		||||
    "ExpressionStatement", "ImportDeclaration", "ReturnStatement",
 | 
			
		||||
    "ThrowStatement", "VariableDeclaration", "PropertyDefinition"
 | 
			
		||||
].join(",");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the child node list of a given node.
 | 
			
		||||
 * This returns `BlockStatement#body`, `StaticBlock#body`, `Program#body`,
 | 
			
		||||
 * `ClassBody#body`, or `SwitchCase#consequent`.
 | 
			
		||||
 * This is used to check whether a node is the first/last child.
 | 
			
		||||
 * @param {Node} node A node to get child node list.
 | 
			
		||||
 * @returns {Node[]|null} The child node list.
 | 
			
		||||
 */
 | 
			
		||||
function getChildren(node) {
 | 
			
		||||
    const t = node.type;
 | 
			
		||||
 | 
			
		||||
    if (
 | 
			
		||||
        t === "BlockStatement" ||
 | 
			
		||||
        t === "StaticBlock" ||
 | 
			
		||||
        t === "Program" ||
 | 
			
		||||
        t === "ClassBody"
 | 
			
		||||
    ) {
 | 
			
		||||
        return node.body;
 | 
			
		||||
    }
 | 
			
		||||
    if (t === "SwitchCase") {
 | 
			
		||||
        return node.consequent;
 | 
			
		||||
    }
 | 
			
		||||
    return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check whether a given node is the last statement in the parent block.
 | 
			
		||||
 * @param {Node} node A node to check.
 | 
			
		||||
 * @returns {boolean} `true` if the node is the last statement in the parent block.
 | 
			
		||||
 */
 | 
			
		||||
function isLastChild(node) {
 | 
			
		||||
    const t = node.parent.type;
 | 
			
		||||
 | 
			
		||||
    if (t === "IfStatement" && node.parent.consequent === node && node.parent.alternate) { // before `else` keyword.
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    if (t === "DoWhileStatement") { // before `while` keyword.
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    const nodeList = getChildren(node.parent);
 | 
			
		||||
 | 
			
		||||
    return nodeList !== null && nodeList[nodeList.length - 1] === node; // before `}` or etc.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @type {import('../shared/types').Rule} */
 | 
			
		||||
module.exports = {
 | 
			
		||||
    meta: {
 | 
			
		||||
        deprecated: true,
 | 
			
		||||
        replacedBy: [],
 | 
			
		||||
        type: "layout",
 | 
			
		||||
 | 
			
		||||
        docs: {
 | 
			
		||||
            description: "Enforce location of semicolons",
 | 
			
		||||
            recommended: false,
 | 
			
		||||
            url: "https://eslint.org/docs/latest/rules/semi-style"
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        schema: [{ enum: ["last", "first"] }],
 | 
			
		||||
        fixable: "whitespace",
 | 
			
		||||
 | 
			
		||||
        messages: {
 | 
			
		||||
            expectedSemiColon: "Expected this semicolon to be at {{pos}}."
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    create(context) {
 | 
			
		||||
        const sourceCode = context.sourceCode;
 | 
			
		||||
        const option = context.options[0] || "last";
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Check the given semicolon token.
 | 
			
		||||
         * @param {Token} semiToken The semicolon token to check.
 | 
			
		||||
         * @param {"first"|"last"} expected The expected location to check.
 | 
			
		||||
         * @returns {void}
 | 
			
		||||
         */
 | 
			
		||||
        function check(semiToken, expected) {
 | 
			
		||||
            const prevToken = sourceCode.getTokenBefore(semiToken);
 | 
			
		||||
            const nextToken = sourceCode.getTokenAfter(semiToken);
 | 
			
		||||
            const prevIsSameLine = !prevToken || astUtils.isTokenOnSameLine(prevToken, semiToken);
 | 
			
		||||
            const nextIsSameLine = !nextToken || astUtils.isTokenOnSameLine(semiToken, nextToken);
 | 
			
		||||
 | 
			
		||||
            if ((expected === "last" && !prevIsSameLine) || (expected === "first" && !nextIsSameLine)) {
 | 
			
		||||
                context.report({
 | 
			
		||||
                    loc: semiToken.loc,
 | 
			
		||||
                    messageId: "expectedSemiColon",
 | 
			
		||||
                    data: {
 | 
			
		||||
                        pos: (expected === "last")
 | 
			
		||||
                            ? "the end of the previous line"
 | 
			
		||||
                            : "the beginning of the next line"
 | 
			
		||||
                    },
 | 
			
		||||
                    fix(fixer) {
 | 
			
		||||
                        if (prevToken && nextToken && sourceCode.commentsExistBetween(prevToken, nextToken)) {
 | 
			
		||||
                            return null;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        const start = prevToken ? prevToken.range[1] : semiToken.range[0];
 | 
			
		||||
                        const end = nextToken ? nextToken.range[0] : semiToken.range[1];
 | 
			
		||||
                        const text = (expected === "last") ? ";\n" : "\n;";
 | 
			
		||||
 | 
			
		||||
                        return fixer.replaceTextRange([start, end], text);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            [SELECTOR](node) {
 | 
			
		||||
                if (option === "first" && isLastChild(node)) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                const lastToken = sourceCode.getLastToken(node);
 | 
			
		||||
 | 
			
		||||
                if (astUtils.isSemicolonToken(lastToken)) {
 | 
			
		||||
                    check(lastToken, option);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
 | 
			
		||||
            ForStatement(node) {
 | 
			
		||||
                const firstSemi = node.init && sourceCode.getTokenAfter(node.init, astUtils.isSemicolonToken);
 | 
			
		||||
                const secondSemi = node.test && sourceCode.getTokenAfter(node.test, astUtils.isSemicolonToken);
 | 
			
		||||
 | 
			
		||||
                if (firstSemi) {
 | 
			
		||||
                    check(firstSemi, "last");
 | 
			
		||||
                }
 | 
			
		||||
                if (secondSemi) {
 | 
			
		||||
                    check(secondSemi, "last");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user