140 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "clang-c/CXCompilationDatabase.h"
 | |
| #include "CXString.h"
 | |
| #include "clang/Tooling/CompilationDatabase.h"
 | |
| 
 | |
| using namespace clang;
 | |
| using namespace clang::tooling;
 | |
| 
 | |
| extern "C" {
 | |
| 
 | |
| // FIXME: do something more usefull with the error message
 | |
| CXCompilationDatabase
 | |
| clang_CompilationDatabase_fromDirectory(const char *BuildDir,
 | |
|                                         CXCompilationDatabase_Error *ErrorCode)
 | |
| {
 | |
|   std::string ErrorMsg;
 | |
|   CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError;
 | |
| 
 | |
|   CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir,
 | |
|                                                                    ErrorMsg);
 | |
| 
 | |
|   if (!db) {
 | |
|     fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str());
 | |
|     Err = CXCompilationDatabase_CanNotLoadDatabase;
 | |
|   }
 | |
| 
 | |
|   if (ErrorCode)
 | |
|     *ErrorCode = Err;
 | |
| 
 | |
|   return db;
 | |
| }
 | |
| 
 | |
| void
 | |
| clang_CompilationDatabase_dispose(CXCompilationDatabase CDb)
 | |
| {
 | |
|   delete static_cast<CompilationDatabase *>(CDb);
 | |
| }
 | |
| 
 | |
| struct AllocatedCXCompileCommands
 | |
| {
 | |
|   std::vector<CompileCommand> CCmd;
 | |
| 
 | |
|   AllocatedCXCompileCommands(const std::vector<CompileCommand>& Cmd)
 | |
|     : CCmd(Cmd)
 | |
|   { }
 | |
| };
 | |
| 
 | |
| CXCompileCommands
 | |
| clang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb,
 | |
|                                              const char *CompleteFileName)
 | |
| {
 | |
|   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
 | |
|     const std::vector<CompileCommand>
 | |
|       CCmd(db->getCompileCommands(CompleteFileName));
 | |
|     if (!CCmd.empty())
 | |
|       return new AllocatedCXCompileCommands( CCmd );
 | |
|   }
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| CXCompileCommands
 | |
| clang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) {
 | |
|   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
 | |
|     const std::vector<CompileCommand> CCmd(db->getAllCompileCommands());
 | |
|     if (!CCmd.empty())
 | |
|       return new AllocatedCXCompileCommands( CCmd );
 | |
|   }
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| void
 | |
| clang_CompileCommands_dispose(CXCompileCommands Cmds)
 | |
| {
 | |
|   delete static_cast<AllocatedCXCompileCommands *>(Cmds);
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| clang_CompileCommands_getSize(CXCompileCommands Cmds)
 | |
| {
 | |
|   if (!Cmds)
 | |
|     return 0;
 | |
| 
 | |
|   AllocatedCXCompileCommands *ACC =
 | |
|     static_cast<AllocatedCXCompileCommands *>(Cmds);
 | |
| 
 | |
|   return ACC->CCmd.size();
 | |
| }
 | |
| 
 | |
| CXCompileCommand
 | |
| clang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I)
 | |
| {
 | |
|   if (!Cmds)
 | |
|     return 0;
 | |
| 
 | |
|   AllocatedCXCompileCommands *ACC =
 | |
|     static_cast<AllocatedCXCompileCommands *>(Cmds);
 | |
| 
 | |
|   if (I >= ACC->CCmd.size())
 | |
|     return 0;
 | |
| 
 | |
|   return &ACC->CCmd[I];
 | |
| }
 | |
| 
 | |
| CXString
 | |
| clang_CompileCommand_getDirectory(CXCompileCommand CCmd)
 | |
| {
 | |
|   if (!CCmd)
 | |
|     return cxstring::createNull();
 | |
| 
 | |
|   CompileCommand *cmd = static_cast<CompileCommand *>(CCmd);
 | |
|   return cxstring::createRef(cmd->Directory.c_str());
 | |
| }
 | |
| 
 | |
| unsigned
 | |
| clang_CompileCommand_getNumArgs(CXCompileCommand CCmd)
 | |
| {
 | |
|   if (!CCmd)
 | |
|     return 0;
 | |
| 
 | |
|   return static_cast<CompileCommand *>(CCmd)->CommandLine.size();
 | |
| }
 | |
| 
 | |
| CXString
 | |
| clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg)
 | |
| {
 | |
|   if (!CCmd)
 | |
|     return cxstring::createNull();
 | |
| 
 | |
|   CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
 | |
| 
 | |
|   if (Arg >= Cmd->CommandLine.size())
 | |
|     return cxstring::createNull();
 | |
| 
 | |
|   return cxstring::createRef(Cmd->CommandLine[Arg].c_str());
 | |
| }
 | |
| 
 | |
| 
 | |
| } // end: extern "C"
 |