[clang-diff] Filter AST nodes

Summary:
Ignore macros and implicit AST nodes, as well as anything outside of the
main source file.

Reviewers: arphaman

Subscribers: klimek

Differential Revision: https://reviews.llvm.org/D36184

llvm-svn: 311280
This commit is contained in:
Johannes Altmanninger 2017-08-20 10:22:32 +00:00
parent 88a3d5c855
commit d5b56a8619
3 changed files with 40 additions and 3 deletions

View File

@ -158,12 +158,23 @@ private:
void setLeftMostDescendants();
};
static bool isSpecializedNodeExcluded(const Decl *D) { return D->isImplicit(); }
static bool isSpecializedNodeExcluded(const Stmt *S) { return false; }
template <class T>
static bool isNodeExcluded(const SourceManager &SrcMgr, T *N) {
if (!N)
return true;
SourceLocation SLoc = N->getLocStart();
return SLoc.isValid() && SrcMgr.isInSystemHeader(SLoc);
if (SLoc.isValid()) {
// Ignore everything from other files.
if (!SrcMgr.isInMainFile(SLoc))
return true;
// Ignore macros.
if (SLoc != SrcMgr.getSpellingLoc(SLoc))
return true;
}
return isSpecializedNodeExcluded(N);
}
namespace {
@ -180,6 +191,8 @@ struct NodeCountVisitor : public RecursiveASTVisitor<NodeCountVisitor> {
return true;
}
bool TraverseStmt(Stmt *S) {
if (S)
S = S->IgnoreImplicit();
if (isNodeExcluded(Tree.AST.getSourceManager(), S))
return true;
++Count;
@ -242,6 +255,8 @@ struct PreorderVisitor : public RecursiveASTVisitor<PreorderVisitor> {
return true;
}
bool TraverseStmt(Stmt *S) {
if (S)
S = S->IgnoreImplicit();
if (isNodeExcluded(Tree.AST.getSourceManager(), S))
return true;
auto SavedState = PreTraverse(S);

View File

@ -12,7 +12,8 @@ void f() {
// CHECK: IntegerLiteral: 1
auto i = 1;
// CHECK: CallExpr(
// CHECK: DeclRefExpr: f(
// CHECK-NOT: ImplicitCastExpr
// CHECK-NEXT: DeclRefExpr: f(
f();
// CHECK: BinaryOperator: =(
i = i;
@ -37,6 +38,7 @@ class X : Base {
if (i == 0)
// CHECK: StringLiteral: foo(
return "foo";
// CHECK-NOT: ImplicitCastExpr
return 0;
}
@ -48,3 +50,23 @@ public:
int x = m;
}
};
#define M (void)1
#define MA(a, b) (void)a, b
// CHECK: FunctionDecl
// CHECK-NEXT: CompoundStmt
void macros() {
M;
MA(1, 2);
}
#ifndef GUARD
#define GUARD
// CHECK-NEXT: NamespaceDecl
namespace world {
// nodes from other files are excluded, there should be no output here
#include "clang-diff-ast.cpp"
}
// CHECK-NEXT: FunctionDecl: sentinel
void sentinel();
#endif

View File

@ -3,9 +3,9 @@
// RUN: | FileCheck %s
// CHECK: "begin": 299,
// CHECK: "type": "CXXRecordDecl",
// CHECK: "type": "FieldDecl",
// CHECK: "end": 319,
// CHECK: "type": "CXXRecordDecl",
class A {
int x;
};