- Add Lexer::isPragma() accessor for clients of Lexer that aren't friends.

- Add static method to test if the current lexer is a non-macro/non-pragma
  lexer.
- Refactor some code in PPLexerChange to use this static method.
- No performance change.

llvm-svn: 59486
This commit is contained in:
Ted Kremenek 2008-11-18 01:33:13 +00:00
parent 326f757698
commit 3d9740da29
2 changed files with 17 additions and 8 deletions

View File

@ -113,6 +113,9 @@ public:
// file is reached.
LexTokenInternal(Result);
}
/// isPragmaLexer - Returns true if this Lexer is being used to lex a pragma.
bool isPragmaLexer() const { return Is_PragmaLexer; }
/// IndirectLex - An indirect call to 'Lex' that can be invoked via
/// the PreprocessorLexer interface.

View File

@ -19,27 +19,33 @@
#include "clang/Basic/SourceManager.h"
using namespace clang;
PPCallbacks::~PPCallbacks() {
}
PPCallbacks::~PPCallbacks() {}
//===----------------------------------------------------------------------===//
// Miscellaneous Methods.
//===----------------------------------------------------------------------===//
static inline bool IsNonPragmaNonMacroLexer(const Lexer* L,
const PreprocessorLexer* P) {
if (L)
return !L->isPragmaLexer();
else
return P != 0;
}
/// isInPrimaryFile - Return true if we're in the top-level file, not in a
/// #include. This looks through macro expansions and active _Pragma lexers.
bool Preprocessor::isInPrimaryFile() const {
if (CurLexer && !CurLexer->Is_PragmaLexer)
if (IsNonPragmaNonMacroLexer(CurLexer.get(), CurPPLexer))
return IncludeMacroStack.empty();
// If there are any stacked lexers, we're in a #include.
assert(IncludeMacroStack[0].TheLexer &&
!IncludeMacroStack[0].TheLexer->Is_PragmaLexer &&
assert(IsNonPragmaNonMacroLexer(IncludeMacroStack[0].TheLexer,
IncludeMacroStack[0].ThePPLexer) &&
"Top level include stack isn't our primary lexer?");
for (unsigned i = 1, e = IncludeMacroStack.size(); i != e; ++i)
if (IncludeMacroStack[i].TheLexer &&
!IncludeMacroStack[i].TheLexer->Is_PragmaLexer)
if (IsNonPragmaNonMacroLexer(IncludeMacroStack[i].TheLexer,
IncludeMacroStack[i].ThePPLexer))
return false;
return true;
}