зеркало из https://github.com/microsoft/clang.git
Add a new Preprocessor::AdvanceToTokenCharacter method which, given a sloc
specifying the start of a token and a logical (phase 3) character number, returns a sloc representing the input character corresponding to it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@39905 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
20e6ccd6f7
Коммит
97ba77cf09
|
@ -36,6 +36,7 @@
|
|||
#include "clang/Basic/SourceManager.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/MemoryBuffer.h"
|
||||
#include <iostream>
|
||||
using namespace clang;
|
||||
|
||||
|
@ -253,6 +254,42 @@ CreateString(const char *Buf, unsigned Len, SourceLocation SLoc) {
|
|||
}
|
||||
|
||||
|
||||
/// AdvanceToTokenCharacter - Given a location that specifies the start of a
|
||||
/// token, return a new location that specifies a character within the token.
|
||||
SourceLocation Preprocessor::AdvanceToTokenCharacter(SourceLocation TokStart,
|
||||
unsigned CharNo) {
|
||||
// If they request the first char of the token, we're trivially done.
|
||||
if (CharNo == 0) return TokStart;
|
||||
|
||||
// Figure out how many physical characters away the specified logical
|
||||
// character is. This needs to take into consideration newlines and
|
||||
// trigraphs.
|
||||
const char *TokStartPtr = SourceMgr.getCharacterData(TokStart);
|
||||
const char *TokPtr = TokStartPtr;
|
||||
|
||||
// The usual case is that tokens don't contain anything interesting. Skip
|
||||
// over the uninteresting characters. If a token only consists of simple
|
||||
// chars, this method is extremely fast.
|
||||
while (CharNo && Lexer::isObviouslySimpleCharacter(*TokPtr))
|
||||
++TokPtr, --CharNo;
|
||||
|
||||
// If we have a character that may be a trigraph or escaped newline, create a
|
||||
// lexer to parse it correctly.
|
||||
unsigned FileID = TokStart.getFileID();
|
||||
const llvm::MemoryBuffer *SrcBuf = SourceMgr.getBuffer(FileID);
|
||||
if (CharNo != 0) {
|
||||
// Create a lexer starting at this token position.
|
||||
Lexer TheLexer(SrcBuf, FileID, *this, TokPtr);
|
||||
LexerToken Tok;
|
||||
// Skip over characters the remaining characters.
|
||||
for (; CharNo; --CharNo)
|
||||
TheLexer.getAndAdvanceChar(TokPtr, Tok);
|
||||
}
|
||||
return SourceLocation(FileID, TokPtr-SrcBuf->getBufferStart());
|
||||
}
|
||||
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Source File Location Methods.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -200,6 +200,7 @@ private:
|
|||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Lexer character reading interfaces.
|
||||
public:
|
||||
|
||||
// This lexer is built on two interfaces for reading characters, both of which
|
||||
// automatically provide phase 1/2 translation. getAndAdvanceChar is used
|
||||
|
@ -239,6 +240,7 @@ private:
|
|||
return C;
|
||||
}
|
||||
|
||||
private:
|
||||
/// ConsumeChar - When a character (identified by PeekCharAndSize) is consumed
|
||||
/// and added to a given token, check to see if there are diagnostics that
|
||||
/// need to be emitted or flags that need to be set on the token. If so, do
|
||||
|
|
|
@ -279,6 +279,10 @@ public:
|
|||
void DumpToken(const LexerToken &Tok, bool DumpFlags = false) const;
|
||||
void DumpMacro(const MacroInfo &MI) const;
|
||||
|
||||
/// AdvanceToTokenCharacter - Given a location that specifies the start of a
|
||||
/// token, return a new location that specifies a character within the token.
|
||||
SourceLocation AdvanceToTokenCharacter(SourceLocation TokStart,unsigned Char);
|
||||
|
||||
/// IncrementPasteCounter - Increment the counters for the number of token
|
||||
/// paste operations performed. If fast was specified, this is a 'fast paste'
|
||||
/// case we handled.
|
||||
|
|
Загрузка…
Ссылка в новой задаче