Skip to content

Commit 15f5c7c

Browse files
authored
fix: forward traversal step.args to visitors (#20253)
1 parent 5a1a534 commit 15f5c7c

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

lib/linter/source-code-traverser.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ const vk = require("eslint-visitor-keys");
1717
//-----------------------------------------------------------------------------
1818

1919
/**
20-
* @import { ESQueryParsedSelector } from "./esquery.js";
2120
* @import { Language, SourceCode } from "@eslint/core";
21+
* @import { ESQueryOptions } from "esquery";
22+
* @import { ESQueryParsedSelector } from "./esquery.js";
2223
* @import { SourceCodeVisitor } from "./source-code-visitor.js";
2324
*/
2425

@@ -47,11 +48,10 @@ class ESQueryHelper {
4748
* Creates a new instance.
4849
* @param {SourceCodeVisitor} visitor The visitor containing the functions to call.
4950
* @param {ESQueryOptions} esqueryOptions `esquery` options for traversing custom nodes.
50-
* @returns {NodeEventGenerator} new instance
5151
*/
5252
constructor(visitor, esqueryOptions) {
5353
/**
54-
* The emitter to use during traversal.
54+
* The visitor to use during traversal.
5555
* @type {SourceCodeVisitor}
5656
*/
5757
this.visitor = visitor;
@@ -288,7 +288,10 @@ class SourceCodeTraverser {
288288
false,
289289
)
290290
.forEach(selector => {
291-
visitor.callSync(selector, step.target);
291+
visitor.callSync(
292+
selector,
293+
...(step.args ?? [step.target]),
294+
);
292295
});
293296
currentAncestry.unshift(step.target);
294297
} else {
@@ -300,7 +303,10 @@ class SourceCodeTraverser {
300303
true,
301304
)
302305
.forEach(selector => {
303-
visitor.callSync(selector, step.target);
306+
visitor.callSync(
307+
selector,
308+
...(step.args ?? [step.target]),
309+
);
304310
});
305311
}
306312
} catch (err) {

tests/lib/linter/source-code-traverser.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,47 @@ describe("SourceCodeTraverser", () => {
232232
);
233233
});
234234

235+
it("should pass step.args to visitor", () => {
236+
const dummyParent = { type: "Parent", value: 0 };
237+
const dummyNode = { type: "Foo", value: 1 };
238+
const sourceCode = {
239+
ast: dummyNode,
240+
visitorKeys: vk.KEYS,
241+
*traverse() {
242+
yield {
243+
kind: STEP_KIND_VISIT,
244+
target: dummyNode,
245+
phase: 1,
246+
args: [dummyNode, dummyParent],
247+
};
248+
yield {
249+
kind: STEP_KIND_VISIT,
250+
target: dummyNode,
251+
phase: 2,
252+
args: [dummyNode, dummyParent],
253+
};
254+
},
255+
};
256+
257+
traverser.traverseSync(sourceCode, visitor);
258+
259+
assert(visitor.callSync.calledTwice);
260+
assert(
261+
visitor.callSync.firstCall.calledWith(
262+
"Foo",
263+
dummyNode,
264+
dummyParent,
265+
),
266+
);
267+
assert(
268+
visitor.callSync.secondCall.calledWith(
269+
"Foo:exit",
270+
dummyNode,
271+
dummyParent,
272+
),
273+
);
274+
});
275+
235276
it("should use provided steps instead of source code traverse", () => {
236277
// Create a source code object with normal traverse behavior
237278
const fooNode = { type: "Foo", value: 1 };

0 commit comments

Comments
 (0)