tools: fix bugs in prefer-primordials linter rule

The ESLint rule would repport false positive if code is using an
identifier that happens to have the same name as a primordials member.

PR-URL: https://github.com/nodejs/node/pull/42010
Reviewed-By: Shingo Inoue <leko.noor@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
Antoine du Hamel 2022-02-18 19:42:02 +01:00 committed by GitHub
parent 68c4b8d56d
commit 6700b5c9e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 2 deletions

View File

@ -99,6 +99,34 @@ new RuleTester({
`,
options: [{ name: 'Function' }],
},
{
code: 'function identifier() {}',
options: [{ name: 'identifier' }]
},
{
code: 'function* identifier() {}',
options: [{ name: 'identifier' }]
},
{
code: 'class identifier {}',
options: [{ name: 'identifier' }]
},
{
code: 'new class { identifier(){} }',
options: [{ name: 'identifier' }]
},
{
code: 'const a = { identifier: \'4\' }',
options: [{ name: 'identifier' }]
},
{
code: 'identifier:{const a = 4}',
options: [{ name: 'identifier' }]
},
{
code: 'switch(0){case identifier:}',
options: [{ name: 'identifier' }]
},
],
invalid: [
{

View File

@ -57,8 +57,18 @@ function getDestructuringAssignmentParent(scope, node) {
return declaration.defs[0].node.init;
}
const identifierSelector =
'[type!=VariableDeclarator][type!=MemberExpression]>Identifier';
const parentSelectors = [
// We want to select identifiers that refer to other references, not the ones
// that create a new reference.
'ClassDeclaration',
'FunctionDeclaration',
'LabeledStatement',
'MemberExpression',
'MethodDefinition',
'SwitchCase',
'VariableDeclarator',
];
const identifierSelector = parentSelectors.map((selector) => `[type!=${selector}]`).join('') + '>Identifier';
module.exports = {
meta: {
@ -90,6 +100,11 @@ module.exports = {
reported = new Set();
},
[identifierSelector](node) {
if (node.parent.type === 'Property' && node.parent.key === node) {
// If the identifier is the key for this property declaration, it
// can't be referring to a primordials member.
return;
}
if (reported.has(node.range[0])) {
return;
}