1 | //===--- ConcatNestedNamespacesCheck.h - clang-tidy--------------*- C++ -*-===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_CONCATNESTEDNAMESPACESCHECK_H |
10 | #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_CONCATNESTEDNAMESPACESCHECK_H |
11 | |
12 | #include "../ClangTidyCheck.h" |
13 | #include "llvm/ADT/SmallString.h" |
14 | #include "llvm/ADT/SmallVector.h" |
15 | |
16 | namespace clang::tidy::modernize { |
17 | |
18 | using NamespaceName = llvm::SmallString<40>; |
19 | |
20 | class NS : public llvm::SmallVector<const NamespaceDecl *, 6> { |
21 | public: |
22 | std::optional<SourceRange> |
23 | getCleanedNamespaceFrontRange(const SourceManager &SM, |
24 | const LangOptions &LangOpts) const; |
25 | SourceRange getReplacedNamespaceFrontRange() const; |
26 | SourceRange getNamespaceBackRange(const SourceManager &SM, |
27 | const LangOptions &LangOpts) const; |
28 | SourceRange getDefaultNamespaceBackRange() const; |
29 | void appendName(NamespaceName &Str) const; |
30 | void appendCloseComment(NamespaceName &Str) const; |
31 | }; |
32 | |
33 | class ConcatNestedNamespacesCheck : public ClangTidyCheck { |
34 | public: |
35 | ConcatNestedNamespacesCheck(StringRef Name, ClangTidyContext *Context) |
36 | : ClangTidyCheck(Name, Context) {} |
37 | bool unsupportedNamespace(const NamespaceDecl &ND, bool IsChild) const; |
38 | bool singleNamedNamespaceChild(const NamespaceDecl &ND) const; |
39 | bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { |
40 | return LangOpts.CPlusPlus17; |
41 | } |
42 | void registerMatchers(ast_matchers::MatchFinder *Finder) override; |
43 | void check(const ast_matchers::MatchFinder::MatchResult &Result) override; |
44 | |
45 | private: |
46 | using NamespaceContextVec = llvm::SmallVector<NS, 6>; |
47 | |
48 | void reportDiagnostic(const SourceManager &SM, const LangOptions &LangOpts); |
49 | NamespaceContextVec Namespaces; |
50 | }; |
51 | } // namespace clang::tidy::modernize |
52 | |
53 | #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_CONCATNESTEDNAMESPACESCHECK_H |
54 |