1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- 'use strict';
- const {isEmptyNode} = require('./ast/index.js');
- const getSwitchCaseHeadLocation = require('./utils/get-switch-case-head-location.js');
- const MESSAGE_ID_ERROR = 'no-useless-switch-case/error';
- const MESSAGE_ID_SUGGESTION = 'no-useless-switch-case/suggestion';
- const messages = {
- [MESSAGE_ID_ERROR]: 'Useless case in switch statement.',
- [MESSAGE_ID_SUGGESTION]: 'Remove this case.',
- };
- const isEmptySwitchCase = node => node.consequent.every(node => isEmptyNode(node));
- /** @param {import('eslint').Rule.RuleContext} context */
- const create = context => ({
- * 'SwitchStatement[cases.length>1]'(switchStatement) {
- const {cases} = switchStatement;
- // TypeScript allows multiple `default` cases
- const defaultCases = cases.filter(switchCase => switchCase.test === null);
- if (defaultCases.length !== 1) {
- return;
- }
- const [defaultCase] = defaultCases;
- // We only check cases where the last case is the `default` case
- if (defaultCase !== cases[cases.length - 1]) {
- return;
- }
- const uselessCases = [];
- for (let index = cases.length - 2; index >= 0; index--) {
- const node = cases[index];
- if (isEmptySwitchCase(node)) {
- uselessCases.unshift(node);
- } else {
- break;
- }
- }
- for (const node of uselessCases) {
- yield {
- node,
- loc: getSwitchCaseHeadLocation(node, context.getSourceCode()),
- messageId: MESSAGE_ID_ERROR,
- suggest: [
- {
- messageId: MESSAGE_ID_SUGGESTION,
- /** @param {import('eslint').Rule.RuleFixer} fixer */
- fix: fixer => fixer.remove(node),
- },
- ],
- };
- }
- },
- });
- /** @type {import('eslint').Rule.RuleModule} */
- module.exports = {
- create,
- meta: {
- type: 'suggestion',
- docs: {
- description: 'Disallow useless case in switch statements.',
- },
- hasSuggestions: true,
- messages,
- },
- };
|