Как найти узел без родителя с 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));
Другие вопросы по тегам