Skip to content

Commit

Permalink
Make isReferenced return false for method parameter name (babel#11089)
Browse files Browse the repository at this point in the history
* Change isReferenced to return false for object/class method parameter names.

* use indexOf instead of for-of loop

* replace `.indexOf` check with `.includes` and assume `parent.params` exists

Co-Authored-By: Justin Ridgewell <justin@ridgewell.name>

* check .params within case block for ClassMethod/ClassPrivateMethod/ObjectMethod only

* add comment clarifying that case clause fall-through is intentional

Co-authored-by: Justin Ridgewell <justin@ridgewell.name>
  • Loading branch information
2 people authored and rajasekarm committed Feb 17, 2020
1 parent d0bfbf7 commit f8506c5
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 5 deletions.
16 changes: 11 additions & 5 deletions packages/babel-types/src/validators/isReferenced.js
Expand Up @@ -45,6 +45,17 @@ export default function isReferenced(
case "PrivateName":
return false;

// no: class { NODE() {} }
// yes: class { [NODE]() {} }
// no: class { foo(NODE) {} }
case "ClassMethod":
case "ClassPrivateMethod":
case "ObjectMethod":
if (parent.params.includes(node)) {
return false;
}
// Fall-through to next case clause to check whether the node is the method's name.

// yes: { [NODE]: "" }
// no: { NODE: "" }
// depends: { NODE }
Expand All @@ -55,11 +66,6 @@ export default function isReferenced(
// yes: class { key = NODE; }
case "ClassProperty":
case "ClassPrivateProperty":
// no: class { NODE() {} }
// yes: class { [NODE]() {} }
case "ClassMethod":
case "ClassPrivateMethod":
case "ObjectMethod":
if (parent.key === node) {
return !!parent.computed;
}
Expand Down
68 changes: 68 additions & 0 deletions packages/babel-types/test/validators.js
Expand Up @@ -179,6 +179,74 @@ describe("validators", function() {
expect(t.isReferenced(node, parent)).toBe(true);
});
});

describe("ObjectMethod", function() {
it("returns false if node is method key", function() {
const node = t.identifier("A");
const parent = t.objectMethod("method", node, [], t.blockStatement([]));

expect(t.isReferenced(node, parent)).toBe(false);
});

it("returns true if node is computed method key", function() {
const node = t.identifier("A");
const parent = t.objectMethod(
"method",
node,
[],
t.blockStatement([]),
true,
);

expect(t.isReferenced(node, parent)).toBe(true);
});

it("returns false if node is method param", function() {
const node = t.identifier("A");
const parent = t.objectMethod(
"method",
t.identifier("foo"),
[node],
t.blockStatement([]),
);

expect(t.isReferenced(node, parent)).toBe(false);
});
});

describe("ClassMethod", function() {
it("returns false if node is method key", function() {
const node = t.identifier("A");
const parent = t.classMethod("method", node, [], t.blockStatement([]));

expect(t.isReferenced(node, parent)).toBe(false);
});

it("returns true if node is computed method key", function() {
const node = t.identifier("A");
const parent = t.classMethod(
"method",
node,
[],
t.blockStatement([]),
true,
);

expect(t.isReferenced(node, parent)).toBe(true);
});

it("returns false if node is method param", function() {
const node = t.identifier("A");
const parent = t.classMethod(
"method",
t.identifier("foo"),
[node],
t.blockStatement([]),
);

expect(t.isReferenced(node, parent)).toBe(false);
});
});
});

describe("isBinding", function() {
Expand Down

0 comments on commit f8506c5

Please sign in to comment.