[cfe-commits] r93223 - /cfe/trunk/tools/CIndex/CIndexUSRs.cpp

Ted Kremenek kremenek at apple.com
Mon Jan 11 18:07:59 PST 2010


Author: kremenek
Date: Mon Jan 11 20:07:58 2010
New Revision: 93223

URL: http://llvm.org/viewvc/llvm-project?rev=93223&view=rev
Log:
Add a boilerplate implementation for clang_getUSR().  WIP.

Modified:
    cfe/trunk/tools/CIndex/CIndexUSRs.cpp

Modified: cfe/trunk/tools/CIndex/CIndexUSRs.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndexUSRs.cpp?rev=93223&r1=93222&r2=93223&view=diff

==============================================================================
--- cfe/trunk/tools/CIndex/CIndexUSRs.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndexUSRs.cpp Mon Jan 11 20:07:58 2010
@@ -12,6 +12,9 @@
 //===----------------------------------------------------------------------===//
 
 #include "CIndexer.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/Support/raw_ostream.h";
+#include "clang/AST/DeclVisitor.h";
 
 extern "C" {
 
@@ -74,8 +77,83 @@
   return NullCXEntity();
 }
   
-CXString clang_getUSR(CXEntity) {
-  return CIndexer::createCXString("");
+//===----------------------------------------------------------------------===//
+// USR generation.
+//===----------------------------------------------------------------------===//
+
+namespace {
+class USRGenerator : public DeclVisitor<USRGenerator> {
+  llvm::raw_ostream &Out;
+public:
+  USRGenerator(llvm::raw_ostream &out) : Out(out) {}
+
+  void VisitObjCContainerDecl(ObjCContainerDecl *CD);  
+  void VisitObjCMethodDecl(ObjCMethodDecl *MD);
+  void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
+};
+} // end anonymous namespace
+
+void USRGenerator::VisitObjCMethodDecl(ObjCMethodDecl *D) {
+  Visit(cast<Decl>(D->getDeclContext()));
+  Out << (D->isInstanceMethod() ? "_IM_" : "_CM_");
+  Out << DeclarationName(D->getSelector());
+}
+  
+void USRGenerator::VisitObjCContainerDecl(ObjCContainerDecl *D) {
+  switch (D->getKind()) {
+    default:
+      assert(false && "Invalid ObjC container.");
+    case Decl::ObjCInterface:
+    case Decl::ObjCImplementation:
+      Out << "objc_class_" << D->getName();
+      break;
+    case Decl::ObjCCategory: {
+      ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(D);
+      Out << "objc_cat_" << CD->getClassInterface()->getName()
+          << '_' << CD->getName();
+      break;
+    }
+    case Decl::ObjCCategoryImpl: {
+      ObjCCategoryImplDecl *CD = cast<ObjCCategoryImplDecl>(D);
+      Out << "objc_cat_" << CD->getClassInterface()->getName()
+          << '_' << CD->getName();
+      break;
+    }
+    case Decl::ObjCProtocol:
+      Out << "objc_prot_" << cast<ObjCProtocolDecl>(D)->getName();
+      break;
+  }
+}
+  
+void USRGenerator::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
+  Visit(cast<Decl>(D->getDeclContext()));
+  Out << "_prop_" << D->getName();
+}
+  
+// FIXME: This is a skeleton implementation.  It will be overhauled.
+CXString clang_getUSR(CXEntity CE) {
+  const Entity &E = GetEntity(CE);
+  
+  // FIXME: Support cross-translation unit CXEntities.  
+  if (!E.isInternalToTU())
+    return CIndexer::createCXString(NULL);
+  
+  Decl *D = E.getInternalDecl();
+  if (!D)
+    return CIndexer::createCXString(NULL);
+
+  llvm::SmallString<1024> StrBuf;
+  {
+    llvm::raw_svector_ostream Out(StrBuf);
+    USRGenerator UG(Out);
+    UG.Visit(D);
+  }
+  
+  if (StrBuf.empty())
+    return CIndexer::createCXString(NULL);
+
+  // Return a copy of the string that must be disposed by the caller.
+  return CIndexer::createCXString(StrBuf.c_str(), true);
 }
 
 } // end extern "C"





More information about the cfe-commits mailing list