区分方法和属性

Distinguish methods and properties

问题:

我目前正在改进 eslint-plugin-jasmine 包的 valid-expect rule,试图在未调用匹配器时处理另一个无效的 Jasmine expect() 用法:

expect(true).toBeDefined;

有效用法:

expect(true).toBeDefined();

我已经很接近了 - 我可以确定 expect():

上有一个成员表达式
// matcher was not called
MemberExpression: function (node) {
  if (node.object && node.object.callee.name === 'expect') {
    console.log(node.property)
  }
}

但是 node.property 在有效和无效情况下都是 Identifier 类型:

Node {
  type: 'Identifier',
  start: 13,
  end: 24,
  loc: 
   SourceLocation {
     start: Position { line: 1, column: 13 },
     end: Position { line: 1, column: 24 } },
  range: [ 13, 24 ],
  name: 'toBeDefined' }

并且没有明显的迹象表明这是一个 属性 或一个方法。

问题:

如何确定 属性 在 ESLint 中是否可调用?

expect(true).toBeDefined 被解析为 MemberExpression 节点,但 expect(true).toBeDefined() 被解析为 CallExpression。我不是真的 100% 确定为什么会这样,但在第二种情况下,似乎认为整个语句直到左括号是一个 CallExpression,我希望有两个单独的 CallExpression,但事实似乎并非如此。

所以你可以做的是听 CallExpression 并检查被叫方是 Identifier,名字是 expect。然后检查它的祖父母是 MemberExpression 还是另一个 CallExpression.