• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * @fileoverview Rule to flag bitwise identifiers
3 * @author Nicholas C. Zakas
4 */
5
6"use strict";
7
8/*
9 *
10 * Set of bitwise operators.
11 *
12 */
13const BITWISE_OPERATORS = [
14    "^", "|", "&", "<<", ">>", ">>>",
15    "^=", "|=", "&=", "<<=", ">>=", ">>>=",
16    "~"
17];
18
19//------------------------------------------------------------------------------
20// Rule Definition
21//------------------------------------------------------------------------------
22
23module.exports = {
24    meta: {
25        type: "suggestion",
26
27        docs: {
28            description: "disallow bitwise operators",
29            category: "Stylistic Issues",
30            recommended: false,
31            url: "https://eslint.org/docs/rules/no-bitwise"
32        },
33
34        schema: [
35            {
36                type: "object",
37                properties: {
38                    allow: {
39                        type: "array",
40                        items: {
41                            enum: BITWISE_OPERATORS
42                        },
43                        uniqueItems: true
44                    },
45                    int32Hint: {
46                        type: "boolean",
47                        default: false
48                    }
49                },
50                additionalProperties: false
51            }
52        ],
53
54        messages: {
55            unexpected: "Unexpected use of '{{operator}}'."
56        }
57    },
58
59    create(context) {
60        const options = context.options[0] || {};
61        const allowed = options.allow || [];
62        const int32Hint = options.int32Hint === true;
63
64        /**
65         * Reports an unexpected use of a bitwise operator.
66         * @param   {ASTNode} node Node which contains the bitwise operator.
67         * @returns {void}
68         */
69        function report(node) {
70            context.report({ node, messageId: "unexpected", data: { operator: node.operator } });
71        }
72
73        /**
74         * Checks if the given node has a bitwise operator.
75         * @param   {ASTNode} node The node to check.
76         * @returns {boolean} Whether or not the node has a bitwise operator.
77         */
78        function hasBitwiseOperator(node) {
79            return BITWISE_OPERATORS.indexOf(node.operator) !== -1;
80        }
81
82        /**
83         * Checks if exceptions were provided, e.g. `{ allow: ['~', '|'] }`.
84         * @param   {ASTNode} node The node to check.
85         * @returns {boolean} Whether or not the node has a bitwise operator.
86         */
87        function allowedOperator(node) {
88            return allowed.indexOf(node.operator) !== -1;
89        }
90
91        /**
92         * Checks if the given bitwise operator is used for integer typecasting, i.e. "|0"
93         * @param   {ASTNode} node The node to check.
94         * @returns {boolean} whether the node is used in integer typecasting.
95         */
96        function isInt32Hint(node) {
97            return int32Hint && node.operator === "|" && node.right &&
98              node.right.type === "Literal" && node.right.value === 0;
99        }
100
101        /**
102         * Report if the given node contains a bitwise operator.
103         * @param   {ASTNode} node The node to check.
104         * @returns {void}
105         */
106        function checkNodeForBitwiseOperator(node) {
107            if (hasBitwiseOperator(node) && !allowedOperator(node) && !isInt32Hint(node)) {
108                report(node);
109            }
110        }
111
112        return {
113            AssignmentExpression: checkNodeForBitwiseOperator,
114            BinaryExpression: checkNodeForBitwiseOperator,
115            UnaryExpression: checkNodeForBitwiseOperator
116        };
117
118    }
119};
120