/*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- C++ -*-===*\
|*                                                                            *|
|*                     The LLVM Compiler Infrastructure                       *|
|*                                                                            *|
|* This file is distributed under the University of Illinois Open Source      *|
|* License. See LICENSE.TXT for details.                                      *|
|*                                                                            *|
|*===----------------------------------------------------------------------===*|
|*                                                                            *|
|* Implements the diagnostic functions of the Clang C interface.              *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/
#ifndef LLVM_CLANG_CINDEX_DIAGNOSTIC_H
#define LLVM_CLANG_CINDEX_DIAGNOSTIC_H

#include "clang-c/Index.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/LangOptions.h"

namespace llvm { namespace sys {
class Path;
} }

namespace clang {

class Diagnostic;
class LangOptions;
class Preprocessor;
  
/**
 * \brief Diagnostic client that translates Clang diagnostics into diagnostics
 * for the C interface to Clang.
 */
class CIndexDiagnosticClient : public DiagnosticClient {
  CXDiagnosticCallback Callback;
  CXClientData ClientData;
  const LangOptions *LangOptsPtr;
  
public:
  CIndexDiagnosticClient(CXDiagnosticCallback Callback,
                         CXClientData ClientData)
    : Callback(Callback), ClientData(ClientData), LangOptsPtr(0) { }
  
  virtual ~CIndexDiagnosticClient();
  
  virtual void BeginSourceFile(const LangOptions &LangOpts,
                               const Preprocessor *PP);
  
  virtual void EndSourceFile();

  virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
                                const DiagnosticInfo &Info);
};

/// \brief Given the path to a file that contains binary, serialized
/// diagnostics produced by Clang, emit those diagnostics via the
/// given diagnostic engine.
void ReportSerializedDiagnostics(const llvm::sys::Path &DiagnosticsPath,
                                 Diagnostic &Diags,
                                 unsigned num_unsaved_files,
                                 struct CXUnsavedFile *unsaved_files,
                                 const LangOptions &LangOpts);

} // end namespace clang

#endif // LLVM_CLANG_CINDEX_DIAGNOSTIC_H
