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