16 #include "llvm/ADT/StringExtras.h"
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/ADT/Twine.h"
19 #include "llvm/Support/LineIterator.h"
20 #include "llvm/Support/MD5.h"
21 #include "llvm/Support/Path.h"
27 using namespace clang;
40 Target->getTemplateInstantiationPattern())
43 if (!isa<CXXConstructorDecl>(
Target) && !isa<CXXDestructorDecl>(
Target) &&
44 !isa<CXXConversionDecl>(
Target))
45 Signature.append(
Target->getReturnType().getAsString()).append(
" ");
46 Signature.append(
Target->getQualifiedNameAsString()).append(
"(");
48 for (
int i = 0, paramsCount =
Target->getNumParams(); i < paramsCount; ++i) {
50 Signature.append(
", ");
51 Signature.append(
Target->getParamDecl(i)->getType().getAsString());
55 Signature.append(
", ...");
56 Signature.append(
")");
59 llvm::dyn_cast_or_null<FunctionType>(
Target->getType().getTypePtr());
61 if (!TargetT || !isa<CXXMethodDecl>(
Target))
64 if (TargetT->isConst())
65 Signature.append(
" const");
66 if (TargetT->isVolatile())
67 Signature.append(
" volatile");
68 if (TargetT->isRestrict())
69 Signature.append(
" restrict");
71 if (
const auto *TargetPT =
72 dyn_cast_or_null<FunctionProtoType>(
Target->getType().getTypePtr())) {
73 switch (TargetPT->getRefQualifier()) {
75 Signature.append(
" &");
78 Signature.append(
" &&");
92 if (
const auto *ND = dyn_cast<NamedDecl>(D)) {
95 switch (ND->getKind()) {
100 DeclName = ND->getQualifiedNameAsString();
102 case Decl::CXXConstructor:
103 case Decl::CXXDestructor:
104 case Decl::CXXConversion:
105 case Decl::CXXMethod:
107 DeclName =
GetSignature(dyn_cast_or_null<FunctionDecl>(ND));
109 case Decl::ObjCMethod:
112 DeclName = ND->getQualifiedNameAsString();
129 llvm::line_iterator LI(*Buffer,
false);
130 for (; !LI.is_at_eof() && LI.line_number() !=
Line; ++LI)
138 static StringRef Whitespaces =
" \t\n";
142 StringRef::size_type col = Str.find_first_not_of(Whitespaces);
143 if (col == StringRef::npos)
150 SM.getBufferOrNone(
SM.getFileID(StartOfLine), StartOfLine);
154 const char *BufferPos =
SM.getCharacterData(StartOfLine);
157 Lexer Lexer(
SM.getLocForStartOfFile(
SM.getFileID(StartOfLine)), LangOpts,
158 Buffer->getBufferStart(), BufferPos, Buffer->getBufferEnd());
160 size_t NextStart = 0;
161 std::ostringstream LineBuff;
169 return LineBuff.str();
174 llvm::MD5::MD5Result MD5Res;
177 Hash.update(Content);
179 llvm::MD5::stringifyResult(MD5Res, Res);
185 StringRef CheckerName,
186 StringRef WarningMessage,
187 const Decl *IssueDecl,
189 static StringRef Delimiter =
"$";
191 return (llvm::Twine(CheckerName) + Delimiter +
195 Delimiter + WarningMessage)
200 StringRef CheckerName,
201 StringRef WarningMessage,
202 const Decl *IssueDecl,
206 IssueLoc, CheckerName, WarningMessage, IssueDecl, LangOpts));