123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /**
- * @fileoverview Require use of Services.* rather than getService.
- *
- * 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");
- let servicesInterfaceMap = helpers.servicesData;
- module.exports = {
- meta: {
- docs: {
- url:
- "https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/use-services.html",
- },
- // fixable: "code",
- type: "suggestion",
- },
- create(context) {
- return {
- CallExpression(node) {
- if (!node.callee || !node.callee.property) {
- return;
- }
- if (
- node.callee.property.type == "Identifier" &&
- node.callee.property.name == "defineLazyServiceGetter" &&
- node.arguments.length == 4 &&
- node.arguments[3].type == "Literal" &&
- node.arguments[3].value in servicesInterfaceMap
- ) {
- let serviceName = servicesInterfaceMap[node.arguments[3].value];
- context.report(
- node,
- `Use Services.${serviceName} rather than defineLazyServiceGetter.`
- );
- return;
- }
- if (
- node.callee.property.type == "Identifier" &&
- node.callee.property.name == "defineLazyServiceGetters" &&
- node.arguments.length == 2 &&
- node.arguments[1].type == "ObjectExpression"
- ) {
- for (let property of node.arguments[1].properties) {
- if (
- property.value.type == "ArrayExpression" &&
- property.value.elements.length == 2 &&
- property.value.elements[1].value in servicesInterfaceMap
- ) {
- let serviceName =
- servicesInterfaceMap[property.value.elements[1].value];
- context.report(
- property.value,
- `Use Services.${serviceName} rather than defineLazyServiceGetters.`
- );
- }
- }
- return;
- }
- if (
- node.callee.property.type != "Identifier" ||
- node.callee.property.name != "getService" ||
- node.arguments.length != 1 ||
- !node.arguments[0].property ||
- node.arguments[0].property.type != "Identifier" ||
- !node.arguments[0].property.name ||
- !(node.arguments[0].property.name in servicesInterfaceMap)
- ) {
- return;
- }
- let serviceName = servicesInterfaceMap[node.arguments[0].property.name];
- context.report({
- node,
- message: `Use Services.${serviceName} rather than getService().`,
- // This is not enabled by default as for mochitest plain tests we
- // would need to replace with `SpecialPowers.Services.${serviceName}`.
- // At the moment we do not have an easy way to detect that.
- // fix(fixer) {
- // let sourceCode = context.getSourceCode();
- // return fixer.replaceTextRange(
- // [
- // sourceCode.getFirstToken(node.callee).range[0],
- // sourceCode.getLastToken(node).range[1],
- // ],
- // `Services.${serviceName}`
- // );
- // },
- });
- },
- };
- },
- };
|