forked from OSchip/llvm-project
[index] Provide a more general index::generateUSRForMacro() that doesn't depend on having a PreprocessingRecord.
llvm-svn: 293904
This commit is contained in:
parent
f3e421d6e9
commit
5b7a09aca4
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue