13 #include "clang/ASTMatchers/ASTMatchFinder.h" 14 #include "clang/ASTMatchers/ASTMatchers.h" 15 #include "clang/Frontend/CompilerInstance.h" 16 #include "clang/Frontend/FrontendActions.h" 17 #include "clang/Lex/Preprocessor.h" 18 #include "clang/Tooling/CommonOptionsParser.h" 19 #include "clang/Tooling/Tooling.h" 20 #include "llvm/ADT/ArrayRef.h" 21 #include "llvm/ADT/SmallString.h" 22 #include "llvm/ADT/StringRef.h" 23 #include "llvm/Support/CommandLine.h" 24 #include "llvm/Support/FileSystem.h" 25 #include "llvm/Support/MemoryBuffer.h" 26 #include "llvm/Support/Path.h" 27 #include "llvm/Support/ThreadPool.h" 28 #include "llvm/Support/raw_ostream.h" 33 #include <system_error> 47 static cl::extrahelp
CommonHelp(CommonOptionsParser::HelpMessage);
50 static cl::extrahelp
MoreHelp(
"\nMore help text...");
52 static cl::opt<std::string>
OutputDir(
"output-dir", cl::desc(R
"( 53 The output directory for saving the results.)"), 57 static cl::opt<std::string>
MergeDir(
"merge-dir", cl::desc(R
"( 58 The directory for merging symbols.)"), 62 namespace find_all_symbols {
66 void reportSymbols(StringRef
FileName,
69 SmallString<128> ResultPath;
70 llvm::sys::fs::createUniqueFile(
71 OutputDir +
"/" + llvm::sys::path::filename(FileName) +
"-%%%%%%.yaml",
73 llvm::raw_fd_ostream OS(FD,
true);
78 bool Merge(llvm::StringRef
MergeDir, llvm::StringRef OutputFile) {
81 std::mutex SymbolMutex;
82 auto AddSymbols = [&](ArrayRef<SymbolAndSignals> NewSymbols) {
84 std::unique_lock<std::mutex> LockGuard(SymbolMutex);
85 for (
const auto &Symbol : NewSymbols) {
86 Symbols[Symbol.Symbol] += Symbol.Signals;
92 llvm::ThreadPool Pool;
93 for (llvm::sys::fs::directory_iterator Dir(MergeDir, EC), DirEnd;
94 Dir != DirEnd && !EC; Dir.increment(EC)) {
97 [&AddSymbols](std::string
Path) {
98 auto Buffer = llvm::MemoryBuffer::getFile(Path);
100 llvm::errs() <<
"Can't open " << Path <<
"\n";
103 std::vector<SymbolAndSignals> Symbols =
105 for (
auto &Symbol : Symbols) {
107 Symbol.Signals.Seen = std::min(Symbol.Signals.Seen, 1u);
108 Symbol.Signals.Used = std::min(Symbol.Signals.Used, 1u);
117 llvm::raw_fd_ostream OS(OutputFile, EC, llvm::sys::fs::F_None);
119 llvm::errs() <<
"Can't open '" << OutputFile <<
"': " << EC.message()
130 int main(
int argc,
const char **argv) {
132 ClangTool Tool(OptionsParser.getCompilations(),
133 OptionsParser.getSourcePathList());
135 std::vector<std::string> sources = OptionsParser.getSourcePathList();
136 if (sources.empty()) {
137 llvm::errs() <<
"Must specify at least one one source file.\n";
148 llvm::make_unique<clang::find_all_symbols::FindAllSymbolsActionFactory>(
150 return Tool.run(Factory.get());
Some operations such as code completion produce a set of candidates.
int main(int argc, const char **argv)
bool WriteSymbolInfosToStream(llvm::raw_ostream &OS, const SymbolInfo::SignalMap &Symbols)
Write SymbolInfos to a stream (YAML format).
std::vector< HeaderHandle > Path
std::vector< SymbolAndSignals > ReadSymbolInfosFromYAML(llvm::StringRef Yaml)
Read SymbolInfos from a YAML document.
static cl::OptionCategory FindAllSymbolsCategory("find_all_symbols options")
clang::find_all_symbols::SymbolInfo SymbolInfo
static cl::extrahelp MoreHelp("\ore help text...")
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage)
static cl::opt< std::string > MergeDir("merge-dir", cl::desc(R"(
The directory for merging symbols.)"), cl::init(""), cl::cat(FindAllSymbolsCategory))
static cl::opt< std::string > OutputDir("output-dir", cl::desc(R"(
The output directory for saving the results.)"), cl::init("."), cl::cat(FindAllSymbolsCategory))
An interface for classes that collect symbols.
bool Merge(llvm::StringRef MergeDir, llvm::StringRef OutputFile)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
const HeaderMapCollector::RegexHeaderMap * getSTLPostfixHeaderMap()
std::map< SymbolInfo, Signals > SignalMap
Describes a named symbol from a header.