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: ConcatNestedNamespacesCheck(StringRef Name,ClangTidyContext * Context)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; isLanguageVersionSupported(const LangOptions & LangOpts)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