es-discuss Digest, Vol 94, Issue 84

Isiah Meadows impinball at gmail.com
Thu Dec 25 00:56:36 PST 2014


That search (`/(["']?)enumerable\1\s:\strue/`) would miss quite a few
intentional cases as well, because IIRC Object.create and friends default
to false for each of the descriptors, enumerable, configurable, and
writable. Maybe, that could be better run with this ast-types visitor or
similar? Note that I typed this on a phone, and thus is untested and
possibly with a lot of typos in it as well, given it's easy to miss a key.

```js
// count = 0;
visitCallExpression: function (path) {
  var node = path.node;
  function eqish(a, b) {
    return Object.keys(b)
    .every(function (key) {
      if (!(key in a)) return false;
      var propA = a[key], propB = b[key];
      if (typeof propB !== 'object' ||
          propA === null)
        return propA !== propB ||
          propA !== propA;  // NaN
      return eqish(propA, propB);
    });
  }
  function ident(str) {
    return {type: 'Identifier', name: str};
  }
  function literal(val) {
    return {type: 'Literal', value: val};
  }
  function c(str) {
    return {
      type: 'MemberExpression',
      object: ident('Object'),
      property: ident(str),
      computed: false
    };
  }
  function helper(args) {
    var cond = (args.length <= 1 ||
      args[1].type !== 'ObjectExpression' ||
      !args.some(function (node) {
        return eqish(node, stringEnum) ||
          eqish(node, identEnum);
      }) ||
      !args.every(function (node) {
        return eqish(stringEnumish, node) ||
          eqish(identEnumish, node);
      }));
      if (cond) count++
      return cond;
  }
  var stringEnum = {
    type: 'Property',
    key: literal('enumerable'),
    value: literal(false),
    kind: 'init',
  };
  var identEnum = {
    type: 'Property',
    key: ident('enumerable'),
    value: literal(false),
    kind: 'init',
  };
  var stringEnumish = {
    type: 'Property',
    key: literal('enumerable'),
    value: literal(false),
    kind: 'init',
  };
  var identEnumish = {
    type: 'Property',
    key: ident('enumerable'),
    value: literal(false),
    kind: 'init',
  };
  var O_dPs = c('defineProperties');
  var O_c = c('create')
  var O_dP = c('defineProperty');
  var callee = node.callee;
  var args = node.arguments;
  if (eqish(callee, O_dP))
    return helper(args);
  if (eqish(callee, O_dPs) ||
      eqish(callee, O_c))
    return args.every(function (spec) {
      return helper(Object.keys(spec));
    });
  return false;
},
```
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20141225/2505fe83/attachment.html>


More information about the es-discuss mailing list