区分方法和属性
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
.
问题:
我目前正在改进 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
.