forked from OSchip/llvm-project
[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:
parent
88a3d5c855
commit
d5b56a8619
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue