Bug 1464548: Part 2 - Add ESLint support for defineLazyGlobalGetters. r?standard8 draft
authorKris Maglione <maglione.k@gmail.com>
Fri, 25 May 2018 22:27:00 -0700
changeset 800182 4897eb7a9541c063f07c96b21fd2c22f7e03a93e
parent 800181 b2e725c1d21f1cbbdec5d78f13b81c1aa730c1d0
child 800183 2b8aeedcac0dfc0a59f50ce8e1d7ff1812dd4b49
push id111294
push usermaglione.k@gmail.com
push dateSat, 26 May 2018 05:34:03 +0000
reviewersstandard8
bugs1464548
milestone62.0a1
Bug 1464548: Part 2 - Add ESLint support for defineLazyGlobalGetters. r?standard8 MozReview-Commit-ID: 38hk1MquFrg
tools/lint/eslint/eslint-plugin-mozilla/lib/helpers.js
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/helpers.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/helpers.js
@@ -32,16 +32,17 @@ const callExpressionDefinitions = [
   /^DevToolsUtils\.defineLazyModuleGetter\(this, "(\w+)"/,
   /^DevToolsUtils\.defineLazyGetter\(this, "(\w+)"/,
   /^Object\.defineProperty\(this, "(\w+)"/,
   /^Reflect\.defineProperty\(this, "(\w+)"/,
   /^this\.__defineGetter__\("(\w+)"/
 ];
 
 const callExpressionMultiDefinitions = [
+  "XPCOMUtils.defineLazyGlobalGetters(this,",
   "XPCOMUtils.defineLazyModuleGetters(this,",
   "XPCOMUtils.defineLazyServiceGetters(this,"
 ];
 
 const imports = [
   /^(?:Cu|Components\.utils|ChromeUtils)\.import\(".*\/((.*?)\.jsm?)"(?:, this)?\)/
 ];
 
@@ -301,21 +302,28 @@ module.exports = {
     for (let reg of callExpressionDefinitions) {
       let match = source.match(reg);
       if (match) {
         return [{ name: match[1], writable: true, explicit: true }];
       }
     }
 
     if (callExpressionMultiDefinitions.some(expr => source.startsWith(expr)) &&
-        node.expression.arguments[1] &&
-        node.expression.arguments[1].type === "ObjectExpression") {
-      return node.expression.arguments[1].properties
-                 .map(p => ({ name: p.type === "Property" && p.key.name, writable: true, explicit: true }))
-                 .filter(g => g.name);
+        node.expression.arguments[1]) {
+      let arg = node.expression.arguments[1];
+      if (arg.type === "ObjectExpression") {
+        return arg.properties
+                  .map(p => ({ name: p.type === "Property" && p.key.name, writable: true, explicit: true }))
+                  .filter(g => g.name);
+      }
+      if (arg.type === "ArrayExpression") {
+        return arg.elements
+                  .map(p => ({ name: p.type === "Literal" && p.value, writable: true, explicit: true }))
+                  .filter(g => typeof g.name == "string");
+      }
     }
 
     if (node.expression.callee.type == "MemberExpression" &&
         node.expression.callee.property.type == "Identifier" &&
         node.expression.callee.property.name == "defineLazyScriptGetter") {
       // The case where we have a single symbol as a string has already been
       // handled by the regexp, so we have an array of symbols here.
       return node.expression.arguments[1].elements.map(n => ({ name: n.value, writable: true, explicit: true }));