[clang] 3a574a6 - Add support for Overloaded Binary Operators in SyntaxTree
Dmitri Gribenko via cfe-commits
cfe-commits at lists.llvm.org
Fri May 29 11:07:58 PDT 2020
Author: Eduardo Caldas
Date: 2020-05-29T20:03:59+02:00
New Revision: 3a574a6cb35953e538e577a88f62af8dd01432c7
URL: https://github.com/llvm/llvm-project/commit/3a574a6cb35953e538e577a88f62af8dd01432c7
DIFF: https://github.com/llvm/llvm-project/commit/3a574a6cb35953e538e577a88f62af8dd01432c7.diff
LOG: Add support for Overloaded Binary Operators in SyntaxTree
Reviewers: gribozavr2
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D80812
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 60c6b3f88509..2b312cdde1d6 100644
--- a/clang/lib/Tooling/Syntax/BuildTree.cpp
+++ b/clang/lib/Tooling/Syntax/BuildTree.cpp
@@ -640,6 +640,24 @@ class BuildTreeVisitor : public RecursiveASTVisitor<BuildTreeVisitor> {
return true;
}
+ bool WalkUpFromCXXOperatorCallExpr(CXXOperatorCallExpr *S) {
+ if (S->isInfixBinaryOp()) {
+ Builder.markExprChild(
+ S->getArg(0),
+ syntax::NodeRole::BinaryOperatorExpression_leftHandSide);
+ Builder.markChildToken(
+ S->getOperatorLoc(),
+ syntax::NodeRole::BinaryOperatorExpression_operatorToken);
+ Builder.markExprChild(
+ S->getArg(1),
+ syntax::NodeRole::BinaryOperatorExpression_rightHandSide);
+ Builder.foldNode(Builder.getExprRange(S),
+ new (allocator()) syntax::BinaryOperatorExpression, S);
+ return true;
+ }
+ return RecursiveASTVisitor::WalkUpFromCXXOperatorCallExpr(S);
+ }
+
bool WalkUpFromNamespaceDecl(NamespaceDecl *S) {
auto Tokens = Builder.getDeclarationRange(S);
if (Tokens.front().kind() == tok::coloncolon) {
diff --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp
index 7051074d3b33..04786257c434 100644
--- a/clang/unittests/Tooling/Syntax/TreeTest.cpp
+++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp
@@ -993,6 +993,134 @@ void test(int a, int b) {
)txt");
}
+TEST_F(SyntaxTreeTest, UserDefinedBinaryOperator) {
+ expectTreeDumpEqual(
+ R"cpp(
+struct X {
+ X& operator=(const X&);
+ friend X operator+(X, const X&);
+ friend bool operator<(const X&, const X&);
+};
+void test(X x, X y) {
+ x = y;
+ x + y;
+ x < y;
+}
+ )cpp",
+ R"txt(
+*: TranslationUnit
+|-SimpleDeclaration
+| |-struct
+| |-X
+| |-{
+| |-SimpleDeclaration
+| | |-X
+| | |-SimpleDeclarator
+| | | |-&
+| | | |-operator
+| | | |-=
+| | | `-ParametersAndQualifiers
+| | | |-(
+| | | |-SimpleDeclaration
+| | | | |-const
+| | | | |-X
+| | | | `-SimpleDeclarator
+| | | | `-&
+| | | `-)
+| | `-;
+| |-UnknownDeclaration
+| | `-SimpleDeclaration
+| | |-friend
+| | |-X
+| | |-SimpleDeclarator
+| | | |-operator
+| | | |-+
+| | | `-ParametersAndQualifiers
+| | | |-(
+| | | |-SimpleDeclaration
+| | | | `-X
+| | | |-,
+| | | |-SimpleDeclaration
+| | | | |-const
+| | | | |-X
+| | | | `-SimpleDeclarator
+| | | | `-&
+| | | `-)
+| | `-;
+| |-UnknownDeclaration
+| | `-SimpleDeclaration
+| | |-friend
+| | |-bool
+| | |-SimpleDeclarator
+| | | |-operator
+| | | |-<
+| | | `-ParametersAndQualifiers
+| | | |-(
+| | | |-SimpleDeclaration
+| | | | |-const
+| | | | |-X
+| | | | `-SimpleDeclarator
+| | | | `-&
+| | | |-,
+| | | |-SimpleDeclaration
+| | | | |-const
+| | | | |-X
+| | | | `-SimpleDeclarator
+| | | | `-&
+| | | `-)
+| | `-;
+| |-}
+| `-;
+`-SimpleDeclaration
+ |-void
+ |-SimpleDeclarator
+ | |-test
+ | `-ParametersAndQualifiers
+ | |-(
+ | |-SimpleDeclaration
+ | | |-X
+ | | `-SimpleDeclarator
+ | | `-x
+ | |-,
+ | |-SimpleDeclaration
+ | | |-X
+ | | `-SimpleDeclarator
+ | | `-y
+ | `-)
+ `-CompoundStatement
+ |-{
+ |-ExpressionStatement
+ | |-BinaryOperatorExpression
+ | | |-UnknownExpression
+ | | | `-x
+ | | |-UnknownExpression
+ | | | `-=
+ | | `-UnknownExpression
+ | | `-y
+ | `-;
+ |-ExpressionStatement
+ | |-BinaryOperatorExpression
+ | | |-UnknownExpression
+ | | | `-UnknownExpression
+ | | | `-x
+ | | |-UnknownExpression
+ | | | `-+
+ | | `-UnknownExpression
+ | | `-y
+ | `-;
+ |-ExpressionStatement
+ | |-BinaryOperatorExpression
+ | | |-UnknownExpression
+ | | | `-x
+ | | |-UnknownExpression
+ | | | `-<
+ | | `-UnknownExpression
+ | | `-y
+ | `-;
+ `-}
+)txt");
+}
+
TEST_F(SyntaxTreeTest, MultipleDeclaratorsGrouping) {
expectTreeDumpEqual(
R"cpp(
More information about the cfe-commits
mailing list