From 3a42557ab3d5bbcda1a6966676b4bcd361c33e8b Mon Sep 17 00:00:00 2001 From: Vicente Jr Yuchitcho Date: Fri, 27 Jan 2017 17:00:08 +1100 Subject: [PATCH] Add path sibling traversal methods * getPrevSibling * getNextSibling * getAllNextSiblings * getAllPrevSiblings --- packages/babel-traverse/src/path/family.js | 31 ++++++++++++++++++++++ packages/babel-traverse/test/family.js | 22 +++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index d17ae8aed709..27d12ada75d9 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -67,6 +67,37 @@ export function getSibling(key) { }); } +export function getPrevSibling() { + return this.getSibling(this.key - 1); +} + +export function getNextSibling() { + return this.getSibling(this.key + 1); +} + +export function getAllNextSiblings() { + let _key = this.key; + let sibling = this.getSibling(++_key); + const siblings = []; + while (sibling.node) { + siblings.push(sibling); + sibling = this.getSibling(++_key); + } + return siblings; +} + +export function getAllPrevSiblings() { + let _key = this.key; + let sibling = this.getSibling(--_key); + const siblings = []; + 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("."); diff --git a/packages/babel-traverse/test/family.js b/packages/babel-traverse/test/family.js index 6e9a497df746..424de1198bca 100644 --- a/packages/babel-traverse/test/family.js +++ b/packages/babel-traverse/test/family.js @@ -52,6 +52,28 @@ 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() {}"); + let sibling = {}; + traverse(ast, { + VariableDeclaration(path) { + sibling = path.getSibling(path.key); + } + }); + + it("should return traverse sibling nodes", function () { + assert.ok(sibling.getNextSibling().node, "has property node"); + assert.ok(sibling.getNextSibling().getPrevSibling().node, "has property node"); + assert.equal(!!sibling.getPrevSibling().node, false, "out of scope"); + assert.equal(!!sibling.getNextSibling().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(sibling.getNextSibling().getAllPrevSiblings().length, "Has prev sibling"); + }); }); });