Как найти узел без родителя с jscodeshift?
Я хочу найти выражения вызова, которые не имеют родителя в этом сценарии:
1 + 1
function parent() {
2 + 2
}
3 + 3
Здесь я хочу получить 1 + 1
а также 3 + 3
узлы, но не 2 + 2
,
То, что я хотел бы достичь, было бы что-то вроде:
j(file.source).find(j.ExpressionStatement, {
parent: null
});
Так есть ли фильтр, который позволяет определить, есть ли у выражения родительский элемент?
1 ответ
Решение
Использование отступов (небезопасно)
Атрибут loc узла AST имеет атрибут отступа. Если отступ 0
когда можно предположить, что это выражение верхнего уровня:
j(file.source).find(j.ExpressionStatement, {
loc: {indent: 0}
});
Это действительно не надежно, так как это зависит от отступа.
Цепочка со вторым фильтром
Так как я не мог найти безопасный способ фильтрации по атрибутам. Мы также можем использовать jscodeshift's .filter()
чтобы получить родительский узел. Если это программа, то мы обязательно на высшем уровне:
j(file.source).find(j.ExpressionStatement)
.filter(path => j.Program.check(path.parent.value));