Introduce Lexer::getSourceText() that returns a string for the source

that the given source range encompasses.

llvm-svn: 148481
This commit is contained in:
Argyrios Kyrtzidis 2012-01-19 15:59:19 +00:00
parent a99e02d019
commit 7838a2bffb
3 changed files with 53 additions and 0 deletions

View File

@ -339,6 +339,12 @@ public:
const SourceManager &SM,
const LangOptions &LangOpts);
/// \brief Returns a string for the source that the range encompasses.
static StringRef getSourceText(CharSourceRange Range,
const SourceManager &SM,
const LangOptions &LangOpts,
bool *Invalid = 0);
/// \brief Retrieve the name of the immediate macro expansion.
///
/// This routine starts from a source location, and finds the name of the macro

View File

@ -813,6 +813,9 @@ CharSourceRange Lexer::makeFileCharRange(SourceRange TokenRange,
// Break down the source locations.
std::pair<FileID, unsigned> beginInfo = SM.getDecomposedLoc(Begin);
if (beginInfo.first.isInvalid())
return CharSourceRange();
unsigned EndOffs;
if (!SM.isInFileID(End, beginInfo.first, &EndOffs) ||
beginInfo.second > EndOffs)
@ -821,6 +824,45 @@ CharSourceRange Lexer::makeFileCharRange(SourceRange TokenRange,
return CharSourceRange::getCharRange(Begin, End);
}
StringRef Lexer::getSourceText(CharSourceRange Range,
const SourceManager &SM,
const LangOptions &LangOpts,
bool *Invalid) {
if (Range.isTokenRange())
Range = makeFileCharRange(Range.getAsRange(), SM, LangOpts);
if (Range.isInvalid() ||
Range.getBegin().isMacroID() || Range.getEnd().isMacroID()) {
if (Invalid) *Invalid = true;
return StringRef();
}
// Break down the source location.
std::pair<FileID, unsigned> beginInfo = SM.getDecomposedLoc(Range.getBegin());
if (beginInfo.first.isInvalid()) {
if (Invalid) *Invalid = true;
return StringRef();
}
unsigned EndOffs;
if (!SM.isInFileID(Range.getEnd(), beginInfo.first, &EndOffs) ||
beginInfo.second > EndOffs) {
if (Invalid) *Invalid = true;
return StringRef();
}
// Try to the load the file buffer.
bool invalidTemp = false;
StringRef file = SM.getBufferData(beginInfo.first, &invalidTemp);
if (invalidTemp) {
if (Invalid) *Invalid = true;
return StringRef();
}
if (Invalid) *Invalid = false;
return file.substr(beginInfo.second, EndOffs - beginInfo.second);
}
StringRef Lexer::getImmediateMacroName(SourceLocation Loc,
const SourceManager &SM,
const LangOptions &LangOpts) {

View File

@ -114,6 +114,11 @@ TEST_F(LexerTest, LexAPI) {
EXPECT_EQ(range.getAsRange(),
SourceRange(macroRange.getBegin(),
macroRange.getEnd().getLocWithOffset(1)));
StringRef text = Lexer::getSourceText(
CharSourceRange::getTokenRange(SourceRange(lsqrLoc, rsqrLoc)),
SourceMgr, LangOpts);
EXPECT_EQ(text, "M(foo)");
}
} // anonymous namespace