annotate clang-tools-extra/clang-tidy/utils/LexerUtils.h @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- LexerUtils.h - clang-tidy-------------------------------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_LEXER_UTILS_H
anatofuz
parents:
diff changeset
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_LEXER_UTILS_H
anatofuz
parents:
diff changeset
11
anatofuz
parents:
diff changeset
12 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
13 #include "clang/Basic/TokenKinds.h"
anatofuz
parents:
diff changeset
14 #include "clang/Lex/Lexer.h"
anatofuz
parents:
diff changeset
15
anatofuz
parents:
diff changeset
16 namespace clang {
anatofuz
parents:
diff changeset
17 namespace tidy {
anatofuz
parents:
diff changeset
18 namespace utils {
anatofuz
parents:
diff changeset
19 namespace lexer {
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 /// Returns previous token or ``tok::unknown`` if not found.
anatofuz
parents:
diff changeset
22 Token getPreviousToken(SourceLocation Location, const SourceManager &SM,
anatofuz
parents:
diff changeset
23 const LangOptions &LangOpts, bool SkipComments = true);
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 SourceLocation findPreviousTokenStart(SourceLocation Start,
anatofuz
parents:
diff changeset
26 const SourceManager &SM,
anatofuz
parents:
diff changeset
27 const LangOptions &LangOpts);
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 SourceLocation findPreviousTokenKind(SourceLocation Start,
anatofuz
parents:
diff changeset
30 const SourceManager &SM,
anatofuz
parents:
diff changeset
31 const LangOptions &LangOpts,
anatofuz
parents:
diff changeset
32 tok::TokenKind TK);
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 SourceLocation findNextTerminator(SourceLocation Start, const SourceManager &SM,
anatofuz
parents:
diff changeset
35 const LangOptions &LangOpts);
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 template <typename TokenKind, typename... TokenKinds>
anatofuz
parents:
diff changeset
38 SourceLocation findPreviousAnyTokenKind(SourceLocation Start,
anatofuz
parents:
diff changeset
39 const SourceManager &SM,
anatofuz
parents:
diff changeset
40 const LangOptions &LangOpts,
anatofuz
parents:
diff changeset
41 TokenKind TK, TokenKinds... TKs) {
anatofuz
parents:
diff changeset
42 if (Start.isInvalid() || Start.isMacroID())
anatofuz
parents:
diff changeset
43 return SourceLocation();
anatofuz
parents:
diff changeset
44 while (true) {
anatofuz
parents:
diff changeset
45 SourceLocation L = findPreviousTokenStart(Start, SM, LangOpts);
anatofuz
parents:
diff changeset
46 if (L.isInvalid() || L.isMacroID())
anatofuz
parents:
diff changeset
47 return SourceLocation();
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 Token T;
anatofuz
parents:
diff changeset
50 // Returning 'true' is used to signal failure to retrieve the token.
anatofuz
parents:
diff changeset
51 if (Lexer::getRawToken(L, T, SM, LangOpts, /*IgnoreWhiteSpace=*/true))
anatofuz
parents:
diff changeset
52 return SourceLocation();
anatofuz
parents:
diff changeset
53
anatofuz
parents:
diff changeset
54 if (T.isOneOf(TK, TKs...))
anatofuz
parents:
diff changeset
55 return T.getLocation();
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 Start = L;
anatofuz
parents:
diff changeset
58 }
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 template <typename TokenKind, typename... TokenKinds>
anatofuz
parents:
diff changeset
62 SourceLocation findNextAnyTokenKind(SourceLocation Start,
anatofuz
parents:
diff changeset
63 const SourceManager &SM,
anatofuz
parents:
diff changeset
64 const LangOptions &LangOpts, TokenKind TK,
anatofuz
parents:
diff changeset
65 TokenKinds... TKs) {
anatofuz
parents:
diff changeset
66 while (true) {
anatofuz
parents:
diff changeset
67 Optional<Token> CurrentToken = Lexer::findNextToken(Start, SM, LangOpts);
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 if (!CurrentToken)
anatofuz
parents:
diff changeset
70 return SourceLocation();
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 Token PotentialMatch = *CurrentToken;
anatofuz
parents:
diff changeset
73 if (PotentialMatch.isOneOf(TK, TKs...))
anatofuz
parents:
diff changeset
74 return PotentialMatch.getLocation();
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // If we reach the end of the file, and eof is not the target token, we stop
anatofuz
parents:
diff changeset
77 // the loop, otherwise we will get infinite loop (findNextToken will return
anatofuz
parents:
diff changeset
78 // eof on eof).
anatofuz
parents:
diff changeset
79 if (PotentialMatch.is(tok::eof))
anatofuz
parents:
diff changeset
80 return SourceLocation();
anatofuz
parents:
diff changeset
81 Start = PotentialMatch.getLastLoc();
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 // Finds next token that's not a comment.
anatofuz
parents:
diff changeset
86 Optional<Token> findNextTokenSkippingComments(SourceLocation Start,
anatofuz
parents:
diff changeset
87 const SourceManager &SM,
anatofuz
parents:
diff changeset
88 const LangOptions &LangOpts);
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 /// Re-lex the provide \p Range and return \c false if either a macro spans
anatofuz
parents:
diff changeset
91 /// multiple tokens, a pre-processor directive or failure to retrieve the
anatofuz
parents:
diff changeset
92 /// next token is found, otherwise \c true.
anatofuz
parents:
diff changeset
93 bool rangeContainsExpansionsOrDirectives(SourceRange Range,
anatofuz
parents:
diff changeset
94 const SourceManager &SM,
anatofuz
parents:
diff changeset
95 const LangOptions &LangOpts);
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97 /// Assuming that ``Range`` spans a CVR-qualified type, returns the
anatofuz
parents:
diff changeset
98 /// token in ``Range`` that is responsible for the qualification. ``Range``
anatofuz
parents:
diff changeset
99 /// must be valid with respect to ``SM``. Returns ``None`` if no qualifying
anatofuz
parents:
diff changeset
100 /// tokens are found.
anatofuz
parents:
diff changeset
101 /// \note: doesn't support member function qualifiers.
anatofuz
parents:
diff changeset
102 llvm::Optional<Token> getQualifyingToken(tok::TokenKind TK,
anatofuz
parents:
diff changeset
103 CharSourceRange Range,
anatofuz
parents:
diff changeset
104 const ASTContext &Context,
anatofuz
parents:
diff changeset
105 const SourceManager &SM);
anatofuz
parents:
diff changeset
106
anatofuz
parents:
diff changeset
107 } // namespace lexer
anatofuz
parents:
diff changeset
108 } // namespace utils
anatofuz
parents:
diff changeset
109 } // namespace tidy
anatofuz
parents:
diff changeset
110 } // namespace clang
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_LEXER_UTILS_H