1db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison#include "clang-c/CXCompilationDatabase.h"
2db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison#include "CXString.h"
3f59edb96b2d0bfe612b732f19519ab84bb995bd4Chandler Carruth#include "clang/Tooling/CompilationDatabase.h"
49af20d8187384b841a6244ab81c8a57b010d72d0Dmitri Gribenko#include <cstdio>
5db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
6db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonusing namespace clang;
7db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonusing namespace clang::tooling;
8db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
9db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonextern "C" {
10db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: do something more useful 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
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  AllocatedCXCompileCommands(std::vector<CompileCommand> Cmd)
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : CCmd(std::move(Cmd)) {}
45db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison};
46db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
47db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXCompileCommands
48c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb,
49c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaison                                             const char *CompleteFileName)
50db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
51db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::vector<CompileCommand> CCmd(db->getCompileCommands(CompleteFileName));
53db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    if (!CCmd.empty())
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return new AllocatedCXCompileCommands(std::move(CCmd));
55db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  }
56db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
57ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return nullptr;
58db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
59db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
607e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios KyrtzidisCXCompileCommands
617e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidisclang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) {
627e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis  if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) {
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::vector<CompileCommand> CCmd(db->getAllCompileCommands());
647e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis    if (!CCmd.empty())
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return new AllocatedCXCompileCommands(std::move(CCmd));
667e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis  }
677e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis
68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return nullptr;
697e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis}
707e96bfb4d507700a122f270a11ce3fc0e8e36c85Argyrios Kyrtzidis
71db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonvoid
72c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_dispose(CXCompileCommands Cmds)
73db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
74db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  delete static_cast<AllocatedCXCompileCommands *>(Cmds);
75db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
76db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
77db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonunsigned
78c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_getSize(CXCompileCommands Cmds)
79db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
80db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!Cmds)
81db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return 0;
82db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
83db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  AllocatedCXCompileCommands *ACC =
84db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    static_cast<AllocatedCXCompileCommands *>(Cmds);
85db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
86db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return ACC->CCmd.size();
87db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
88db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
89db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXCompileCommand
90c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I)
91db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
92db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!Cmds)
93ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return nullptr;
94db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
95db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  AllocatedCXCompileCommands *ACC =
96db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    static_cast<AllocatedCXCompileCommands *>(Cmds);
97db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
98db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (I >= ACC->CCmd.size())
99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return nullptr;
100db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
101db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return &ACC->CCmd[I];
102db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
103db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
104db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXString
105c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getDirectory(CXCompileCommand CCmd)
106db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
107db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!CCmd)
108dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
109db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
110db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  CompileCommand *cmd = static_cast<CompileCommand *>(CCmd);
1110c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko  return cxstring::createRef(cmd->Directory.c_str());
112db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
113db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
114db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaisonunsigned
115c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getNumArgs(CXCompileCommand CCmd)
116db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
117db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!CCmd)
118db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison    return 0;
119db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
120db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  return static_cast<CompileCommand *>(CCmd)->CommandLine.size();
121db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
122db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
123db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de GrandmaisonCXString
124c70851b74c06b27df07b9a772656a2e663d432eeArnaud A. de Grandmaisonclang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg)
125db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison{
126db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (!CCmd)
127dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
128db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
129db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
130db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
131db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison  if (Arg >= Cmd->CommandLine.size())
132dad4c1a9ac4ef1aa591ac2ef20dc4c30d96f9f2aDmitri Gribenko    return cxstring::createNull();
133db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
1340c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko  return cxstring::createRef(Cmd->CommandLine[Arg].c_str());
135db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison}
136db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
137f88536af2cbbea3444c6488a1889520538250efbManuel Klimekunsigned
138f88536af2cbbea3444c6488a1889520538250efbManuel Klimekclang_CompileCommand_getNumMappedSources(CXCompileCommand CCmd)
139f88536af2cbbea3444c6488a1889520538250efbManuel Klimek{
140f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  if (!CCmd)
141f88536af2cbbea3444c6488a1889520538250efbManuel Klimek    return 0;
142f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
143f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  return static_cast<CompileCommand *>(CCmd)->MappedSources.size();
144f88536af2cbbea3444c6488a1889520538250efbManuel Klimek}
145f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
146f88536af2cbbea3444c6488a1889520538250efbManuel KlimekCXString
147f88536af2cbbea3444c6488a1889520538250efbManuel Klimekclang_CompileCommand_getMappedSourcePath(CXCompileCommand CCmd, unsigned I)
148f88536af2cbbea3444c6488a1889520538250efbManuel Klimek{
149f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  if (!CCmd)
150f88536af2cbbea3444c6488a1889520538250efbManuel Klimek    return cxstring::createNull();
151f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
152f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
153f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
154f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  if (I >= Cmd->MappedSources.size())
155f88536af2cbbea3444c6488a1889520538250efbManuel Klimek    return cxstring::createNull();
156f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
157f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  return cxstring::createRef(Cmd->MappedSources[I].first.c_str());
158f88536af2cbbea3444c6488a1889520538250efbManuel Klimek}
159f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
160f88536af2cbbea3444c6488a1889520538250efbManuel KlimekCXString
161f88536af2cbbea3444c6488a1889520538250efbManuel Klimekclang_CompileCommand_getMappedSourceContent(CXCompileCommand CCmd, unsigned I)
162f88536af2cbbea3444c6488a1889520538250efbManuel Klimek{
163f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  if (!CCmd)
164f88536af2cbbea3444c6488a1889520538250efbManuel Klimek    return cxstring::createNull();
165f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
166f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd);
167f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
168f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  if (I >= Cmd->MappedSources.size())
169f88536af2cbbea3444c6488a1889520538250efbManuel Klimek    return cxstring::createNull();
170f88536af2cbbea3444c6488a1889520538250efbManuel Klimek
171f88536af2cbbea3444c6488a1889520538250efbManuel Klimek  return cxstring::createRef(Cmd->MappedSources[I].second.c_str());
172f88536af2cbbea3444c6488a1889520538250efbManuel Klimek}
173db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison
174db29318326aba9e0c5c1bbba093687dccc38fc39Arnaud A. de Grandmaison} // end: extern "C"
175