[cfe-commits] r84548 - in /cfe/trunk: include/clang-c/Index.h tools/CIndex/CIndex.cpp tools/c-index-test/c-index-test.c

Ted Kremenek kremenek at apple.com
Mon Oct 19 15:15:10 PDT 2009


Author: kremenek
Date: Mon Oct 19 17:15:09 2009
New Revision: 84548

URL: http://llvm.org/viewvc/llvm-project?rev=84548&view=rev
Log:
Really fix <rdar://problem/7312058> by adding a 'displayDiagnostics' option to
clang_createTranslationUnit() and clang_createTranslationUnitFromSourceFile(). The user can now
specify if the diagnostics from Clang are printed to stderr or are silenced completely. We can
obviously evolve this API to be more general in the future.

Note: Added a FIXME since I wasn't certain what was the best way to redirect to something analogous
to '/dev/null' on Windows.

Modified:
    cfe/trunk/include/clang-c/Index.h
    cfe/trunk/tools/CIndex/CIndex.cpp
    cfe/trunk/tools/c-index-test/c-index-test.c

Modified: cfe/trunk/include/clang-c/Index.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=84548&r1=84547&r2=84548&view=diff

==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Mon Oct 19 17:15:09 2009
@@ -107,15 +107,26 @@
 const char *clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit);
 
 CXTranslationUnit clang_createTranslationUnit(
-  CXIndex, const char *ast_filename
+  CXIndex, const char *ast_filename,
+  int displayDiagnostics
 );
+
+/**
+ * \brief Destroy the specified CXTranslationUnit object.
+ */ 
+void clang_disposeTranslationUnit(CXTranslationUnit);
+
+/**
+ * \brief Return the CXTranslationUnit for a given source file and the provided command line
+ *   arguments one would pass to the compiler.
+ */
 CXTranslationUnit clang_createTranslationUnitFromSourceFile(
   CXIndex CIdx, 
   const char *source_filename,
   int num_clang_command_line_args, 
-  const char **clang_command_line_args
+  const char **clang_command_line_args,
+  int displayDiagnostics
 );
-void clang_disposeTranslationUnit(CXTranslationUnit);
 
 /**
  * \brief Indicate to Clang that it should only enumerate "local" declarations

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

==============================================================================
--- cfe/trunk/tools/CIndex/CIndex.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndex.cpp Mon Oct 19 17:15:09 2009
@@ -350,15 +350,16 @@
 
 // FIXME: need to pass back error info.
 CXTranslationUnit clang_createTranslationUnit(
-  CXIndex CIdx, const char *ast_filename) 
+  CXIndex CIdx, const char *ast_filename, int displayDiagnostics) 
 {
   assert(CIdx && "Passed null CXIndex");
   CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
   std::string astName(ast_filename);
   std::string ErrMsg;
+  DiagnosticClient *diagClient = displayDiagnostics
+                                  ? NULL : new IgnoreDiagnosticsClient();
   
-  return ASTUnit::LoadFromPCHFile(astName, &ErrMsg,
-                                  new IgnoreDiagnosticsClient(),
+  return ASTUnit::LoadFromPCHFile(astName, &ErrMsg, diagClient,
                                   CXXIdx->getOnlyLocalDecls(),
                                   /* UseBumpAllocator = */ true);
 }
@@ -366,8 +367,8 @@
 CXTranslationUnit clang_createTranslationUnitFromSourceFile(
   CXIndex CIdx, 
   const char *source_filename,
-  int num_command_line_args, const char **command_line_args) 
-{
+  int num_command_line_args, const char **command_line_args,
+  int displayDiagnostics)  {
   // Build up the arguments for involing clang.
   llvm::sys::Path ClangPath = static_cast<CIndexer *>(CIdx)->getClangPath();
   std::vector<const char *> argv;
@@ -383,11 +384,21 @@
   argv.push_back(NULL);
 
   // Generate the AST file in a separate process.
+#ifdef LLVM_ON_WIN32
+  llvm::sys::Path DevNull("/dev/null")
+  llvm::sys::Path *Redirects[] = { &DevNull, &DevNull, &DevNull, NULL };
+  llvm::sys::Program::ExecuteAndWait(ClangPath, &argv[0],
+                                     !displayDiagnostics ? Redirects : NULL);
+#else
+  // FIXME: I don't know what is the equivalent '/dev/null' redirect for
+  // Windows for this API.
   llvm::sys::Program::ExecuteAndWait(ClangPath, &argv[0]);
+#endif
 
   // Finally, we create the translation unit from the ast file.
   ASTUnit *ATU = static_cast<ASTUnit *>(
-                   clang_createTranslationUnit(CIdx, astTmpFile));
+                   clang_createTranslationUnit(CIdx, astTmpFile,
+                                               displayDiagnostics));
   ATU->unlinkTemporaryFile();
   return ATU;
 }

Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=84548&r1=84547&r2=84548&view=diff

==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Mon Oct 19 17:15:09 2009
@@ -96,7 +96,7 @@
   if (!strcmp(argv[2], "local"))
     clang_wantOnlyLocalDeclarations(Idx);
 
-  TU = clang_createTranslationUnit(Idx, argv[1]);
+  TU = clang_createTranslationUnit(Idx, argv[1], /* displayDiagnostics= */ 1);
 
   if (!TU) {
     fprintf(stderr, "Unable to load translation unit!\n");





More information about the cfe-commits mailing list