175 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @fileoverview Enforce newlines between operands of ternary expressions
 | 
						|
 * @author Kai Cataldo
 | 
						|
 * @deprecated in ESLint v8.53.0
 | 
						|
 */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
const astUtils = require("./utils/ast-utils");
 | 
						|
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
// Rule Definition
 | 
						|
//------------------------------------------------------------------------------
 | 
						|
 | 
						|
/** @type {import('../shared/types').Rule} */
 | 
						|
module.exports = {
 | 
						|
    meta: {
 | 
						|
        deprecated: true,
 | 
						|
        replacedBy: [],
 | 
						|
        type: "layout",
 | 
						|
 | 
						|
        docs: {
 | 
						|
            description: "Enforce newlines between operands of ternary expressions",
 | 
						|
            recommended: false,
 | 
						|
            url: "https://eslint.org/docs/latest/rules/multiline-ternary"
 | 
						|
        },
 | 
						|
 | 
						|
        schema: [
 | 
						|
            {
 | 
						|
                enum: ["always", "always-multiline", "never"]
 | 
						|
            }
 | 
						|
        ],
 | 
						|
 | 
						|
        messages: {
 | 
						|
            expectedTestCons: "Expected newline between test and consequent of ternary expression.",
 | 
						|
            expectedConsAlt: "Expected newline between consequent and alternate of ternary expression.",
 | 
						|
            unexpectedTestCons: "Unexpected newline between test and consequent of ternary expression.",
 | 
						|
            unexpectedConsAlt: "Unexpected newline between consequent and alternate of ternary expression."
 | 
						|
        },
 | 
						|
 | 
						|
        fixable: "whitespace"
 | 
						|
    },
 | 
						|
 | 
						|
    create(context) {
 | 
						|
        const sourceCode = context.sourceCode;
 | 
						|
        const option = context.options[0];
 | 
						|
        const multiline = option !== "never";
 | 
						|
        const allowSingleLine = option === "always-multiline";
 | 
						|
 | 
						|
        //--------------------------------------------------------------------------
 | 
						|
        // Public
 | 
						|
        //--------------------------------------------------------------------------
 | 
						|
 | 
						|
        return {
 | 
						|
            ConditionalExpression(node) {
 | 
						|
                const questionToken = sourceCode.getTokenAfter(node.test, astUtils.isNotClosingParenToken);
 | 
						|
                const colonToken = sourceCode.getTokenAfter(node.consequent, astUtils.isNotClosingParenToken);
 | 
						|
 | 
						|
                const firstTokenOfTest = sourceCode.getFirstToken(node);
 | 
						|
                const lastTokenOfTest = sourceCode.getTokenBefore(questionToken);
 | 
						|
                const firstTokenOfConsequent = sourceCode.getTokenAfter(questionToken);
 | 
						|
                const lastTokenOfConsequent = sourceCode.getTokenBefore(colonToken);
 | 
						|
                const firstTokenOfAlternate = sourceCode.getTokenAfter(colonToken);
 | 
						|
 | 
						|
                const areTestAndConsequentOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, firstTokenOfConsequent);
 | 
						|
                const areConsequentAndAlternateOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, firstTokenOfAlternate);
 | 
						|
 | 
						|
                const hasComments = !!sourceCode.getCommentsInside(node).length;
 | 
						|
 | 
						|
                if (!multiline) {
 | 
						|
                    if (!areTestAndConsequentOnSameLine) {
 | 
						|
                        context.report({
 | 
						|
                            node: node.test,
 | 
						|
                            loc: {
 | 
						|
                                start: firstTokenOfTest.loc.start,
 | 
						|
                                end: lastTokenOfTest.loc.end
 | 
						|
                            },
 | 
						|
                            messageId: "unexpectedTestCons",
 | 
						|
                            fix(fixer) {
 | 
						|
                                if (hasComments) {
 | 
						|
                                    return null;
 | 
						|
                                }
 | 
						|
                                const fixers = [];
 | 
						|
                                const areTestAndQuestionOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfTest, questionToken);
 | 
						|
                                const areQuestionAndConsOnSameLine = astUtils.isTokenOnSameLine(questionToken, firstTokenOfConsequent);
 | 
						|
 | 
						|
                                if (!areTestAndQuestionOnSameLine) {
 | 
						|
                                    fixers.push(fixer.removeRange([lastTokenOfTest.range[1], questionToken.range[0]]));
 | 
						|
                                }
 | 
						|
                                if (!areQuestionAndConsOnSameLine) {
 | 
						|
                                    fixers.push(fixer.removeRange([questionToken.range[1], firstTokenOfConsequent.range[0]]));
 | 
						|
                                }
 | 
						|
 | 
						|
                                return fixers;
 | 
						|
                            }
 | 
						|
                        });
 | 
						|
                    }
 | 
						|
 | 
						|
                    if (!areConsequentAndAlternateOnSameLine) {
 | 
						|
                        context.report({
 | 
						|
                            node: node.consequent,
 | 
						|
                            loc: {
 | 
						|
                                start: firstTokenOfConsequent.loc.start,
 | 
						|
                                end: lastTokenOfConsequent.loc.end
 | 
						|
                            },
 | 
						|
                            messageId: "unexpectedConsAlt",
 | 
						|
                            fix(fixer) {
 | 
						|
                                if (hasComments) {
 | 
						|
                                    return null;
 | 
						|
                                }
 | 
						|
                                const fixers = [];
 | 
						|
                                const areConsAndColonOnSameLine = astUtils.isTokenOnSameLine(lastTokenOfConsequent, colonToken);
 | 
						|
                                const areColonAndAltOnSameLine = astUtils.isTokenOnSameLine(colonToken, firstTokenOfAlternate);
 | 
						|
 | 
						|
                                if (!areConsAndColonOnSameLine) {
 | 
						|
                                    fixers.push(fixer.removeRange([lastTokenOfConsequent.range[1], colonToken.range[0]]));
 | 
						|
                                }
 | 
						|
                                if (!areColonAndAltOnSameLine) {
 | 
						|
                                    fixers.push(fixer.removeRange([colonToken.range[1], firstTokenOfAlternate.range[0]]));
 | 
						|
                                }
 | 
						|
 | 
						|
                                return fixers;
 | 
						|
                            }
 | 
						|
                        });
 | 
						|
                    }
 | 
						|
                } else {
 | 
						|
                    if (allowSingleLine && node.loc.start.line === node.loc.end.line) {
 | 
						|
                        return;
 | 
						|
                    }
 | 
						|
 | 
						|
                    if (areTestAndConsequentOnSameLine) {
 | 
						|
                        context.report({
 | 
						|
                            node: node.test,
 | 
						|
                            loc: {
 | 
						|
                                start: firstTokenOfTest.loc.start,
 | 
						|
                                end: lastTokenOfTest.loc.end
 | 
						|
                            },
 | 
						|
                            messageId: "expectedTestCons",
 | 
						|
                            fix: fixer => (hasComments ? null : (
 | 
						|
                                fixer.replaceTextRange(
 | 
						|
                                    [
 | 
						|
                                        lastTokenOfTest.range[1],
 | 
						|
                                        questionToken.range[0]
 | 
						|
                                    ],
 | 
						|
                                    "\n"
 | 
						|
                                )
 | 
						|
                            ))
 | 
						|
                        });
 | 
						|
                    }
 | 
						|
 | 
						|
                    if (areConsequentAndAlternateOnSameLine) {
 | 
						|
                        context.report({
 | 
						|
                            node: node.consequent,
 | 
						|
                            loc: {
 | 
						|
                                start: firstTokenOfConsequent.loc.start,
 | 
						|
                                end: lastTokenOfConsequent.loc.end
 | 
						|
                            },
 | 
						|
                            messageId: "expectedConsAlt",
 | 
						|
                            fix: (fixer => (hasComments ? null : (
 | 
						|
                                fixer.replaceTextRange(
 | 
						|
                                    [
 | 
						|
                                        lastTokenOfConsequent.range[1],
 | 
						|
                                        colonToken.range[0]
 | 
						|
                                    ],
 | 
						|
                                    "\n"
 | 
						|
                                )
 | 
						|
                            )))
 | 
						|
                        });
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        };
 | 
						|
    }
 | 
						|
};
 |