-
Notifications
You must be signed in to change notification settings - Fork 226
Open
Description
if you have a node such as:
<Text><Text>Foo</Text> is great</Text>
and you do a transform:
node.transform((traversal) => {
if (ts.isJsxText(traversal.currentNode) && traversal.currentNode.text != 'Foo'){
return traversal.factory.createJsxText(' is NOT great', false);
} else {
return traversal.visitChildren();
}
});
the result should be:
<Text><Text>Foo</Text> is NOT great</Text>
but it is:
<Text><Text>Foo</Text> is NOT great</Text>
instead. Notice how an extra space was added. This is due to the following error in the code:
function handleTransformation(oldNode, newNode) {
if (oldNode === newNode && newNode.emitNode == null)
return;
const start = oldNode.getStart(compilerSourceFile, true); //This is the error: start should be oldNode.pos which correctly accounts for whitespace
const end = oldNode.end;
let lastTransformation;
while ((lastTransformation = transformations[transformations.length - 1]) && lastTransformation.start > start)
transformations.pop();
const wrappedNode = compilerFactory.getExistingNodeFromCompilerNode(oldNode);
transformations.push({
start,
end,
compilerNode: newNode,
});
if (wrappedNode != null) {
if (oldNode.kind !== newNode.kind)
wrappedNode.forget();
else
wrappedNode.forgetDescendants();
}
}
As I noted in the comment, it is using an incorrect way of getting the start of the node and should be using .pos.
Metadata
Metadata
Assignees
Labels
No labels