| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | /** * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */"use strict";const helpers = require("../helpers");function findStatement(node) {  while (node && node.type !== "ExpressionStatement") {    node = node.parent;  }  return node;}function isIdentifier(node, id) {  return node && node.type === "Identifier" && node.name === id;}module.exports = {  meta: {    docs: {      url:        "https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/reject-multiple-getters-calls.html",    },    messages: {      rejectMultipleCalls:        "ChromeUtils.defineESModuleGetters is already called for {{target}} in the same context. Please merge those calls",    },    type: "suggestion",  },  create(context) {    const parentToTargets = new Map();    return {      CallExpression(node) {        let callee = node.callee;        if (          callee.type === "MemberExpression" &&          isIdentifier(callee.object, "ChromeUtils") &&          isIdentifier(callee.property, "defineESModuleGetters")        ) {          const stmt = findStatement(node);          if (!stmt) {            return;          }          let target;          try {            target = helpers.getASTSource(node.arguments[0]);          } catch (e) {            return;          }          const parent = stmt.parent;          let targets;          if (parentToTargets.has(parent)) {            targets = parentToTargets.get(parent);          } else {            targets = new Set();            parentToTargets.set(parent, targets);          }          if (targets.has(target)) {            context.report({              node,              messageId: "rejectMultipleCalls",              data: { target },            });          }          targets.add(target);        }      },    };  },};
 |