| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | /** * @fileoverview Simply marks exported symbols as used. Designed for use in * .jsm files only. * * 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";function markArrayElementsAsUsed(context, node, expression) {  if (expression.type != "ArrayExpression") {    context.report({      node,      message: "Unexpected assignment of non-Array to EXPORTED_SYMBOLS",    });    return;  }  for (let element of expression.elements) {    context.markVariableAsUsed(element.value);  }  // Also mark EXPORTED_SYMBOLS as used.  context.markVariableAsUsed("EXPORTED_SYMBOLS");}// Ignore assignments not in the global scope, e.g. where special module// definitions are required due to having different ways of importing files,// e.g. osfile.function isGlobalScope(context) {  return !context.getScope().upper;}module.exports = {  meta: {    docs: {      url:        "https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/mark-exported-symbols-as-used.html",    },    type: "problem",  },  create(context) {    return {      AssignmentExpression(node, parents) {        if (          node.operator === "=" &&          node.left.type === "MemberExpression" &&          node.left.object.type === "ThisExpression" &&          node.left.property.name === "EXPORTED_SYMBOLS" &&          isGlobalScope(context)        ) {          markArrayElementsAsUsed(context, node, node.right);        }      },      VariableDeclaration(node, parents) {        if (!isGlobalScope(context)) {          return;        }        for (let item of node.declarations) {          if (            item.id &&            item.id.type == "Identifier" &&            item.id.name === "EXPORTED_SYMBOLS"          ) {            if (node.kind === "let") {              // The use of 'let' isn't allowed as the lexical scope may die after              // the script executes.              context.report({                node,                message:                  "EXPORTED_SYMBOLS cannot be declared via `let`. Use `var` or `this.EXPORTED_SYMBOLS =`",              });            }            markArrayElementsAsUsed(context, node, item.init);          }        }      },    };  },};
 |