Author: Eduardo Caldas Date: 2020-08-12T08:01:18Z New Revision: ac37afa650271d8366b706d79ff8e217fc624cbb
URL: https://github.com/llvm/llvm-project/commit/ac37afa650271d8366b706d79ff8e217fc624cbb DIFF: https://github.com/llvm/llvm-project/commit/ac37afa650271d8366b706d79ff8e217fc624cbb.diff LOG: [SyntaxTree] Unbox operators into tokens for nodes generated from `CXXOperatorCallExpr` For an user define `<`, `x < y` would yield the syntax tree: ``` BinaryOperatorExpression |-IdExpression | `-UnqualifiedId | `-x |-IdExpression | `-UnqualifiedId | `-< `-IdExpression `-UnqualifiedId `-y ``` But there is no syntatic difference at call site between call site or built-in `<`. As such they should generate the same syntax tree, namely: ``` BinaryOperatorExpression |-IdExpression | `-UnqualifiedId | `-x |-< `-IdExpression `-UnqualifiedId `-y ``` Differential Revision: https://reviews.llvm.org/D85750 Added: Modified: clang/lib/Tooling/Syntax/BuildTree.cpp clang/unittests/Tooling/Syntax/TreeTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp index 90451539b3b4..11d399730040 100644 --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -1007,23 +1007,26 @@ class BuildTreeVisitor : public RecursiveASTVisitor<BuildTreeVisitor> { } 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) { diff --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp index 46101660df8e..a5d1a4bfcacf 100644 --- a/clang/unittests/Tooling/Syntax/TreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -2592,9 +2592,7 @@ void test(X x, X y, X* xp, int X::* pmi) { | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-= + | | |-= | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2605,9 +2603,7 @@ void test(X x, X y, X* xp, int X::* pmi) { | | | `-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-+ + | | |-+ | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2617,9 +2613,7 @@ void test(X x, X y, X* xp, int X::* pmi) { | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-< + | | |-< | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2629,9 +2623,7 @@ void test(X x, X y, X* xp, int X::* pmi) { | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-<< + | | |-<< | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2641,9 +2633,7 @@ void test(X x, X y, X* xp, int X::* pmi) { | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | |-IdExpression - | | | `-UnqualifiedId - | | | `-, + | | |-, | | `-IdExpression | | `-UnqualifiedId | | `-y @@ -2730,27 +2720,21 @@ void test(X x) { |-{ |-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 @@ void test(X x) { | | |-IdExpression | | | `-UnqualifiedId | | | `-x - | | `-IdExpression - | | `-UnqualifiedId - | | `-++ + | | `-++ | `-; `-} )txt")); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits