9#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_LEXERUTILS_H
10#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_LEXERUTILS_H
12#include "clang/AST/ASTContext.h"
13#include "clang/Basic/TokenKinds.h"
14#include "clang/Lex/Lexer.h"
15#include "llvm/ADT/STLFunctionalExtras.h"
28 const SourceManager &SM,
29 const LangOptions &LangOpts,
30 bool SkipComments =
true);
32std::pair<std::optional<Token>, SourceLocation>
34 const LangOptions &LangOpts,
bool SkipComments =
true);
37 const SourceManager &SM,
38 const LangOptions &LangOpts);
41 const SourceManager &SM,
42 const LangOptions &LangOpts,
46 const LangOptions &LangOpts);
48template <
typename TokenKind,
typename... TokenKinds>
50 const SourceManager &SM,
51 const LangOptions &LangOpts,
52 TokenKind TK, TokenKinds... TKs) {
53 if (Start.isInvalid() || Start.isMacroID())
57 if (L.isInvalid() || L.isMacroID())
62 if (Lexer::getRawToken(L, T, SM, LangOpts,
true))
65 if (T.isOneOf(TK, TKs...))
66 return T.getLocation();
72template <
typename TokenKind,
typename... TokenKinds>
74 const SourceManager &SM,
75 const LangOptions &LangOpts, TokenKind TK,
78 std::optional<Token> CurrentToken =
79 Lexer::findNextToken(Start, SM, LangOpts);
84 const Token PotentialMatch = *CurrentToken;
85 if (PotentialMatch.isOneOf(TK, TKs...))
86 return PotentialMatch.getLocation();
91 if (PotentialMatch.is(tok::eof))
93 Start = PotentialMatch.getLastLoc();
98inline std::optional<Token>
100 const LangOptions &LangOpts) {
101 return Lexer::findNextToken(Start, SM, LangOpts,
true);
105inline std::optional<Token>
107 const LangOptions &LangOpts) {
108 return Lexer::findNextToken(Start, SM, LangOpts,
false);
115 const SourceManager &SM,
116 const LangOptions &LangOpts);
126 const SourceManager &SM,
127 const LangOptions &LangOpts);
131std::vector<CommentToken>
133 const LangOptions &LangOpts);
140 const LangOptions &LangOpts,
141 llvm::function_ref<
bool(
const Token &)> Pred);
149 CharSourceRange Range,
150 const ASTContext &Context,
151 const SourceManager &SM);
156 const LangOptions &LangOpts);
161 const SourceManager &SM);
std::pair< std::optional< Token >, SourceLocation > getPreviousTokenAndStart(SourceLocation Location, const SourceManager &SM, const LangOptions &LangOpts, bool SkipComments)
SourceLocation getLocationForNoexceptSpecifier(const FunctionDecl *FuncDecl, const SourceManager &SM)
For a given FunctionDecl returns the location where you would need to place the noexcept specifier.
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)
std::optional< Token > getPreviousToken(SourceLocation Location, const SourceManager &SM, const LangOptions &LangOpts, bool SkipComments)
Returns previous token or std::nullopt if not found.
std::vector< CommentToken > getTrailingCommentsInRange(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts)
Returns comment tokens found in the given range. If a non-comment token is encountered,...
SourceLocation findNextAnyTokenKind(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts, TokenKind TK, TokenKinds... TKs)
std::optional< Token > findNextTokenSkippingComments(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts)
SourceLocation findPreviousTokenStart(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts)
CharSourceRange findTokenTextInRange(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, llvm::function_ref< bool(const Token &)> Pred)
Returns source range of the first token in Range matching Pred. The returned char range starts at the...
std::vector< CommentToken > getCommentsInRange(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts)
Returns all comment tokens found in the given range.
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...
std::optional< Token > findNextTokenIncludingComments(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts)
SourceLocation findPreviousAnyTokenKind(SourceLocation Start, const SourceManager &SM, const LangOptions &LangOpts, TokenKind TK, TokenKinds... TKs)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static constexpr const char FuncDecl[]