AST学习-拆分一个Literal类型的节点

拆分一个Literal类型的节点

拆分NumericLiteral节点类型

示例代码

1
var a = 12345678;

了解异或操作

1
2
3
4
5
6
7
# 生成随机八位负数
const first = 0 - Math.floor(Math.random() * 10000000 + 10000000)
# 与a做异或操作
const second = a ^ first;
# 将first 与 second 进行异或操作
const res = first ^ second
>>>12345678

可以发现输出结果为 12345678, res = first ^ second = first ^ first ^ a = 0 ^ a = a

了解了这个概念就可以在 AST 中实现了

在 AST 中实现

通过 AST-TREE查看可知异或表达式属于 BinaryExpression 节点,所以我们需要构造这个节点

1
2
const t = require("@babel/types")
t.BinaryExpression('^', t.NumericLiteral(first), t.NumericLiteral(second))

然后使用该节点替换原来的 NumericLiteral 节点就好了,代码如下

1
2
3
4
5
6
7
8
9
10
11
const vistor = {
NumericLiteral(path){
const node = path.node;
const value = node.value;
const first = 0 - Math.floor(Math.random() * 10000000 + 10000000);
const second = value ^ first;

path.replaceWith(t.BinaryExpression('^', t.NumericLiteral(first), t.NumericLiteral(second)));
path.stop();
}
}

查看结果


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!