computeDiff function
Computes the size difference between two ProgramInfo.
Implementation
ProgramInfo computeDiff(ProgramInfo oldInfo, ProgramInfo newInfo) {
final programDiff = ProgramInfo();
var path = <Object>[];
void recurse(ProgramInfoNode? oldNode, ProgramInfoNode? newNode) {
if (oldNode?.size != newNode?.size) {
var diffNode = programDiff.root;
for (var i = 0; i < path.length; i += 2) {
final name = path[i] as String;
final type = path[i + 1] as NodeType;
diffNode =
programDiff.makeNode(name: name, parent: diffNode, type: type);
}
diffNode.size =
(diffNode.size ?? 0) + (newNode?.size ?? 0) - (oldNode?.size ?? 0);
}
for (var key in _allKeys(newNode?.children, oldNode?.children)) {
final newChildNode = newNode != null ? newNode.children[key] : null;
final oldChildNode = oldNode != null ? oldNode.children[key] : null;
path.add(key);
path.add((oldChildNode?.type ?? newChildNode?.type)!);
recurse(oldChildNode, newChildNode);
path.removeLast();
path.removeLast();
}
}
recurse(oldInfo.root, newInfo.root);
return programDiff;
}