Add path sibling traversal methods (#5230)
* getPrevSibling * getNextSibling * getAllNextSiblings * getAllPrevSiblings
This commit is contained in:
parent
badce969da
commit
1ba4a3fe5d
@ -57,7 +57,7 @@ export function getCompletionRecords(): Array {
|
||||
return paths;
|
||||
}
|
||||
|
||||
export function getSibling(key) {
|
||||
export function getSibling(key): NodePath {
|
||||
return NodePath.get({
|
||||
parentPath: this.parentPath,
|
||||
parent: this.parent,
|
||||
@ -67,6 +67,36 @@ export function getSibling(key) {
|
||||
});
|
||||
}
|
||||
|
||||
export function getPrevSibling(): NodePath {
|
||||
return this.getSibling(this.key - 1);
|
||||
}
|
||||
|
||||
export function getNextSibling(): NodePath {
|
||||
return this.getSibling(this.key + 1);
|
||||
}
|
||||
|
||||
export function getAllNextSiblings(): Array<NodePath> {
|
||||
let _key = this.key;
|
||||
let sibling:NodePath = this.getSibling(++_key);
|
||||
const siblings:Array<NodePath> = [];
|
||||
while (sibling.node) {
|
||||
siblings.push(sibling);
|
||||
sibling = this.getSibling(++_key);
|
||||
}
|
||||
return siblings;
|
||||
}
|
||||
|
||||
export function getAllPrevSiblings(): Array<NodePath> {
|
||||
let _key = this.key;
|
||||
let sibling:NodePath = this.getSibling(--_key);
|
||||
const siblings:Array<NodePath> = [];
|
||||
while (sibling.node) {
|
||||
siblings.push(sibling);
|
||||
sibling = this.getSibling(--_key);
|
||||
}
|
||||
return siblings;
|
||||
}
|
||||
|
||||
export function get(key: string, context?: boolean | TraversalContext): NodePath {
|
||||
if (context === true) context = this.context;
|
||||
const parts = key.split(".");
|
||||
|
||||
@ -52,6 +52,31 @@ describe("path/family", function () {
|
||||
assert.strictEqual(outerNodes[id], outerPaths[id].node, "nodes match");
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
describe("getSibling", function () {
|
||||
const ast = parse("var a = 1, {b} = c, [d] = e; function f() {} function g() {}");
|
||||
let sibling = {}, lastSibling = {};
|
||||
traverse(ast, {
|
||||
VariableDeclaration(path) {
|
||||
sibling = path.getSibling(path.key);
|
||||
lastSibling = sibling.getNextSibling().getNextSibling();
|
||||
}
|
||||
});
|
||||
|
||||
it("should return traverse sibling nodes", function () {
|
||||
assert.ok(sibling.getNextSibling().node, "has property node");
|
||||
assert.ok(lastSibling.getPrevSibling().node, "has property node");
|
||||
assert.equal(!!sibling.getPrevSibling().node, false, "out of scope");
|
||||
assert.equal(!!lastSibling.getNextSibling().node, false, "out of scope");
|
||||
});
|
||||
|
||||
it("should return all preceding and succeeding sibling nodes", function () {
|
||||
assert.ok(sibling.getAllNextSiblings().length, "Has next sibling");
|
||||
assert.ok(lastSibling.getAllPrevSiblings().length, "Has prev sibling");
|
||||
assert.equal(sibling.getAllNextSiblings().length, 2, "Has 2 succeeding sibling");
|
||||
assert.equal(lastSibling.getAllPrevSiblings().length, 2, "Has 2 preceeding sibling");
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user