xref: /llvm-project/clang-tools-extra/clang-tidy/modernize/ConcatNestedNamespacesCheck.h (revision f1f16331bd6810a574100a31d369921c1f4adcaf)
1d1bd01c3SJonas Toth //===--- ConcatNestedNamespacesCheck.h - clang-tidy--------------*- C++ -*-===//
2d1bd01c3SJonas Toth //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d1bd01c3SJonas Toth //
7d1bd01c3SJonas Toth //===----------------------------------------------------------------------===//
8d1bd01c3SJonas Toth 
9d1bd01c3SJonas Toth #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_CONCATNESTEDNAMESPACESCHECK_H
10d1bd01c3SJonas Toth #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_CONCATNESTEDNAMESPACESCHECK_H
11d1bd01c3SJonas Toth 
12478fc5c8SAlexander Kornienko #include "../ClangTidyCheck.h"
13d1bd01c3SJonas Toth #include "llvm/ADT/SmallString.h"
14d1bd01c3SJonas Toth #include "llvm/ADT/SmallVector.h"
15d1bd01c3SJonas Toth 
164718da50SCarlos Galvez namespace clang::tidy::modernize {
17d1bd01c3SJonas Toth 
1872777dc0SCongcong Cai using NamespaceName = llvm::SmallString<40>;
1972777dc0SCongcong Cai 
2072777dc0SCongcong Cai class NS : public llvm::SmallVector<const NamespaceDecl *, 6> {
2172777dc0SCongcong Cai public:
2272777dc0SCongcong Cai   std::optional<SourceRange>
2372777dc0SCongcong Cai   getCleanedNamespaceFrontRange(const SourceManager &SM,
2472777dc0SCongcong Cai                                 const LangOptions &LangOpts) const;
2572777dc0SCongcong Cai   SourceRange getReplacedNamespaceFrontRange() const;
2672777dc0SCongcong Cai   SourceRange getNamespaceBackRange(const SourceManager &SM,
2772777dc0SCongcong Cai                                     const LangOptions &LangOpts) const;
2872777dc0SCongcong Cai   SourceRange getDefaultNamespaceBackRange() const;
2932aaacc6SCongcong Cai   void appendName(NamespaceName &Str) const;
3032aaacc6SCongcong Cai   void appendCloseComment(NamespaceName &Str) const;
3172777dc0SCongcong Cai };
3272777dc0SCongcong Cai 
33d1bd01c3SJonas Toth class ConcatNestedNamespacesCheck : public ClangTidyCheck {
34d1bd01c3SJonas Toth public:
ConcatNestedNamespacesCheck(StringRef Name,ClangTidyContext * Context)35d1bd01c3SJonas Toth   ConcatNestedNamespacesCheck(StringRef Name, ClangTidyContext *Context)
36d1bd01c3SJonas Toth       : ClangTidyCheck(Name, Context) {}
3732aaacc6SCongcong Cai   bool unsupportedNamespace(const NamespaceDecl &ND, bool IsChild) const;
3832aaacc6SCongcong Cai   bool singleNamedNamespaceChild(const NamespaceDecl &ND) const;
isLanguageVersionSupported(const LangOptions & LangOpts)39e40a742aSNathan James   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
40e40a742aSNathan James     return LangOpts.CPlusPlus17;
41e40a742aSNathan James   }
42d1bd01c3SJonas Toth   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
43d1bd01c3SJonas Toth   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
44d1bd01c3SJonas Toth 
45d1bd01c3SJonas Toth private:
4672777dc0SCongcong Cai   using NamespaceContextVec = llvm::SmallVector<NS, 6>;
47d1bd01c3SJonas Toth 
48*f1f16331SPiotr Zegar   void reportDiagnostic(const SourceManager &SM, const LangOptions &LangOpts);
49d1bd01c3SJonas Toth   NamespaceContextVec Namespaces;
50d1bd01c3SJonas Toth };
514718da50SCarlos Galvez } // namespace clang::tidy::modernize
52d1bd01c3SJonas Toth 
53d1bd01c3SJonas Toth #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_CONCATNESTEDNAMESPACESCHECK_H
54