Added cloneNode

This commit is contained in:
Ron Buckton
2015-07-10 14:17:35 -07:00
parent b3e9c25e84
commit 3fe0f31e17
5 changed files with 437 additions and 49 deletions

View File

@@ -537,6 +537,7 @@ function generateFactory(outputFile: string) {
writer.writeLine();
writer.increaseIndent();
writeCreateAndUpdateFunctions();
writeCloneFunction();
writer.decreaseIndent();
writer.write(`}`);
writer.writeLine();
@@ -726,6 +727,63 @@ function generateFactory(outputFile: string) {
writer.writeLine();
}
function writeCloneFunction() {
writer.write(`export function cloneNode<TNode extends Node>(node: TNode): TNode;`);
writer.writeLine();
writer.write(`export function cloneNode(node: Node): Node {`);
writer.writeLine();
writer.increaseIndent();
writer.write(`if (!node) {`);
writer.writeLine();
writer.increaseIndent();
writer.write(`return node;`);
writer.writeLine();
writer.decreaseIndent();
writer.write(`}`);
writer.writeLine();
writer.write(`switch (node.kind) {`);
writer.writeLine();
writer.increaseIndent();
for (let syntaxNode of syntax) {
if (!syntaxNode.options.create) {
continue;
}
writer.write(`case SyntaxKind.${syntaxNode.kindName}:`);
writer.writeLine();
writer.increaseIndent();
writer.write(`return factory.create${syntaxNode.kindName}(`);
for (let i = 0; i < syntaxNode.members.length; ++i) {
if (i > 0) {
writer.write(`, `);
}
let member = syntaxNode.members[i];
writer.write(`(<${syntaxNode.typeName}>node).${member.propertyName}`);
}
writer.write(`);`);
writer.writeLine();
writer.decreaseIndent();
}
writer.decreaseIndent();
writer.write(`}`);
writer.writeLine();
writer.decreaseIndent();
writer.write(`}`);
writer.writeLine();
}
function writeUpdateFunction(syntaxNode: SyntaxNode) {
if (!syntaxNode.options.update || !hasChildNodes(syntaxNode)) {
return;