Index: test/Tooling/clang-diff-ast.cpp =================================================================== --- test/Tooling/clang-diff-ast.cpp +++ test/Tooling/clang-diff-ast.cpp @@ -39,7 +39,7 @@ }; // CHECK: CXXRecordDecl: X;X;( -class X : Base { +struct X : Base { int m; // CHECK: CXXMethodDecl: :foo(const char *(int) // CHECK: ParmVarDecl: i(int)( @@ -105,3 +105,23 @@ // CHECK-NEXT: TemplateName // CHECK-NEXT: TemplateArgument class I : C {}; + +struct str { + str& operator+(const str&); +} s1, s2, s3; + +// CHECK: CXXOperatorCallExpr +// CHECK-NEXT: DeclRefExpr: str::operator+ +// CHECK-NEXT: CXXOperatorCallExpr +// CHECK-NEXT: DeclRefExpr: str::operator+ +// CHECK-NEXT: DeclRefExpr: s1 +// CHECK-NEXT: DeclRefExpr: s2 +// CHECK-NEXT: DeclRefExpr: s3 +str x = s1 + s2 + s3; + +// CHECK: BinaryOperator: + +// CHECK-NEXT: BinaryOperator: + +// CHECK-NEXT: IntegerLiteral: 1 +// CHECK-NEXT: IntegerLiteral: 2 +// CHECK-NEXT: IntegerLiteral: 3 +int op = 1 + 2 + 3; Index: tools/clang-diff/CMakeLists.txt =================================================================== --- tools/clang-diff/CMakeLists.txt +++ tools/clang-diff/CMakeLists.txt @@ -7,6 +7,7 @@ ) target_link_libraries(clang-diff + clangAST clangBasic clangFrontend clangTooling Index: tools/clang-diff/ClangDiff.cpp =================================================================== --- tools/clang-diff/ClangDiff.cpp +++ tools/clang-diff/ClangDiff.cpp @@ -12,6 +12,7 @@ // //===----------------------------------------------------------------------===// +#include "clang/AST/ExprCXX.h" #include "clang/Tooling/ASTDiff/ASTDiff.h" #include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Tooling.h" @@ -310,8 +311,17 @@ OS << " class='" << getChangeKindAbbr(Node.Change) << "'"; OS << ">"; - for (diff::NodeId Child : Node.Children) - Offset = printHtmlForNode(OS, Diff, Tree, IsLeft, Child, Offset); + const auto &Children = Node.Children; + auto *OpCall = Node.ASTNode.get(); + if (OpCall && OpCall->isInfixBinaryOp()) { + assert(Children.size() == 3 && + "A Binary operator is supposed to have two arguments."); + for (int I : {1, 0, 2}) + Offset = printHtmlForNode(OS, Diff, Tree, IsLeft, Children[I], Offset); + } else { + for (diff::NodeId Child : Children) + Offset = printHtmlForNode(OS, Diff, Tree, IsLeft, Child, Offset); + } for (; Offset < End; ++Offset) printHtml(OS, Code[Offset]);