15 #include "llvm/ADT/SetVector.h"
16 #include "llvm/Support/raw_ostream.h"
18 using namespace clang;
22 typedef llvm::SetVector<const CheckerRegistry::CheckerInfo *>
CheckerInfoSet;
31 StringRef packageName) {
33 if (!checker.
FullName.startswith(packageName))
37 if (checker.
FullName.size() == packageName.size())
48 const llvm::StringMap<size_t> &packageSizes,
52 CheckerRegistry::CheckerInfoList::const_iterator e = checkers.end();
53 CheckerRegistry::CheckerInfoList::const_iterator i =
54 std::lower_bound(checkers.begin(), e, packageInfo,
checkerNameLT);
70 llvm::StringMap<size_t>::const_iterator packageSize =
71 packageSizes.find(opt.
getName());
72 if (packageSize != packageSizes.end())
73 size = packageSize->getValue();
76 for (e = i+size; i != e; ++i) {
78 collected.insert(&*i);
80 collected.remove(&*i);
89 StringRef packageName, leafName;
91 while (!leafName.empty()) {
92 Packages[packageName] += 1;
105 i = opts.begin(), e = opts.end(); i != e; ++i) {
110 for (CheckerInfoSet::iterator
111 i = enabledCheckers.begin(), e = enabledCheckers.end(); i != e; ++i) {
113 (*i)->Initialize(checkerMgr);
119 for (
auto &config : opts.
Config) {
120 size_t pos = config.getKey().find(
':');
121 if (pos == StringRef::npos)
124 bool hasChecker =
false;
125 StringRef checkerName = config.getKey().substr(0, pos);
126 for (
auto &checker : Checkers) {
127 if (checker.FullName.startswith(checkerName) &&
128 (checker.FullName.size() == pos || checker.FullName[pos] ==
'.')) {
134 diags.
Report(diag::err_unknown_analyzer_checker) << checkerName;
140 size_t maxNameChars)
const {
148 out <<
"CHECKERS:\n";
151 size_t optionFieldWidth = 0;
152 for (CheckerInfoList::const_iterator i = Checkers.begin(), e = Checkers.end();
156 size_t nameLength = i->FullName.size();
157 if (nameLength <= maxNameChars)
158 optionFieldWidth = std::max(optionFieldWidth, nameLength);
161 const size_t initialPad = 2;
162 for (CheckerInfoList::const_iterator i = Checkers.begin(), e = Checkers.end();
164 out.indent(initialPad) << i->FullName;
166 int pad = optionFieldWidth - i->FullName.size();
171 pad = optionFieldWidth + initialPad;
173 out.indent(pad + 2) << i->Desc;
static void collectCheckers(const CheckerRegistry::CheckerInfoList &checkers, const llvm::StringMap< size_t > &packageSizes, CheckerOptInfo &opt, CheckerInfoSet &collected)
static const char PackageSeparator
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
llvm::SetVector< const CheckerRegistry::CheckerInfo * > CheckerInfoSet
void addChecker(InitializationFunction fn, StringRef fullName, StringRef desc)
void setCurrentCheckName(CheckName name)
Concrete class used by the front-end to report problems and issues.
StringRef getName() const
ConfigTable Config
A key-value table of use-specified configuration values.
void printHelp(raw_ostream &out, size_t maxNameChars=30) const
static bool checkerNameLT(const CheckerRegistry::CheckerInfo &a, const CheckerRegistry::CheckerInfo &b)
Defines the Diagnostic-related interfaces.
void validateCheckerOptions(const AnalyzerOptions &opts, DiagnosticsEngine &diags) const
Check if every option corresponds to a specific checker or package.
static bool isInPackage(const CheckerRegistry::CheckerInfo &checker, StringRef packageName)
std::vector< CheckerInfo > CheckerInfoList