9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_LEXER_UTILS_H
10#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_LEXER_UTILS_H
12#include "clang/AST/ASTContext.h"
13#include "clang/Basic/TokenKinds.h"
14#include "clang/Lex/Lexer.h"
21namespace tidy::utils::lexer {
25 const LangOptions &LangOpts,
bool SkipComments =
true);
28 const SourceManager &SM,
29 const LangOptions &LangOpts);
32 const SourceManager &SM,
33 const LangOptions &LangOpts,
37 const LangOptions &LangOpts);
39template <
typename TokenKind,
typename... TokenKinds>
41 const SourceManager &SM,
42 const LangOptions &LangOpts,
43 TokenKind TK, TokenKinds... TKs) {
44 if (Start.isInvalid() || Start.isMacroID())
45 return SourceLocation();
48 if (L.isInvalid() || L.isMacroID())
49 return SourceLocation();
53 if (Lexer::getRawToken(L, T, SM, LangOpts,
true))
54 return SourceLocation();
56 if (T.isOneOf(TK, TKs...))
57 return T.getLocation();
63template <
typename TokenKind,
typename... TokenKinds>
65 const SourceManager &SM,
66 const LangOptions &LangOpts, TokenKind TK,
69 std::optional<Token> CurrentToken =
70 Lexer::findNextToken(Start, SM, LangOpts);
73 return SourceLocation();
75 Token PotentialMatch = *CurrentToken;
76 if (PotentialMatch.isOneOf(TK, TKs...))
77 return PotentialMatch.getLocation();
82 if (PotentialMatch.is(tok::eof))
83 return SourceLocation();
84 Start = PotentialMatch.getLastLoc();
90 const SourceManager &SM,
91 const LangOptions &LangOpts);
97 const SourceManager &SM,
98 const LangOptions &LangOpts);
106 CharSourceRange
Range,
107 const ASTContext &Context,
108 const SourceManager &SM);
113 const LangOptions &LangOpts);
CharSourceRange Range
SourceRange for the file name.
SourceLocation getUnifiedEndLoc(const Stmt &S, const SourceManager &SM, const LangOptions &LangOpts)
Stmt->getEndLoc does not always behave the same way depending on Token type.
bool rangeContainsExpansionsOrDirectives(SourceRange Range, const SourceManager &SM, const LangOptions &LangOpts)
Re-lex the provide Range and return false if either a macro spans multiple tokens,...
SourceLocation findNextTerminator(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts)
SourceLocation findNextAnyTokenKind(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts, TokenKind TK, TokenKinds... TKs)
Token getPreviousToken(SourceLocation Location, const SourceManager &SM, const LangOptions &LangOpts, bool SkipComments)
Returns previous token or tok::unknown if not found.
std::optional< Token > findNextTokenSkippingComments(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts)
SourceLocation findPreviousTokenStart(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts)
SourceLocation findPreviousTokenKind(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts, tok::TokenKind TK)
std::optional< Token > getQualifyingToken(tok::TokenKind TK, CharSourceRange Range, const ASTContext &Context, const SourceManager &SM)
Assuming that Range spans a CVR-qualified type, returns the token in Range that is responsible for th...
SourceLocation findPreviousAnyTokenKind(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts, TokenKind TK, TokenKinds... TKs)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//