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