forked from OSchip/llvm-project
- 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:
parent
326f757698
commit
3d9740da29
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue