12b3c8603SArnaud A. de Grandmaison #include "clang-c/CXCompilationDatabase.h"
22b3c8603SArnaud A. de Grandmaison #include "CXString.h"
3cc0694c8SChandler Carruth #include "clang/Tooling/CompilationDatabase.h"
42b3c8603SArnaud A. de Grandmaison 
52b3c8603SArnaud A. de Grandmaison using namespace clang;
62b3c8603SArnaud A. de Grandmaison using namespace clang::tooling;
72b3c8603SArnaud A. de Grandmaison using namespace clang::cxstring;
82b3c8603SArnaud A. de Grandmaison 
92b3c8603SArnaud A. de Grandmaison extern "C" {
102b3c8603SArnaud A. de Grandmaison 
112b3c8603SArnaud A. de Grandmaison // FIXME: do something more usefull with the error message
122b3c8603SArnaud A. de Grandmaison CXCompilationDatabase
13fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_fromDirectory(const char *BuildDir,
142b3c8603SArnaud A. de Grandmaison                                         CXCompilationDatabase_Error *ErrorCode)
152b3c8603SArnaud A. de Grandmaison {
162b3c8603SArnaud A. de Grandmaison   std::string ErrorMsg;
172b3c8603SArnaud A. de Grandmaison   CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError;
182b3c8603SArnaud A. de Grandmaison 
192b3c8603SArnaud A. de Grandmaison   CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir,
202b3c8603SArnaud A. de Grandmaison                                                                    ErrorMsg);
212b3c8603SArnaud A. de Grandmaison 
222b3c8603SArnaud A. de Grandmaison   if (!db) {
232b3c8603SArnaud A. de Grandmaison     fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str());
242b3c8603SArnaud A. de Grandmaison     Err = CXCompilationDatabase_CanNotLoadDatabase;
252b3c8603SArnaud A. de Grandmaison   }
262b3c8603SArnaud A. de Grandmaison 
272b3c8603SArnaud A. de Grandmaison   if (ErrorCode)
282b3c8603SArnaud A. de Grandmaison     *ErrorCode = Err;
292b3c8603SArnaud A. de Grandmaison 
302b3c8603SArnaud A. de Grandmaison   return db;
312b3c8603SArnaud A. de Grandmaison }
322b3c8603SArnaud A. de Grandmaison 
332b3c8603SArnaud A. de Grandmaison void
34fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_dispose(CXCompilationDatabase CDb)
352b3c8603SArnaud A. de Grandmaison {
362b3c8603SArnaud A. de Grandmaison   delete static_cast<CompilationDatabase *>(CDb);
372b3c8603SArnaud A. de Grandmaison }
382b3c8603SArnaud A. de Grandmaison 
392b3c8603SArnaud A. de Grandmaison struct AllocatedCXCompileCommands
402b3c8603SArnaud A. de Grandmaison {
412b3c8603SArnaud A. de Grandmaison   std::vector<CompileCommand> CCmd;
422b3c8603SArnaud A. de Grandmaison 
432b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands(const std::vector<CompileCommand>& Cmd)
442b3c8603SArnaud A. de Grandmaison     : CCmd(Cmd)
452b3c8603SArnaud A. de Grandmaison   { }
462b3c8603SArnaud A. de Grandmaison };
472b3c8603SArnaud A. de Grandmaison 
482b3c8603SArnaud A. de Grandmaison CXCompileCommands
49fa6d73ccSArnaud A. de Grandmaison clang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb,
502b3c8603SArnaud A. de Grandmaison                                              const char *CompleteFileName)
512b3c8603SArnaud A. de Grandmaison {
522b3c8603SArnaud A. de Grandmaison   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
532b3c8603SArnaud A. de Grandmaison     const std::vector<CompileCommand>
542b3c8603SArnaud A. de Grandmaison       CCmd(db->getCompileCommands(CompleteFileName));
552b3c8603SArnaud A. de Grandmaison     if (!CCmd.empty())
562b3c8603SArnaud A. de Grandmaison       return new AllocatedCXCompileCommands( CCmd );
572b3c8603SArnaud A. de Grandmaison   }
582b3c8603SArnaud A. de Grandmaison 
592b3c8603SArnaud A. de Grandmaison   return 0;
602b3c8603SArnaud A. de Grandmaison }
612b3c8603SArnaud A. de Grandmaison 
62251ad5e0SArgyrios Kyrtzidis CXCompileCommands
63251ad5e0SArgyrios Kyrtzidis clang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) {
64251ad5e0SArgyrios Kyrtzidis   if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
65251ad5e0SArgyrios Kyrtzidis     const std::vector<CompileCommand> CCmd(db->getAllCompileCommands());
66251ad5e0SArgyrios Kyrtzidis     if (!CCmd.empty())
67251ad5e0SArgyrios Kyrtzidis       return new AllocatedCXCompileCommands( CCmd );
68251ad5e0SArgyrios Kyrtzidis   }
69251ad5e0SArgyrios Kyrtzidis 
70251ad5e0SArgyrios Kyrtzidis   return 0;
71251ad5e0SArgyrios Kyrtzidis }
72251ad5e0SArgyrios Kyrtzidis 
732b3c8603SArnaud A. de Grandmaison void
74fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_dispose(CXCompileCommands Cmds)
752b3c8603SArnaud A. de Grandmaison {
762b3c8603SArnaud A. de Grandmaison   delete static_cast<AllocatedCXCompileCommands *>(Cmds);
772b3c8603SArnaud A. de Grandmaison }
782b3c8603SArnaud A. de Grandmaison 
792b3c8603SArnaud A. de Grandmaison unsigned
80fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getSize(CXCompileCommands Cmds)
812b3c8603SArnaud A. de Grandmaison {
822b3c8603SArnaud A. de Grandmaison   if (!Cmds)
832b3c8603SArnaud A. de Grandmaison     return 0;
842b3c8603SArnaud A. de Grandmaison 
852b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands *ACC =
862b3c8603SArnaud A. de Grandmaison     static_cast<AllocatedCXCompileCommands *>(Cmds);
872b3c8603SArnaud A. de Grandmaison 
882b3c8603SArnaud A. de Grandmaison   return ACC->CCmd.size();
892b3c8603SArnaud A. de Grandmaison }
902b3c8603SArnaud A. de Grandmaison 
912b3c8603SArnaud A. de Grandmaison CXCompileCommand
92fa6d73ccSArnaud A. de Grandmaison clang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I)
932b3c8603SArnaud A. de Grandmaison {
942b3c8603SArnaud A. de Grandmaison   if (!Cmds)
952b3c8603SArnaud A. de Grandmaison     return 0;
962b3c8603SArnaud A. de Grandmaison 
972b3c8603SArnaud A. de Grandmaison   AllocatedCXCompileCommands *ACC =
982b3c8603SArnaud A. de Grandmaison     static_cast<AllocatedCXCompileCommands *>(Cmds);
992b3c8603SArnaud A. de Grandmaison 
1002b3c8603SArnaud A. de Grandmaison   if (I >= ACC->CCmd.size())
1012b3c8603SArnaud A. de Grandmaison     return 0;
1022b3c8603SArnaud A. de Grandmaison 
1032b3c8603SArnaud A. de Grandmaison   return &ACC->CCmd[I];
1042b3c8603SArnaud A. de Grandmaison }
1052b3c8603SArnaud A. de Grandmaison 
1062b3c8603SArnaud A. de Grandmaison CXString
107fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getDirectory(CXCompileCommand CCmd)
1082b3c8603SArnaud A. de Grandmaison {
1092b3c8603SArnaud A. de Grandmaison   if (!CCmd)
110*f98dfbaeSDmitri Gribenko     return cxstring::createNull();
1112b3c8603SArnaud A. de Grandmaison 
1122b3c8603SArnaud A. de Grandmaison   CompileCommand *cmd = static_cast<CompileCommand *>(CCmd);
1136a33de18SArgyrios Kyrtzidis   return createCXString(cmd->Directory.c_str(), /*DupString=*/false);
1142b3c8603SArnaud A. de Grandmaison }
1152b3c8603SArnaud A. de Grandmaison 
1162b3c8603SArnaud A. de Grandmaison unsigned
117fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getNumArgs(CXCompileCommand CCmd)
1182b3c8603SArnaud A. de Grandmaison {
1192b3c8603SArnaud A. de Grandmaison   if (!CCmd)
1202b3c8603SArnaud A. de Grandmaison     return 0;
1212b3c8603SArnaud A. de Grandmaison 
1222b3c8603SArnaud A. de Grandmaison   return static_cast<CompileCommand *>(CCmd)->CommandLine.size();
1232b3c8603SArnaud A. de Grandmaison }
1242b3c8603SArnaud A. de Grandmaison 
1252b3c8603SArnaud A. de Grandmaison CXString
126fa6d73ccSArnaud A. de Grandmaison clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg)
1272b3c8603SArnaud A. de Grandmaison {
1282b3c8603SArnaud A. de Grandmaison   if (!CCmd)
129*f98dfbaeSDmitri Gribenko     return cxstring::createNull();
1302b3c8603SArnaud A. de Grandmaison 
1312b3c8603SArnaud A. de Grandmaison   CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
1322b3c8603SArnaud A. de Grandmaison 
1332b3c8603SArnaud A. de Grandmaison   if (Arg >= Cmd->CommandLine.size())
134*f98dfbaeSDmitri Gribenko     return cxstring::createNull();
1352b3c8603SArnaud A. de Grandmaison 
1366a33de18SArgyrios Kyrtzidis   return createCXString(Cmd->CommandLine[Arg].c_str(), /*DupString=*/false);
1372b3c8603SArnaud A. de Grandmaison }
1382b3c8603SArnaud A. de Grandmaison 
1392b3c8603SArnaud A. de Grandmaison 
1402b3c8603SArnaud A. de Grandmaison } // end: extern "C"
141