Lot's of little changes to get the C-based indexing API going...
Work in progress.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80367 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp
index ec57547..dc44fd2 100644
--- a/tools/CIndex/CIndex.cpp
+++ b/tools/CIndex/CIndex.cpp
@@ -13,23 +13,58 @@
#include "clang-c/Index.h"
+#include "clang/Index/Program.h"
+#include "clang/Index/Indexer.h"
+
+#include "clang/Frontend/ASTUnit.h"
+#include "clang/Basic/FileManager.h"
+
+#include "clang/AST/DeclVisitor.h"
+
+using namespace clang;
+using namespace idx;
+
extern "C" {
CXIndex clang_createIndex()
-{
- return 0;
+{
+ return new Indexer(*new Program(), *new FileManager());
}
-CXTranslationUnit clang_loadTranslationUnitFromASTFile(
- CXIndex, const char *ast_filename)
+// FIXME: need to pass back error info.
+CXTranslationUnit clang_createTranslationUnit(
+ CXIndex CIdx, const char *ast_filename)
{
- return 0;
+ assert(CIdx && "Passed null CXIndex");
+ Indexer *CXXIdx = static_cast<Indexer *>(CIdx);
+ std::string astName(ast_filename);
+ std::string ErrMsg;
+
+ return ASTUnit::LoadFromPCHFile(astName, CXXIdx->getFileManager(), &ErrMsg);
}
+class IdxVisitor : public DeclVisitor<IdxVisitor> {
+public:
+ IdxVisitor();
+
+ void VisitNamedDecl(NamedDecl *ND) {
+ printf("NamedDecl (%s:", ND->getDeclKindName());
+ if (ND->getIdentifier())
+ printf("%s)\n", ND->getIdentifier()->getName());
+ else
+ printf("<no name>)\n");
+ }
+};
+
void clang_loadTranslationUnit(
- CXTranslationUnit, void (*callback)(CXTranslationUnit, CXCursor)
-)
+ CXTranslationUnit CTUnit, void (*callback)(CXTranslationUnit, CXCursor))
{
+ assert(CTUnit && "Passed null CXTranslationUnit");
+ ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit);
+ ASTContext &Ctx = CXXUnit->getASTContext();
+
+ IdxVisitor DVisit;
+ DVisit.Visit(Ctx.getTranslationUnitDecl());
}
void clang_loadDeclaration(CXDecl, void (*callback)(CXDecl, CXCursor))