This revision was automatically updated to reflect the committed changes. Closed by commit rGac37afa65027: [SyntaxTree] Unbox operators into tokens for nodes generated from… (authored by eduucaldas).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D85750/new/ https://reviews.llvm.org/D85750 Files: clang/lib/Tooling/Syntax/BuildTree.cpp clang/unittests/Tooling/Syntax/TreeTest.cpp
Index: clang/unittests/Tooling/Syntax/TreeTest.cpp =================================================================== --- clang/unittests/Tooling/Syntax/TreeTest.cpp +++ clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -2592,9 +2592,7 @@ | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-= + | | |-= | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2605,9 +2603,7 @@ | | | `-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-+ + | | |-+ | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2617,9 +2613,7 @@ | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-< + | | |-< | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2629,9 +2623,7 @@ | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-<< + | | |-<< | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2641,9 +2633,7 @@ | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-, + | | |-, | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2730,27 +2720,21 @@ |-{ |-ExpressionStatement | |-PrefixUnaryOperatorExpression - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-++ + | | |-++ | | `-IdExpression | | `-UnqualifiedId | | `-x | `-; |-ExpressionStatement | |-PrefixUnaryOperatorExpression - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-! + | | |-! | | `-IdExpression | | `-UnqualifiedId | | `-x | `-; |-ExpressionStatement | |-PrefixUnaryOperatorExpression - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-& + | | |-& | | `-IdExpression | | `-UnqualifiedId | | `-x @@ -2809,9 +2793,7 @@ | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | `-IdExpression - | | `-UnqualifiedId - | | `-++ + | | `-++ | `-; `-} )txt")); Index: clang/lib/Tooling/Syntax/BuildTree.cpp =================================================================== --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -1007,23 +1007,26 @@ } bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *S) { - if (getOperatorNodeKind(*S) == - syntax::NodeKind::PostfixUnaryOperatorExpression) { + // To construct a syntax tree of the same shape for calls to built-in and + // user-defined operators, ignore the `DeclRefExpr` that refers to the + // operator and treat it as a simple token. Do that by traversing + // arguments instead of children. + for (auto *child : S->arguments()) { // A postfix unary operator is declared as taking two operands. The // second operand is used to distinguish from its prefix counterpart. In // the semantic AST this "phantom" operand is represented as a // `IntegerLiteral` with invalid `SourceLocation`. We skip visiting this // operand because it does not correspond to anything written in source - // code - for (auto *child : S->children()) { - if (child->getSourceRange().isInvalid()) - continue; - if (!TraverseStmt(child)) - return false; + // code. + if (child->getSourceRange().isInvalid()) { + assert(getOperatorNodeKind(*S) == + syntax::NodeKind::PostfixUnaryOperatorExpression); + continue; } - return WalkUpFromCXXOperatorCallExpr(S); - } else - return RecursiveASTVisitor::TraverseCXXOperatorCallExpr(S); + if (!TraverseStmt(child)) + return false; + } + return WalkUpFromCXXOperatorCallExpr(S); } bool WalkUpFromCXXOperatorCallExpr(CXXOperatorCallExpr *S) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits