26 #include "clang/AST/AST.h" 27 #include "clang/AST/Decl.h" 28 #include "clang/ASTMatchers/ASTMatchFinder.h" 29 #include "clang/ASTMatchers/ASTMatchersInternal.h" 30 #include "clang/Driver/Options.h" 31 #include "clang/Frontend/FrontendActions.h" 32 #include "clang/Tooling/CommonOptionsParser.h" 33 #include "clang/Tooling/Execution.h" 34 #include "clang/Tooling/StandaloneExecution.h" 35 #include "clang/Tooling/Tooling.h" 36 #include "llvm/ADT/APFloat.h" 37 #include "llvm/Support/Error.h" 38 #include "llvm/Support/FileSystem.h" 39 #include "llvm/Support/Path.h" 40 #include "llvm/Support/Process.h" 41 #include "llvm/Support/Signals.h" 42 #include "llvm/Support/raw_ostream.h" 47 using namespace clang;
49 static llvm::cl::extrahelp
CommonHelp(CommonOptionsParser::HelpMessage);
52 static llvm::cl::opt<std::string>
54 llvm::cl::desc(
"Directory for outputting generated files."),
57 static llvm::cl::opt<bool>
59 llvm::cl::desc(
"Dump mapper results to bitcode file."),
64 llvm::cl::desc(
"Dump intermediate results to bitcode file."),
67 static llvm::cl::opt<bool>
68 PublicOnly(
"public", llvm::cl::desc(
"Document only public declarations."),
75 static llvm::cl::opt<OutputFormatTy>
FormatEnum(
76 "format", llvm::cl::desc(
"Format for outputted docs."),
77 llvm::cl::values(clEnumVal(
yaml,
"Documentation in YAML format.")),
82 llvm::cl::desc(
"Use only doxygen-style comments to generate docs."),
87 llvm::SmallString<128> DocsRootPath;
89 std::error_code RemoveStatus = llvm::sys::fs::remove_directories(DirName);
90 if (RemoveStatus != OK) {
91 llvm::errs() <<
"Unable to remove existing documentation directory for " 96 std::error_code DirectoryStatus = llvm::sys::fs::create_directories(DirName);
97 if (DirectoryStatus != OK) {
98 llvm::errs() <<
"Unable to create documentation directories.\n";
105 StringRef Buffer,
bool ClearDirectory =
false) {
107 llvm::SmallString<128> IRRootPath;
109 llvm::sys::path::append(IRRootPath, DirName);
112 llvm::sys::path::append(IRRootPath, FileName);
113 std::error_code OutErrorInfo;
114 llvm::raw_fd_ostream OS(IRRootPath, OutErrorInfo, llvm::sys::fs::F_None);
115 if (OutErrorInfo != OK) {
116 llvm::errs() <<
"Error opening documentation file.\n";
124 llvm::Expected<llvm::SmallString<128>>
126 llvm::SmallVectorImpl<doc::Reference> &Namespaces) {
128 llvm::SmallString<128>
Path;
129 llvm::sys::path::native(Root, Path);
130 for (
auto R = Namespaces.rbegin(), E = Namespaces.rend(); R != E; ++R)
131 llvm::sys::path::append(Path, R->Name);
134 return llvm::make_error<llvm::StringError>(
"Unable to create directory.\n",
135 llvm::inconvertibleErrorCode());
137 llvm::sys::path::append(Path, Name + Ext);
146 llvm_unreachable(
"Unknown OutputFormatTy");
149 int main(
int argc,
const char **argv) {
150 llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
157 llvm::errs() <<
toString(G.takeError()) <<
"\n";
161 auto Exec = clang::tooling::createExecutorFromCommandLineArgs(
165 llvm::errs() <<
toString(Exec.takeError()) <<
"\n";
169 ArgumentsAdjuster ArgAdjuster;
171 ArgAdjuster = combineAdjusters(
172 getInsertArgumentAdjuster(
"-fparse-all-comments",
173 tooling::ArgumentInsertPosition::END),
177 llvm::outs() <<
"Mapping decls...\n";
183 llvm::errs() <<
toString(std::move(Err)) <<
"\n";
189 Exec->get()->getToolResults()->forEachResult(
190 [&](StringRef Key, StringRef Value) {
194 llvm::errs() <<
"Error dumping map results.\n";
199 llvm::outs() <<
"Collecting infos...\n";
200 llvm::StringMap<std::vector<std::unique_ptr<doc::Info>>> MapOutput;
204 Exec->get()->getToolResults()->forEachResult([&](StringRef Key,
206 llvm::BitstreamCursor Stream(Value);
209 for (
auto &I : Infos) {
211 MapOutput.try_emplace(Key, std::vector<std::unique_ptr<doc::Info>>());
212 R.first->second.emplace_back(std::move(I));
217 llvm::outs() <<
"Reducing " << MapOutput.size() <<
" infos...\n";
218 llvm::StringMap<std::unique_ptr<doc::Info>> ReduceOutput;
219 for (
auto &Group : MapOutput) {
225 SmallString<4096> Buffer;
226 llvm::BitstreamWriter Stream(Buffer);
230 llvm::errs() <<
"Error dumping to bitcode.\n";
238 llvm::errs() <<
toString(InfoPath.takeError()) <<
"\n";
241 std::error_code FileErr;
242 llvm::raw_fd_ostream InfoOS(InfoPath.get(), FileErr, llvm::sys::fs::F_None);
244 llvm::errs() <<
"Error opening index file: " << FileErr.message() <<
"\n";
248 if (G->get()->generateDocForInfo(I, InfoOS))
249 llvm::errs() <<
"Unable to generate docs for info.\n";
llvm::SmallVector< Reference, 4 > Namespace
bool dispatchInfoForWrite(Info *I)
static llvm::StringRef toString(SpecialMemberFunctionsCheck::SpecialMemberFunctionKind K)
std::string getFormatString(OutputFormatTy Ty)
bool CreateDirectory(const Twine &DirName, bool ClearDirectory=false)
std::vector< HeaderHandle > Path
static llvm::cl::opt< bool > PublicOnly("public", llvm::cl::desc("Document only public declarations."), llvm::cl::init(false), llvm::cl::cat(ClangDocCategory))
llvm::Expected< std::unique_ptr< Generator > > findGeneratorByName(llvm::StringRef Format)
static llvm::cl::opt< std::string > OutDirectory("output", llvm::cl::desc("Directory for outputting generated files."), llvm::cl::init("docs"), llvm::cl::cat(ClangDocCategory))
static llvm::cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage)
int main(int argc, const char **argv)
static llvm::cl::opt< bool > DoxygenOnly("doxygen", llvm::cl::desc("Use only doxygen-style comments to generate docs."), llvm::cl::init(false), llvm::cl::cat(ClangDocCategory))
llvm::Expected< std::unique_ptr< Info > > mergeInfos(std::vector< std::unique_ptr< Info >> &Values)
llvm::Expected< llvm::SmallString< 128 > > getPath(StringRef Root, StringRef Ext, StringRef Name, llvm::SmallVectorImpl< doc::Reference > &Namespaces)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
bool DumpResultToFile(const Twine &DirName, const Twine &FileName, StringRef Buffer, bool ClearDirectory=false)
static llvm::cl::opt< bool > DumpMapperResult("dump-mapper", llvm::cl::desc("Dump mapper results to bitcode file."), llvm::cl::init(false), llvm::cl::cat(ClangDocCategory))
static llvm::cl::opt< OutputFormatTy > FormatEnum("format", llvm::cl::desc("Format for outputted docs."), llvm::cl::values(clEnumVal(yaml, "Documentation in YAML format.")), llvm::cl::init(yaml), llvm::cl::cat(ClangDocCategory))
static llvm::cl::OptionCategory ClangDocCategory("clang-doc options")
static llvm::cl::opt< bool > DumpIntermediateResult("dump-intermediate", llvm::cl::desc("Dump intermediate results to bitcode file."), llvm::cl::init(false), llvm::cl::cat(ClangDocCategory))
std::unique_ptr< tooling::FrontendActionFactory > newMapperActionFactory(ClangDocContext CDCtx)
std::vector< std::unique_ptr< Info > > readBitcode()