Further tweak USR generation by shorting names and distinguish between namespaces and functions.

llvm-svn: 93404
This commit is contained in:
Ted Kremenek 2010-01-14 01:50:21 +00:00
parent 6c730dea6f
commit e1b5525510
1 changed files with 41 additions and 22 deletions

View File

@ -67,37 +67,56 @@ static inline Program &GetProgram(CXIndex CIdx) {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
namespace { namespace {
class USRGenerator : public DeclVisitor<USRGenerator> { class USRGenerator : public DeclVisitor<USRGenerator> {
llvm::raw_ostream &Out; llvm::raw_ostream &Out;
public: public:
USRGenerator(llvm::raw_ostream &out) : Out(out) {} USRGenerator(llvm::raw_ostream &out) : Out(out) {}
void VisitNamedDecl(NamedDecl *D); void VisitBlockDecl(BlockDecl *D);
void VisitObjCContainerDecl(ObjCContainerDecl *CD); void VisitDeclContext(DeclContext *D);
void VisitObjCMethodDecl(ObjCMethodDecl *MD); void VisitFunctionDecl(FunctionDecl *D);
void VisitObjCPropertyDecl(ObjCPropertyDecl *D); void VisitNamedDecl(NamedDecl *D);
void VisitRecordDecl(RecordDecl *D); void VisitNamespaceDecl(NamespaceDecl *D);
void VisitTypedefDecl(TypedefDecl *D); void VisitObjCContainerDecl(ObjCContainerDecl *CD);
}; void VisitObjCMethodDecl(ObjCMethodDecl *MD);
void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
void VisitRecordDecl(RecordDecl *D);
void VisitTypedefDecl(TypedefDecl *D);
};
} // end anonymous namespace } // end anonymous namespace
void USRGenerator::VisitBlockDecl(BlockDecl *D) {
VisitDeclContext(D->getDeclContext());
// FIXME: Better support for anonymous blocks.
Out << "@B^anon";
}
void USRGenerator::VisitDeclContext(DeclContext *DC) {
if (NamedDecl *D = dyn_cast<NamedDecl>(DC))
Visit(D);
}
void USRGenerator::VisitFunctionDecl(FunctionDecl *D) {
VisitDeclContext(D->getDeclContext());
Out << "@F^" << D->getNameAsString();
}
void USRGenerator::VisitNamedDecl(NamedDecl *D) { void USRGenerator::VisitNamedDecl(NamedDecl *D) {
DeclContext *DC = D->getDeclContext(); VisitDeclContext(D->getDeclContext());
if (NamedDecl *DCN = dyn_cast<NamedDecl>(DC))
Visit(DCN);
const std::string &s = D->getNameAsString(); const std::string &s = D->getNameAsString();
assert(!s.empty()); assert(!s.empty());
Out << '@' << s; Out << "@^" << s;
}
void USRGenerator::VisitNamespaceDecl(NamespaceDecl *D) {
VisitDeclContext(D->getDeclContext());
Out << "@N^" << D->getNameAsString();
} }
void USRGenerator::VisitRecordDecl(RecordDecl *D) { void USRGenerator::VisitRecordDecl(RecordDecl *D) {
DeclContext *DC = D->getDeclContext(); VisitDeclContext(D->getDeclContext());
if (NamedDecl *DCN = dyn_cast<NamedDecl>(DC)) Out << "@S^";
Visit(DCN); // FIXME: Better support for anonymous structures.
Out << "@struct^";
const std::string &s = D->getNameAsString(); const std::string &s = D->getNameAsString();
if (s.empty()) if (s.empty())
Out << "^anon"; Out << "^anon";