UNPKG

1.82 kBJavaScriptView Raw
1/**
2 * @fileoverview Rule to flag use of an lexical declarations inside a case clause
3 * @author Erik Arvidsson
4 */
5"use strict";
6
7//------------------------------------------------------------------------------
8// Rule Definition
9//------------------------------------------------------------------------------
10
11module.exports = {
12 meta: {
13 docs: {
14 description: "disallow lexical declarations in case clauses",
15 category: "Best Practices",
16 recommended: true,
17 url: "https://eslint.org/docs/rules/no-case-declarations"
18 },
19
20 schema: [],
21
22 messages: {
23 unexpected: "Unexpected lexical declaration in case block."
24 }
25 },
26
27 create(context) {
28
29 /**
30 * Checks whether or not a node is a lexical declaration.
31 * @param {ASTNode} node A direct child statement of a switch case.
32 * @returns {boolean} Whether or not the node is a lexical declaration.
33 */
34 function isLexicalDeclaration(node) {
35 switch (node.type) {
36 case "FunctionDeclaration":
37 case "ClassDeclaration":
38 return true;
39 case "VariableDeclaration":
40 return node.kind !== "var";
41 default:
42 return false;
43 }
44 }
45
46 return {
47 SwitchCase(node) {
48 for (let i = 0; i < node.consequent.length; i++) {
49 const statement = node.consequent[i];
50
51 if (isLexicalDeclaration(statement)) {
52 context.report({
53 node,
54 messageId: "unexpected"
55 });
56 }
57 }
58 }
59 };
60
61 }
62};