diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-12-10 23:20:59 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-12-10 23:20:59 +0000 |
commit | bc0f6bc0391ecdff331885cdc769c20b2cb628a6 (patch) | |
tree | cef5b83f535ba1dde2c9008a4c65cb3457e33f61 | |
parent | caaf29a08761b14fbe42a29080c22dd6961056d1 (diff) |
PreprocessorLexer (and subclasses):
- Added virtual method 'getSourceLocation()' (no arguments) that gets the location of the next "observable" location (e.g., next character, next token).
PPLexerChange.cpp:
- Implemented FIXME by using PreprocessorLexer::getSourceLocation() to get the location in the file we are returning to after lexing a #included file. This appears to be slightly faster than having the branch (i.e., 'if(CurLexer)'). It's also not a really hot part of the Preprocessor.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60860 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Lex/Lexer.h | 4 | ||||
-rw-r--r-- | include/clang/Lex/PTHLexer.h | 4 | ||||
-rw-r--r-- | include/clang/Lex/PreprocessorLexer.h | 4 | ||||
-rw-r--r-- | lib/Lex/PPLexerChange.cpp | 12 |
4 files changed, 14 insertions, 10 deletions
diff --git a/include/clang/Lex/Lexer.h b/include/clang/Lex/Lexer.h index 77399e6d56..4ca11145fc 100644 --- a/include/clang/Lex/Lexer.h +++ b/include/clang/Lex/Lexer.h @@ -177,6 +177,10 @@ public: /// getSourceLocation - Return a source location identifier for the specified /// offset in the current file. SourceLocation getSourceLocation(const char *Loc) const; + + /// getSourceLocation - Return a source location for the next character in + /// the current file. + SourceLocation getSourceLocation() { return getSourceLocation(BufferPtr); } /// Stringify - Convert the specified string into a C string by escaping '\' /// and " characters. This does not add surrounding ""'s to the string. diff --git a/include/clang/Lex/PTHLexer.h b/include/clang/Lex/PTHLexer.h index 7f6ae53d7a..a1d41b54b6 100644 --- a/include/clang/Lex/PTHLexer.h +++ b/include/clang/Lex/PTHLexer.h @@ -69,6 +69,10 @@ public: /// the PreprocessorLexer interface. void IndirectLex(Token &Result) { Lex(Result); } + /// getSourceLocation - Return a source location for the token in + /// the current file. + SourceLocation getSourceLocation() { return GetToken().getLocation(); } + private: /// AtLastToken - Returns true if the PTHLexer is at the last token. diff --git a/include/clang/Lex/PreprocessorLexer.h b/include/clang/Lex/PreprocessorLexer.h index e178d27374..a889a55b52 100644 --- a/include/clang/Lex/PreprocessorLexer.h +++ b/include/clang/Lex/PreprocessorLexer.h @@ -79,6 +79,10 @@ protected: virtual void IndirectLex(Token& Result) = 0; + /// getSourceLocation - Return the source location for the next observable + /// location. + virtual SourceLocation getSourceLocation() = 0; + //===--------------------------------------------------------------------===// // #if directive handling. diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index bb2536d1e6..cd50f0e38f 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -275,16 +275,8 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) { if (Callbacks && !isEndOfMacro && CurPPLexer) { SrcMgr::CharacteristicKind FileType = SourceMgr.getFileCharacteristic(CurPPLexer->getFileID()); - - if (CurLexer) { - Callbacks->FileChanged(CurLexer->getSourceLocation(CurLexer->BufferPtr), - PPCallbacks::ExitFile, FileType); - } - else { - // FIXME: Is this okay to use the location of 'Result'? - Callbacks->FileChanged(Result.getLocation(), PPCallbacks::ExitFile, - FileType); - } + Callbacks->FileChanged(CurPPLexer->getSourceLocation(), + PPCallbacks::ExitFile, FileType); } // Client should lex another token. |