10 #include "clang/Basic/SourceManager.h"
18 const LangOptions &LangOpts,
bool SkipComments) {
20 Token.setKind(tok::unknown);
26 auto StartOfFile = SM.getLocForStartOfFile(SM.getFileID(
Location));
29 if (!Lexer::getRawToken(
Location, Token, SM, LangOpts) &&
30 (!SkipComments || !Token.is(tok::comment))) {
39 const SourceManager &SM,
40 const LangOptions &LangOpts) {
41 if (Start.isInvalid() || Start.isMacroID())
42 return SourceLocation();
44 SourceLocation BeforeStart = Start.getLocWithOffset(-1);
45 if (BeforeStart.isInvalid() || BeforeStart.isMacroID())
46 return SourceLocation();
48 return Lexer::GetBeginningOfToken(BeforeStart, SM, LangOpts);
52 const SourceManager &SM,
53 const LangOptions &LangOpts,
55 if (Start.isInvalid() || Start.isMacroID())
56 return SourceLocation();
60 if (L.isInvalid() || L.isMacroID())
61 return SourceLocation();
64 if (Lexer::getRawToken(L, T, SM, LangOpts,
true))
65 return SourceLocation();
68 return T.getLocation();
75 const LangOptions &LangOpts) {
80 const SourceManager &SM,
81 const LangOptions &LangOpts) {
82 Optional<Token> CurrentToken;
84 CurrentToken = Lexer::findNextToken(Start, SM, LangOpts);
85 }
while (CurrentToken && CurrentToken->is(tok::comment));
90 const SourceManager &SM,
91 const LangOptions &LangOpts) {
92 assert(
Range.isValid() &&
"Invalid Range for relexing provided");
93 SourceLocation
Loc =
Range.getBegin();
99 llvm::Optional<Token> Tok = Lexer::findNextToken(
Loc, SM, LangOpts);
104 if (Tok->is(tok::hash))
107 Loc = Lexer::getLocForEndOfToken(
Loc, 0, SM, LangOpts).getLocWithOffset(1);
114 CharSourceRange
Range,
115 const ASTContext &Context,
116 const SourceManager &SM) {
117 assert((TK == tok::kw_const || TK == tok::kw_volatile ||
118 TK == tok::kw_restrict) &&
119 "TK is not a qualifier keyword");
120 std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(
Range.getBegin());
121 StringRef File = SM.getBufferData(LocInfo.first);
122 Lexer RawLexer(SM.getLocForStartOfFile(LocInfo.first), Context.getLangOpts(),
123 File.begin(), File.data() + LocInfo.second, File.end());
124 llvm::Optional<Token> LastMatchBeforeTemplate;
125 llvm::Optional<Token> LastMatchAfterTemplate;
126 bool SawTemplate =
false;
128 while (!RawLexer.LexFromRawLexer(Tok) &&
129 Range.getEnd() != Tok.getLocation() &&
130 !SM.isBeforeInTranslationUnit(
Range.getEnd(), Tok.getLocation())) {
131 if (Tok.is(tok::raw_identifier)) {
132 IdentifierInfo &
Info = Context.Idents.get(
133 StringRef(SM.getCharacterData(Tok.getLocation()), Tok.getLength()));
134 Tok.setIdentifierInfo(&
Info);
135 Tok.setKind(
Info.getTokenID());
137 if (Tok.is(tok::less))
139 else if (Tok.isOneOf(tok::greater, tok::greatergreater))
140 LastMatchAfterTemplate = None;
141 else if (Tok.is(TK)) {
143 LastMatchAfterTemplate = Tok;
145 LastMatchBeforeTemplate = Tok;
148 return LastMatchAfterTemplate != None ? LastMatchAfterTemplate
149 : LastMatchBeforeTemplate;