Когда у узла Clang AST будет несколько родителей? - PullRequest
0 голосов
/ 17 февраля 2020

Класс clang :: ASTContext имеет метод:

DynTypedNodeList getParents(const NodeT &Node)

, который возвращает список родительских узлов данного узла AST.

Обычно AST в виде дерева представляет собой древовидную структуру, но по некоторым причинам (возможно, из-за соображений производительности) Clang позволяет узлу иметь нескольких родителей.

При каких условиях (какой шаблон исходного кода C ++) , getParents () вернет более одного родителя?

1 Ответ

1 голос
/ 21 февраля 2020

Исходный ответ (неверный)

AST - это дерево, и у каждого узла ровно один родительский элемент. getParents, однако, возвращает не только родителя, но и родителя родителя и так далее. Таким образом, на самом деле, функцию лучше называть как-то как getAncestors.

Обновленный ответ

Исходный ответ действительно неверен и getParents возвращает ровно один узел для подавляющего большинства Узлы АСТ. Вот комментарий от clang-tidy, который охватывает топи c:

Случай, когда у Stmt есть несколько родителей, встречается редко, но на самом деле происходит в интересующих нас частях AST В частности, узлы InitListExpr заставляют ASTContext :: getParent () возвращать несколько родителей для определенных узлов в их поддереве, потому что RecursiveASTVisitor посещает как syntacti c, так и semanti c формы InitListExpr, и отношения родитель-потомок различаются между две формы.

Возможно, есть и другие узлы, но я не смог найти информацию об этом.

...