Preserve null in babel-types' clone and deepClone. (#4853)

* Preserve null in babel-types' clone and deepClone.
* Also respect undefined when cloning.
* Updating last test to reflect original test case "[,0]"
This commit is contained in:
Nikolai Tillmann
2016-11-17 05:52:04 -08:00
committed by Henry Zhu
parent e6901792a1
commit efefe828f9
2 changed files with 71 additions and 0 deletions

View File

@@ -259,6 +259,7 @@ export function ensureBlock(node: Object, key: string = "body"): Object {
*/
export function clone(node: Object): Object {
if (!node) return node;
let newNode = {};
for (let key in node) {
if (key[0] === "_") continue;
@@ -283,6 +284,7 @@ export function cloneWithoutLoc(node: Object): Object {
*/
export function cloneDeep(node: Object): Object {
if (!node) return node;
let newNode = {};
for (let key in node) {

View File

@@ -0,0 +1,69 @@
let t = require("../lib");
let assert = require("assert");
let parse = require("babylon").parse;
suite("cloning", function () {
suite("clone", function () {
it("should handle undefined", function () {
let node = undefined;
let cloned = t.clone(node);
assert(cloned === undefined);
});
it("should handle null", function () {
let node = null;
let cloned = t.clone(node);
assert(cloned === null);
});
it("should handle simple cases", function () {
let node = t.arrayExpression([null, t.identifier("a")]);
let cloned = t.clone(node);
assert(node !== cloned);
assert(t.isNodesEquivalent(node, cloned) === true);
});
});
suite("cloneDeep", function () {
it("should handle undefined", function () {
let node = undefined;
let cloned = t.cloneDeep(node);
assert(cloned === undefined);
});
it("should handle null", function () {
let node = null;
let cloned = t.cloneDeep(node);
assert(cloned === null);
});
it("should handle simple cases", function () {
let node = t.arrayExpression([null, t.identifier("a")]);
let cloned = t.cloneDeep(node);
assert(node !== cloned);
assert(t.isNodesEquivalent(node, cloned) === true);
});
it("should handle full programs", function () {
let node = parse("1 + 1");
let cloned = t.cloneDeep(node);
assert(node !== cloned);
assert(t.isNodesEquivalent(node, cloned) === true);
});
it("should handle complex programs", function () {
let program = "'use strict'; function lol() { wow();return 1; }";
let node = parse(program);
let cloned = t.cloneDeep(node);
assert(node !== cloned);
assert(t.isNodesEquivalent(node, cloned) === true);
});
it("should handle missing array element", function () {
let node = parse("[,0]");
let cloned = t.cloneDeep(node);
assert(node !== cloned);
assert(t.isNodesEquivalent(node, cloned) === true);
});
});
});