Skip to content

Commit b7109e7

Browse files
committed
BaseNode.clone()
1 parent fb23d5c commit b7109e7

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

fluent-syntax/src/ast.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,23 @@ class BaseNode {
5151
}
5252
return true;
5353
}
54+
55+
clone() {
56+
function visit(value) {
57+
if (value instanceof BaseNode) {
58+
return value.clone();
59+
}
60+
if (Array.isArray(value)) {
61+
return value.map(visit);
62+
}
63+
return value;
64+
}
65+
const clone = Object.create(this);
66+
for (const prop of Object.keys(this)) {
67+
clone[prop] = visit(this[prop]);
68+
}
69+
return clone;
70+
}
5471
}
5572

5673
function scalars_equal(thisVal, otherVal, ignoredFields) {

fluent-syntax/test/ast_test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ suite("BaseNode.equals", function() {
1313
const thisNode = new AST.Identifier("name");
1414
const otherNode = new AST.Identifier("name");
1515
assert.strictEqual(thisNode.equals(otherNode), true);
16+
assert.strictEqual(thisNode.equals(thisNode.clone()), true);
17+
assert.notStrictEqual(thisNode, thisNode.clone());
1618
});
1719
test("Node.type", function() {
1820
const thisNode = new AST.Identifier("name");
@@ -54,6 +56,8 @@ suite("BaseNode.equals", function() {
5456
assert.strictEqual(thisNode.equals(otherNode, ['span', 'comment']), true);
5557
assert.strictEqual(thisNode.value.equals(otherNode.value), true);
5658
assert.strictEqual(thisNode.value.equals(otherNode.value, []), false);
59+
assert.strictEqual(thisRes.equals(thisRes.clone(), []), true);
60+
assert.notStrictEqual(thisRes, thisRes.clone());
5761
});
5862
test("Attributes without order", function() {
5963
const thisRes = this.parser.parse(ftl`

0 commit comments

Comments
 (0)