1 | #include "clang-c/CXCompilationDatabase.h" |
---|---|
2 | #include "CXString.h" |
3 | #include "clang/Tooling/CompilationDatabase.h" |
4 | #include <cstdio> |
5 | |
6 | using namespace clang; |
7 | using namespace clang::tooling; |
8 | |
9 | // FIXME: do something more useful with the error message |
10 | CXCompilationDatabase |
11 | clang_CompilationDatabase_fromDirectory(const char *BuildDir, |
12 | CXCompilationDatabase_Error *ErrorCode) |
13 | { |
14 | std::string ErrorMsg; |
15 | CXCompilationDatabase_Error Err = CXCompilationDatabase_NoError; |
16 | |
17 | std::unique_ptr<CompilationDatabase> db = |
18 | CompilationDatabase::loadFromDirectory(BuildDirectory: BuildDir, ErrorMessage&: ErrorMsg); |
19 | |
20 | if (!db) { |
21 | fprintf(stderr, format: "LIBCLANG TOOLING ERROR: %s\n", ErrorMsg.c_str()); |
22 | Err = CXCompilationDatabase_CanNotLoadDatabase; |
23 | } |
24 | |
25 | if (ErrorCode) |
26 | *ErrorCode = Err; |
27 | |
28 | return db.release(); |
29 | } |
30 | |
31 | void |
32 | clang_CompilationDatabase_dispose(CXCompilationDatabase CDb) |
33 | { |
34 | delete static_cast<CompilationDatabase *>(CDb); |
35 | } |
36 | |
37 | struct AllocatedCXCompileCommands |
38 | { |
39 | std::vector<CompileCommand> CCmd; |
40 | |
41 | AllocatedCXCompileCommands(std::vector<CompileCommand> Cmd) |
42 | : CCmd(std::move(Cmd)) {} |
43 | }; |
44 | |
45 | CXCompileCommands |
46 | clang_CompilationDatabase_getCompileCommands(CXCompilationDatabase CDb, |
47 | const char *CompleteFileName) |
48 | { |
49 | if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { |
50 | std::vector<CompileCommand> CCmd(db->getCompileCommands(FilePath: CompleteFileName)); |
51 | if (!CCmd.empty()) |
52 | return new AllocatedCXCompileCommands(std::move(CCmd)); |
53 | } |
54 | |
55 | return nullptr; |
56 | } |
57 | |
58 | CXCompileCommands |
59 | clang_CompilationDatabase_getAllCompileCommands(CXCompilationDatabase CDb) { |
60 | if (CompilationDatabase *db = static_cast<CompilationDatabase *>(CDb)) { |
61 | std::vector<CompileCommand> CCmd(db->getAllCompileCommands()); |
62 | if (!CCmd.empty()) |
63 | return new AllocatedCXCompileCommands(std::move(CCmd)); |
64 | } |
65 | |
66 | return nullptr; |
67 | } |
68 | |
69 | void |
70 | clang_CompileCommands_dispose(CXCompileCommands Cmds) |
71 | { |
72 | delete static_cast<AllocatedCXCompileCommands *>(Cmds); |
73 | } |
74 | |
75 | unsigned |
76 | clang_CompileCommands_getSize(CXCompileCommands Cmds) |
77 | { |
78 | if (!Cmds) |
79 | return 0; |
80 | |
81 | AllocatedCXCompileCommands *ACC = |
82 | static_cast<AllocatedCXCompileCommands *>(Cmds); |
83 | |
84 | return ACC->CCmd.size(); |
85 | } |
86 | |
87 | CXCompileCommand |
88 | clang_CompileCommands_getCommand(CXCompileCommands Cmds, unsigned I) |
89 | { |
90 | if (!Cmds) |
91 | return nullptr; |
92 | |
93 | AllocatedCXCompileCommands *ACC = |
94 | static_cast<AllocatedCXCompileCommands *>(Cmds); |
95 | |
96 | if (I >= ACC->CCmd.size()) |
97 | return nullptr; |
98 | |
99 | return &ACC->CCmd[I]; |
100 | } |
101 | |
102 | CXString |
103 | clang_CompileCommand_getDirectory(CXCompileCommand CCmd) |
104 | { |
105 | if (!CCmd) |
106 | return cxstring::createNull(); |
107 | |
108 | CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); |
109 | return cxstring::createRef(String: cmd->Directory.c_str()); |
110 | } |
111 | |
112 | CXString |
113 | clang_CompileCommand_getFilename(CXCompileCommand CCmd) |
114 | { |
115 | if (!CCmd) |
116 | return cxstring::createNull(); |
117 | |
118 | CompileCommand *cmd = static_cast<CompileCommand *>(CCmd); |
119 | return cxstring::createRef(String: cmd->Filename.c_str()); |
120 | } |
121 | |
122 | unsigned |
123 | clang_CompileCommand_getNumArgs(CXCompileCommand CCmd) |
124 | { |
125 | if (!CCmd) |
126 | return 0; |
127 | |
128 | return static_cast<CompileCommand *>(CCmd)->CommandLine.size(); |
129 | } |
130 | |
131 | CXString |
132 | clang_CompileCommand_getArg(CXCompileCommand CCmd, unsigned Arg) |
133 | { |
134 | if (!CCmd) |
135 | return cxstring::createNull(); |
136 | |
137 | CompileCommand *Cmd = static_cast<CompileCommand *>(CCmd); |
138 | |
139 | if (Arg >= Cmd->CommandLine.size()) |
140 | return cxstring::createNull(); |
141 | |
142 | return cxstring::createRef(String: Cmd->CommandLine[Arg].c_str()); |
143 | } |
144 | |
145 | unsigned |
146 | clang_CompileCommand_getNumMappedSources(CXCompileCommand CCmd) |
147 | { |
148 | // Left here for backward compatibility. No mapped sources exists in the C++ |
149 | // backend anymore. |
150 | return 0; |
151 | } |
152 | |
153 | CXString |
154 | clang_CompileCommand_getMappedSourcePath(CXCompileCommand CCmd, unsigned I) |
155 | { |
156 | // Left here for backward compatibility. No mapped sources exists in the C++ |
157 | // backend anymore. |
158 | return cxstring::createNull(); |
159 | } |
160 | |
161 | CXString |
162 | clang_CompileCommand_getMappedSourceContent(CXCompileCommand CCmd, unsigned I) |
163 | { |
164 | // Left here for backward compatibility. No mapped sources exists in the C++ |
165 | // backend anymore. |
166 | return cxstring::createNull(); |
167 | } |
168 |