[index] Provide a more general index::generateUSRForMacro() that doesn't depend on having a PreprocessingRecord.

llvm-svn: 293904
This commit is contained in:
Argyrios Kyrtzidis 2017-02-02 16:13:10 +00:00
parent f3e421d6e9
commit 5b7a09aca4
2 changed files with 15 additions and 3 deletions

View File

@ -16,6 +16,7 @@
namespace clang {
class Decl;
class MacroDefinitionRecord;
class SourceLocation;
class SourceManager;
namespace index {
@ -54,6 +55,8 @@ void generateUSRForObjCProtocol(StringRef Prot, raw_ostream &OS);
/// \returns true on error, false on success.
bool generateUSRForMacro(const MacroDefinitionRecord *MD,
const SourceManager &SM, SmallVectorImpl<char> &Buf);
bool generateUSRForMacro(StringRef MacroName, SourceLocation Loc,
const SourceManager &SM, SmallVectorImpl<char> &Buf);
} // namespace index
} // namespace clang

View File

@ -911,21 +911,30 @@ bool clang::index::generateUSRForDecl(const Decl *D,
bool clang::index::generateUSRForMacro(const MacroDefinitionRecord *MD,
const SourceManager &SM,
SmallVectorImpl<char> &Buf) {
if (!MD)
return true;
return generateUSRForMacro(MD->getName()->getName(), MD->getLocation(),
SM, Buf);
}
bool clang::index::generateUSRForMacro(StringRef MacroName, SourceLocation Loc,
const SourceManager &SM,
SmallVectorImpl<char> &Buf) {
// Don't generate USRs for things with invalid locations.
if (!MD || MD->getLocation().isInvalid())
if (MacroName.empty() || Loc.isInvalid())
return true;
llvm::raw_svector_ostream Out(Buf);
// Assume that system headers are sane. Don't put source location
// information into the USR if the macro comes from a system header.
SourceLocation Loc = MD->getLocation();
bool ShouldGenerateLocation = !SM.isInSystemHeader(Loc);
Out << getUSRSpacePrefix();
if (ShouldGenerateLocation)
printLoc(Out, Loc, SM, /*IncludeOffset=*/true);
Out << "@macro@";
Out << MD->getName()->getName();
Out << MacroName;
return false;
}