[index] Fix repeated visitation of the same InitListExpr for indexing.

It was visited multiple times unnecessarily.

rdar://28985038

llvm-svn: 285647
This commit is contained in:
Argyrios Kyrtzidis 2016-10-31 22:12:12 +00:00
parent 5d51a76994
commit 67eda2ad1d
2 changed files with 50 additions and 0 deletions

View File

@ -300,6 +300,7 @@ public:
IndexingContext &IndexCtx;
const NamedDecl *Parent;
const DeclContext *ParentDC;
bool Visited = false;
public:
SyntacticFormIndexer(IndexingContext &indexCtx,
@ -308,6 +309,22 @@ public:
bool shouldWalkTypesOfTypeLocs() const { return false; }
bool TraverseInitListExpr(InitListExpr *S, DataRecursionQueue *Q = nullptr) {
// Don't visit nested InitListExprs, this visitor will be called again
// later on for the nested ones.
if (Visited)
return true;
Visited = true;
InitListExpr *SyntaxForm = S->isSemanticForm() ? S->getSyntacticForm() : S;
if (SyntaxForm) {
for (Stmt *SubStmt : SyntaxForm->children()) {
if (!TraverseStmt(SubStmt, Q))
return false;
}
}
return true;
}
bool VisitDesignatedInitExpr(DesignatedInitExpr *E) {
for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) {
if (D.isFieldDesignator())

View File

@ -0,0 +1,33 @@
// RUN: c-index-test core -print-source-symbols -- %s -target x86_64-apple-macosx10.7 | FileCheck %s
struct MyStruct {
int myfield;
};
enum {
MyValToSet;
};
// CHECK: [[@LINE+1]]:14 | struct/C | MyStruct |
const struct MyStruct _MyStruct[]
[16]
[3]
[3]
[2]
[2] = {
[0] = {
[0] = {
[0] = {
[0][0] = {
[0] = {
// CHECK: [[@LINE+2]]:14 | field/C | myfield | {{.*}} | Ref |
// CHECK: [[@LINE+1]]:24 | enumerator/C | MyValToSet |
.myfield = MyValToSet,
// CHECK-NOT: | field/C | myfield |
// CHECK-NOT: | enumerator/C | MyValToSet |
},
},
},
},
},
};