Javascript 区分方法和属性
问题: 我目前正在改进Javascript 区分方法和属性,javascript,testing,jasmine,eslint,static-code-analysis,Javascript,Testing,Jasmine,Eslint,Static Code Analysis,问题: 我目前正在改进eslint插件jasmine包的性能,试图在未调用匹配器时处理另一个无效的jasmineexpect()用法: expect(true).toBeDefined; 有效用法: expect(true).toBeDefined(); 我已经非常接近了-我可以确定expect()上有一个成员表达式: 但是在有效和无效情况下,node.property都属于标识符类型: Node { type: 'Identifier', start: 13, end: 24,
eslint插件jasmine
包的性能,试图在未调用匹配器时处理另一个无效的jasmineexpect()
用法:
expect(true).toBeDefined;
有效用法:
expect(true).toBeDefined();
我已经非常接近了-我可以确定expect()
上有一个成员表达式:
但是在有效和无效情况下,node.property
都属于标识符类型:
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
,并检查被调用者是否是名为expect
的Identifier
。然后检查它的祖父母是MemberExpression
还是另一个CallExpression
有趣,感谢您的关注!实际上,我必须转到父级的父级并检查类型。node.parent.parent.type
将是CallExpression
,如果这是方法调用,ExpressionStatement
如果是属性。。这是您的意思吗?请注意,在这两种情况下,node.parent.type
仍然是MemberExpression
。()是的,您必须转到祖父母节点。很抱歉。好的,这是有效的,包括测试和发送公关。谢谢。
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' }