зеркало из https://github.com/microsoft/clang-1.git
Hoist the logic I added to compute the macro name into a helper
function. No functionality changed. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142128 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a47129e97b
Коммит
fe627b0e16
|
@ -389,6 +389,35 @@ static bool printWordWrapped(raw_ostream &OS, StringRef Str,
|
||||||
return Wrapped;
|
return Wrapped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// \brief Retrieve the name of the immediate macro expansion.
|
||||||
|
///
|
||||||
|
/// This routine starts from a source location, and finds the name of the macro
|
||||||
|
/// responsible for its immediate expansion. It looks through any intervening
|
||||||
|
/// macro argument expansions to compute this. It returns a StringRef which
|
||||||
|
/// refers to the SourceManager-owned buffer of the source where that macro
|
||||||
|
/// name is spelled. Thus, the result shouldn't out-live that SourceManager.
|
||||||
|
///
|
||||||
|
static StringRef getImmediateMacroName(SourceLocation Loc,
|
||||||
|
const SourceManager &SM,
|
||||||
|
const LangOptions &LangOpts) {
|
||||||
|
assert(Loc.isMacroID() && "Only reasonble to call this on macros");
|
||||||
|
// Walk past macro argument expanions.
|
||||||
|
while (SM.isMacroArgExpansion(Loc))
|
||||||
|
Loc = SM.getImmediateExpansionRange(Loc).first;
|
||||||
|
|
||||||
|
// Find the spelling location of the start of the non-argument expansion
|
||||||
|
// range. This is where the macro name was spelled in order to begin
|
||||||
|
// expanding this macro.
|
||||||
|
Loc = SM.getSpellingLoc(SM.getImmediateExpansionRange(Loc).first);
|
||||||
|
|
||||||
|
// Dig out the buffer where the macro name was spelled and the extents of the
|
||||||
|
// name so that we can render it into the expansion note.
|
||||||
|
std::pair<FileID, unsigned> ExpansionInfo = SM.getDecomposedLoc(Loc);
|
||||||
|
unsigned MacroTokenLength = Lexer::MeasureTokenLength(Loc, SM, LangOpts);
|
||||||
|
StringRef ExpansionBuffer = SM.getBufferData(ExpansionInfo.first);
|
||||||
|
return ExpansionBuffer.substr(ExpansionInfo.second, MacroTokenLength);
|
||||||
|
}
|
||||||
|
|
||||||
TextDiagnostic::TextDiagnostic(raw_ostream &OS,
|
TextDiagnostic::TextDiagnostic(raw_ostream &OS,
|
||||||
const SourceManager &SM,
|
const SourceManager &SM,
|
||||||
const LangOptions &LangOpts,
|
const LangOptions &LangOpts,
|
||||||
|
@ -729,25 +758,10 @@ void TextDiagnostic::emitMacroExpansionsAndCarets(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Walk past macro argument expanions.
|
|
||||||
while (SM.isMacroArgExpansion(MacroLoc))
|
|
||||||
MacroLoc = SM.getImmediateExpansionRange(MacroLoc).first;
|
|
||||||
|
|
||||||
// Find the spelling location of the start of the non-argument expansion
|
|
||||||
// range. This is where the macro name was spelled in order to begin
|
|
||||||
// expanding this macro.
|
|
||||||
MacroLoc = SM.getSpellingLoc(SM.getImmediateExpansionRange(MacroLoc).first);
|
|
||||||
|
|
||||||
// Dig out the buffer where the macro name was spelled and the extents of the
|
|
||||||
// name so that we can render it into the expansion note.
|
|
||||||
std::pair<FileID, unsigned> ExpansionInfo = SM.getDecomposedLoc(MacroLoc);
|
|
||||||
unsigned MacroTokenLength = Lexer::MeasureTokenLength(MacroLoc, SM, LangOpts);
|
|
||||||
StringRef ExpansionBuffer = SM.getBufferData(ExpansionInfo.first);
|
|
||||||
|
|
||||||
llvm::SmallString<100> MessageStorage;
|
llvm::SmallString<100> MessageStorage;
|
||||||
llvm::raw_svector_ostream Message(MessageStorage);
|
llvm::raw_svector_ostream Message(MessageStorage);
|
||||||
Message << "expanded from macro: "
|
Message << "expanded from macro: "
|
||||||
<< ExpansionBuffer.substr(ExpansionInfo.second, MacroTokenLength);
|
<< getImmediateMacroName(MacroLoc, SM, LangOpts);
|
||||||
emitDiagnostic(SM.getSpellingLoc(Loc), DiagnosticsEngine::Note,
|
emitDiagnostic(SM.getSpellingLoc(Loc), DiagnosticsEngine::Note,
|
||||||
Message.str(),
|
Message.str(),
|
||||||
Ranges, ArrayRef<FixItHint>());
|
Ranges, ArrayRef<FixItHint>());
|
||||||
|
|
Загрузка…
Ссылка в новой задаче