]> granicus.if.org Git - clang/commitdiff
[libclang] Create a diagnostic set to pass at the end of indexing.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 1 Dec 2011 02:42:50 +0000 (02:42 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 1 Dec 2011 02:42:50 +0000 (02:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145557 91177308-0d34-0410-b5e6-96231b3b80d8

tools/c-index-test/c-index-test.c
tools/libclang/CIndexDiagnostic.cpp
tools/libclang/CIndexDiagnostic.h
tools/libclang/Indexing.cpp
tools/libclang/IndexingContext.h

index 472c0b0e95013b32e0dab65c25164d58271e908b..903bfc59d82b5986073c65f315f4427d3819fd10 100644 (file)
@@ -1702,21 +1702,27 @@ static void printProtocolList(const CXIdxObjCProtocolRefListInfo *ProtoInfo,
 }
 
 static void index_diagnostic(CXClientData client_data,
-                             CXDiagnostic diag, void *reserved) {
+                             CXDiagnosticSet diagSet, void *reserved) {
   CXString str;
   const char *cstr;
+  unsigned numDiags, i;
+  CXDiagnostic diag;
   IndexData *index_data;
   index_data = (IndexData *)client_data;
   printCheck(index_data);
 
-  str = clang_formatDiagnostic(diag, clang_defaultDiagnosticDisplayOptions());
-  cstr = clang_getCString(str);
-  printf("[diagnostic]: %s\n", cstr);
-  clang_disposeString(str);  
-
-  if (getenv("CINDEXTEST_FAILONERROR") &&
-      clang_getDiagnosticSeverity(diag) >= CXDiagnostic_Error) {
-    index_data->fail_for_error = 1;
+  numDiags = clang_getNumDiagnosticsInSet(diagSet);
+  for (i = 0; i != numDiags; ++i) {
+    diag = clang_getDiagnosticInSet(diagSet, i);
+    str = clang_formatDiagnostic(diag, clang_defaultDiagnosticDisplayOptions());
+    cstr = clang_getCString(str);
+    printf("[diagnostic]: %s\n", cstr);
+    clang_disposeString(str);  
+  
+    if (getenv("CINDEXTEST_FAILONERROR") &&
+        clang_getDiagnosticSeverity(diag) >= CXDiagnostic_Error) {
+      index_data->fail_for_error = 1;
+    }
   }
 }
 
index de0e8d4c8f5332e399513f41f4f44c9faf697c55..a29e3a60e04b604388b700760492339a7ef57767 100644 (file)
@@ -26,6 +26,7 @@
 using namespace clang;
 using namespace clang::cxloc;
 using namespace clang::cxstring;
+using namespace clang::cxdiag;
 using namespace llvm;
 
 
@@ -39,8 +40,8 @@ CXDiagnosticSetImpl::~CXDiagnosticSetImpl() {
 
 CXDiagnosticImpl::~CXDiagnosticImpl() {}
 
-static CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU,
-                                            bool checkIfChanged = false) {
+CXDiagnosticSetImpl *cxdiag::lazyCreateDiags(CXTranslationUnit TU,
+                                             bool checkIfChanged) {
   ASTUnit *AU = static_cast<ASTUnit *>(TU->TUData);
 
   if (TU->Diagnostics && checkIfChanged) {
index cc00cfe3469890d6aba326f4127ff9ea247adee0..72f57f8835e359d513873b4fcdbd2185ff510013 100644 (file)
@@ -149,6 +149,11 @@ struct CXStoredDiagnostic : public CXDiagnosticImpl {
   }
 };
 
+namespace cxdiag {
+CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU,
+                                     bool checkIfChanged = false);
+} // end namespace cxdiag
+
 } // end namespace clang
 
 #endif // LLVM_CLANG_CINDEX_DIAGNOSTIC_H
index f462c14dbfbd6de0120d1eddc9fed702b1272a20..50c37bc51fdfc253d4e7096d5815ed9f3ca7aaa5 100644 (file)
@@ -12,6 +12,7 @@
 #include "CXSourceLocation.h"
 #include "CXTranslationUnit.h"
 #include "CXString.h"
+#include "CIndexDiagnostic.h"
 #include "CIndexer.h"
 
 #include "clang/Frontend/ASTUnit.h"
@@ -31,6 +32,8 @@ using namespace cxstring;
 using namespace cxtu;
 using namespace cxindex;
 
+static void indexDiagnostics(CXTranslationUnit TU, IndexingContext &IdxCtx);
+
 namespace {
 
 //===----------------------------------------------------------------------===//
@@ -158,13 +161,15 @@ public:
 
 class IndexingFrontendAction : public ASTFrontendAction {
   IndexingContext IndexCtx;
+  CXTranslationUnit CXTU;
 
 public:
   IndexingFrontendAction(CXClientData clientData,
                          IndexerCallbacks &indexCallbacks,
                          unsigned indexOptions,
                          CXTranslationUnit cxTU)
-    : IndexCtx(clientData, indexCallbacks, indexOptions, cxTU) { }
+    : IndexCtx(clientData, indexCallbacks, indexOptions, cxTU),
+      CXTU(cxTU) { }
 
   virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
                                          StringRef InFile) {
@@ -174,6 +179,10 @@ public:
     return new IndexingConsumer(IndexCtx);
   }
 
+  virtual void EndSourceFileAction() {
+    indexDiagnostics(CXTU, IndexCtx);
+  }
+
   virtual TranslationUnitKind getTranslationUnitKind() { return TU_Prefix; }
   virtual bool hasCodeCompletionSupport() const { return false; }
 };
@@ -334,7 +343,6 @@ static void clang_indexSourceFile_Impl(void *UserData) {
   bool Persistent = requestedToGetTU;
   StringRef ResourceFilesPath = CXXIdx->getClangResourcesPath();
   bool OnlyLocalDecls = false;
-  bool CaptureDiagnostics = true;
   bool PrecompilePreamble = false;
   bool CacheCodeCompletionResults = false;
   PreprocessorOptions &PPOpts = CInvok->getPreprocessorOpts(); 
@@ -360,13 +368,12 @@ static void clang_indexSourceFile_Impl(void *UserData) {
                                                        Persistent,
                                                        ResourceFilesPath,
                                                        OnlyLocalDecls,
-                                                       CaptureDiagnostics,
+                                                    /*CaptureDiagnostics=*/true,
                                                        PrecompilePreamble,
                                                     CacheCodeCompletionResults);
   if (!Unit)
     return;
 
-  // FIXME: Set state of the ASTUnit according to the TU_options.
   if (out_TU)
     *out_TU = CXTU->takeTU();
 
@@ -450,8 +457,11 @@ static void indexTranslationUnit(ASTUnit &Unit, IndexingContext &IdxCtx) {
 }
 
 static void indexDiagnostics(CXTranslationUnit TU, IndexingContext &IdxCtx) {
-  // FIXME: Create a CXDiagnosticSet from TU;
-  // IdxCtx.handleDiagnosticSet(Set);
+  if (!IdxCtx.hasDiagnosticCallback())
+    return;
+
+  CXDiagnosticSetImpl *DiagSet = cxdiag::lazyCreateDiags(TU);
+  IdxCtx.handleDiagnosticSet(DiagSet);
 }
 
 static void clang_indexTranslationUnit_Impl(void *UserData) {
index 9a9fb3f4f0b993d3b18c64a0fa81c74977061c85..6f33e194fd50db8de8b4b88f53202bbb9df26ed6 100644 (file)
@@ -312,6 +312,8 @@ public:
 
   bool shouldAbort();
 
+  bool hasDiagnosticCallback() const { return CB.diagnostic; }
+
   void enteredMainFile(const FileEntry *File);
 
   void ppIncludedFile(SourceLocation hashLoc,