diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-07-29 23:40:14 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2009-07-29 23:40:14 +0000 |
commit | 7f4656eb6b60a7f3596fb26b9d5aed3731b3109e (patch) | |
tree | bc9c8fa565a421c6712d27c947e4bb3d3ff297c7 /tools/index-test/index-test.cpp | |
parent | 40c0e73be6b2508c33f802368080f6b369dc67bc (diff) |
-Introduce the idx::Analyzer class used for getting indexing information, like finding
references of a declaration across translation units.
-Modify the index-test tool to use it.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77536 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/index-test/index-test.cpp')
-rw-r--r-- | tools/index-test/index-test.cpp | 91 |
1 files changed, 38 insertions, 53 deletions
diff --git a/tools/index-test/index-test.cpp b/tools/index-test/index-test.cpp index 5fc6269f7a..a0d60f7b49 100644 --- a/tools/index-test/index-test.cpp +++ b/tools/index-test/index-test.cpp @@ -39,6 +39,7 @@ #include "clang/Index/ASTLocation.h" #include "clang/Index/DeclReferenceMap.h" #include "clang/Index/Handlers.h" +#include "clang/Index/Analyzer.h" #include "clang/Index/Utils.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CommandLineSourceLoc.h" @@ -100,73 +101,57 @@ DisableFree("disable-free", static bool HadErrors = false; -static void ProcessDecl(Decl *D) { - assert(D); +static void ProcessASTLocation(ASTLocation ASTLoc, Indexer &Idxer) { + assert(ASTLoc.isValid()); + + Decl *D = ASTLoc.getReferencedDecl(); + if (D == 0) { + llvm::errs() << "Error: Couldn't get referenced Decl for the ASTLocation\n"; + HadErrors = true; + return; + } + llvm::raw_ostream &OS = llvm::outs(); - + typedef Storing<TULocationHandler> ResultsTy; + ResultsTy Results; + + Analyzer Analyz(Idxer.getProgram(), Idxer); + switch (ProgAction) { default: assert(0); case PrintRefs: { - NamedDecl *ND = dyn_cast<NamedDecl>(D); - if (!ND) - return; - - DeclReferenceMap RefMap(ND->getASTContext()); - for (DeclReferenceMap::astlocation_iterator - I = RefMap.refs_begin(ND), E = RefMap.refs_end(ND); I != E; ++I) + Analyz.FindReferences(D, Results); + for (ResultsTy::iterator + I = Results.begin(), E = Results.end(); I != E; ++I) I->print(OS); break; } - - case PrintDefs: { - const Decl *DefD = 0; - if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { - const FunctionDecl *DFD = 0; - FD->getBody(DFD); - DefD = DFD; - } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) { - const VarDecl *DVD = 0; - VD->getDefinition(DVD); - DefD = DVD; - } - if (DefD) - ASTLocation(DefD).print(OS); - break; - } - - case PrintDecls : - for (Decl::redecl_iterator I = D->redecls_begin(), - E = D->redecls_end(); I != E; ++I) - ASTLocation(*I).print(OS); + case PrintDecls: { + Analyz.FindDeclarations(D, Results); + for (ResultsTy::iterator + I = Results.begin(), E = Results.end(); I != E; ++I) + I->print(OS); break; - } -} -static void ProcessASTLocation(ASTLocation ASTLoc, Indexer &Idxer) { - assert(ASTLoc.isValid()); + case PrintDefs:{ + Analyz.FindDeclarations(D, Results); + for (ResultsTy::iterator + I = Results.begin(), E = Results.end(); I != E; ++I) { + const Decl *D = I->getDecl(); + bool isDef = false; + if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) + isDef = FD->isThisDeclarationADefinition(); + else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) + isDef = VD->getInit() != 0; - Decl *D = ASTLoc.getReferencedDecl(); - if (D == 0) { - llvm::errs() << "Error: Couldn't get referenced Decl for the ASTLocation\n"; - HadErrors = true; - return; + if (isDef) + I->print(OS); + } + break; } - Entity Ent = Entity::get(D, Idxer.getProgram()); - if (Ent.isInvalid() || Ent.isInternalToTU()) - return ProcessDecl(D); - - Storing<TranslationUnitHandler> TURes; - Idxer.GetTranslationUnitsFor(Ent, TURes); - - // Find the "same" Decl in other translation units and print information. - for (Storing<TranslationUnitHandler>::iterator - I = TURes.begin(), E = TURes.end(); I != E; ++I) { - Decl *OtherD = Ent.getDecl((*I)->getASTContext()); - assert(OtherD && "Couldn't resolve Entity"); - ProcessDecl(OtherD); } } |