1db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison#include "clang-c/CXCompilationDatabase.h"
2db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison#include "clang/Tooling/CompilationDatabase.h"
3db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison#include "CXString.h"
4db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
5db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonusing namespace clang;
6db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonusing namespace clang::tooling;
7db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonusing namespace clang::cxstring;
8db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
9db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonextern "C" {
10db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
11db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison// FIXME: do something more usefull with the error message
12db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXCompilationDatabase
13c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompilationDatabase_fromDirectory(const char *BuildDir,
14c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaison                                        CXCompilationDatabase_Error *ErrorCode)
15db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
16db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  std::string ErrorMsg;
17db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError;
18db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
19db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  CompilationDatabase *db = CompilationDatabase::loadFromDirectory(BuildDir,
20db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison                                                                   ErrorMsg);
21db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
22db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!db) {
23db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    fprintf(stderr, "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str());
24db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    Err = CXCompilationDatabase_CanNotLoadDatabase;
25db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  }
26db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
27db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (ErrorCode)
28db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    *ErrorCode = Err;
29db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
30db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return db;
31db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
32db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
33db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonvoid
34c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompilationDatabase_dispose(CXCompilationDatabase CDb)
35db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
36db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  delete static_cast<CompilationDatabase *>(CDb);
37db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
38db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
39db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonstruct AllocatedCXCompileCommands
40db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
41db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  std::vector<CompileCommand> CCmd;
42db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
43db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  AllocatedCXCompileCommands(const std::vector<CompileCommand>& Cmd)
44db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    : CCmd(Cmd)
45db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  { }
46db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison};
47db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
48db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXCompileCommands
49c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb,
50c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaison                                             const char *CompleteFileName)
51db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
52db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
53db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    const std::vector<CompileCommand>
54db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison      CCmd(db->getCompileCommands(CompleteFileName));
55db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    if (!CCmd.empty())
56db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison      return new AllocatedCXCompileCommands( CCmd );
57db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  }
58db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
59db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return 0;
60db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
61db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
62db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonvoid
63c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_dispose(CXCompileCommands Cmds)
64db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
65db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  delete static_cast<AllocatedCXCompileCommands *>(Cmds);
66db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
67db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
68db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonunsigned
69c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_getSize(CXCompileCommands Cmds)
70db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
71db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!Cmds)
72db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return 0;
73db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
74db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  AllocatedCXCompileCommands *ACC =
75db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    static_cast<AllocatedCXCompileCommands *>(Cmds);
76db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
77db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return ACC->CCmd.size();
78db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
79db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
80db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXCompileCommand
81c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I)
82db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
83db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!Cmds)
84db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return 0;
85db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
86db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  AllocatedCXCompileCommands *ACC =
87db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    static_cast<AllocatedCXCompileCommands *>(Cmds);
88db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
89db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (I >= ACC->CCmd.size())
90db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return 0;
91db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
92db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return &ACC->CCmd[I];
93db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
94db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
95db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXString
96c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getDirectory(CXCompileCommand CCmd)
97db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
98db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!CCmd)
99db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return createCXString((const char*)NULL);
100db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
101db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  CompileCommand *cmd = static_cast<CompileCommand *>(CCmd);
102db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return createCXString(cmd->Directory);
103db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
104db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
105db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonunsigned
106c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getNumArgs(CXCompileCommand CCmd)
107db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
108db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!CCmd)
109db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return 0;
110db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
111db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return static_cast<CompileCommand *>(CCmd)->CommandLine.size();
112db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
113db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
114db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXString
115c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg)
116db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
117db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!CCmd)
118db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return createCXString((const char*)NULL);
119db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
120db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
121db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
122db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (Arg >= Cmd->CommandLine.size())
123db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return createCXString((const char*)NULL);
124db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
125db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return createCXString(Cmd->CommandLine[Arg]);
126db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
127db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
128db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
129db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} // end: extern "C"
130