diff --git a/clang-tools-extra/clang-tidy/add_new_check.py b/clang-tools-extra/clang-tidy/add_new_check.py --- a/clang-tools-extra/clang-tidy/add_new_check.py +++ b/clang-tools-extra/clang-tidy/add_new_check.py @@ -46,7 +46,7 @@ # Adds a header for the new check. -def write_header(module_path, module, check_name, check_name_camel): +def write_header(module_path, module, namespace, check_name, check_name_camel): check_name_dashes = module + '-' + check_name filename = os.path.join(module_path, check_name_camel) + '.h' print('Creating %s...' % filename) @@ -73,7 +73,7 @@ namespace clang { namespace tidy { -namespace %(module)s { +namespace %(namespace)s { /// FIXME: Write a short description. /// @@ -87,7 +87,7 @@ void check(const ast_matchers::MatchFinder::MatchResult &Result) override; }; -} // namespace %(module)s +} // namespace %(namespace)s } // namespace tidy } // namespace clang @@ -95,11 +95,12 @@ """ % {'header_guard': header_guard, 'check_name': check_name_camel, 'check_name_dashes': check_name_dashes, - 'module': module}) + 'module': module, + 'namespace': namespace}) # Adds the implementation of the new check. -def write_implementation(module_path, module, check_name_camel): +def write_implementation(module_path, module, namespace, check_name_camel): filename = os.path.join(module_path, check_name_camel) + '.cpp' print('Creating %s...' % filename) with open(filename, 'w') as f: @@ -124,7 +125,7 @@ namespace clang { namespace tidy { -namespace %(module)s { +namespace %(namespace)s { void %(check_name)s::registerMatchers(MatchFinder *Finder) { // FIXME: Add matchers. @@ -142,11 +143,12 @@ << FixItHint::CreateInsertion(MatchedDecl->getLocation(), "awesome_"); } -} // namespace %(module)s +} // namespace %(namespace)s } // namespace tidy } // namespace clang """ % {'check_name': check_name_camel, - 'module': module}) + 'module': module, + 'namespace': namespace}) # Modifies the module to include the new check. @@ -375,8 +377,15 @@ if not adapt_cmake(module_path, check_name_camel): return - write_header(module_path, module, check_name, check_name_camel) - write_implementation(module_path, module, check_name_camel) + + # Map module names to namespace names that don't conflict with widely used top-level namespaces. + if module == 'llvm': + namespace = module + '_check' + else: + namespace = module + + write_header(module_path, module, namespace, check_name, check_name_camel) + write_implementation(module_path, module, namespace, check_name_camel) adapt_module(module_path, module, check_name, check_name_camel) add_release_notes(module_path, module, check_name) test_extension = language_to_extension.get(args.language) diff --git a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h --- a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h +++ b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h @@ -6,14 +6,14 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_HEADER_GUARD_CHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_HEADER_GUARD_CHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_HEADERGUARDCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_HEADERGUARDCHECK_H #include "../utils/HeaderGuard.h" namespace clang { namespace tidy { -namespace llvm { +namespace llvm_check { /// Finds and fixes header guards that do not adhere to LLVM style. /// For the user-facing documentation see: @@ -32,8 +32,8 @@ std::string getHeaderGuard(StringRef Filename, StringRef OldGuard) override; }; -} // namespace llvm +} // namespace llvm_check } // namespace tidy } // namespace clang -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_HEADER_GUARD_CHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_HEADERGUARDCHECK_H diff --git a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp --- a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp @@ -10,7 +10,7 @@ namespace clang { namespace tidy { -namespace llvm { +namespace llvm_check { LLVMHeaderGuardCheck::LLVMHeaderGuardCheck(StringRef Name, ClangTidyContext *Context) @@ -49,6 +49,6 @@ return StringRef(Guard).upper(); } -} // namespace llvm +} // namespace llvm_check } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.h b/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.h --- a/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.h +++ b/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.h @@ -6,14 +6,14 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_INCLUDE_ORDER_CHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_INCLUDE_ORDER_CHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_INCLUDEORDERCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_INCLUDEORDERCHECK_H #include "../ClangTidyCheck.h" namespace clang { namespace tidy { -namespace llvm { +namespace llvm_check { /// Checks the correct order of `#includes`. /// @@ -26,8 +26,8 @@ Preprocessor *ModuleExpanderPP) override; }; -} // namespace llvm +} // namespace llvm_check } // namespace tidy } // namespace clang -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_INCLUDE_ORDER_CHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_INCLUDEORDERCHECK_H diff --git a/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.cpp b/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.cpp --- a/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/IncludeOrderCheck.cpp @@ -15,7 +15,7 @@ namespace clang { namespace tidy { -namespace llvm { +namespace llvm_check { namespace { class IncludeOrderPPCallbacks : public PPCallbacks { @@ -176,6 +176,6 @@ IncludeDirectives.clear(); } -} // namespace llvm +} // namespace llvm_check } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp --- a/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/llvm/LLVMTidyModule.cpp @@ -16,7 +16,7 @@ namespace clang { namespace tidy { -namespace llvm { +namespace llvm_check { class LLVMModule : public ClangTidyModule { public: @@ -33,7 +33,7 @@ static ClangTidyModuleRegistry::Add X("llvm-module", "Adds LLVM lint checks."); -} // namespace llvm +} // namespace llvm_check // This anchor is used to force the linker to link in the generated object file // and thus register the LLVMModule. diff --git a/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.h b/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.h --- a/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.h +++ b/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.h @@ -6,14 +6,14 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_TWINE_LOCAL_CHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_TWINE_LOCAL_CHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_TWINELOCALCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_TWINELOCALCHECK_H #include "../ClangTidyCheck.h" namespace clang { namespace tidy { -namespace llvm { +namespace llvm_check { /// Looks for local `Twine` variables which are prone to use after frees and /// should be generally avoided. @@ -25,8 +25,8 @@ void check(const ast_matchers::MatchFinder::MatchResult &Result) override; }; -} // namespace llvm +} // namespace llvm_check } // namespace tidy } // namespace clang -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_TWINE_LOCAL_CHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_TWINELOCALCHECK_H diff --git a/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.cpp b/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.cpp --- a/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/TwineLocalCheck.cpp @@ -15,7 +15,7 @@ namespace clang { namespace tidy { -namespace llvm { +namespace llvm_check { void TwineLocalCheck::registerMatchers(MatchFinder *Finder) { auto TwineType = @@ -60,6 +60,6 @@ } } -} // namespace llvm +} // namespace llvm_check } // namespace tidy } // namespace clang diff --git a/clang-tools-extra/clang-tidy/rename_check.py b/clang-tools-extra/clang-tidy/rename_check.py --- a/clang-tools-extra/clang-tidy/rename_check.py +++ b/clang-tools-extra/clang-tidy/rename_check.py @@ -14,6 +14,18 @@ import re +def replaceInFileRegex(fileName, sFrom, sTo): + if sFrom == sTo: + return + txt = None + with open(fileName, "r") as f: + txt = f.read() + + txt = re.sub(sFrom, sTo, txt) + print("Replacing '%s' -> '%s' in '%s'..." % (sFrom, sTo, fileName)) + with open(fileName, "w") as f: + f.write(txt) + def replaceInFile(fileName, sFrom, sTo): if sFrom == sTo: return @@ -203,6 +215,8 @@ clang_tidy_path = os.path.dirname(__file__) header_guard_variants = [ + (args.old_check_name.replace('-', '_')).upper() + '_CHECK', + (old_module + '_' + check_name_camel).upper(), (old_module + '_' + new_check_name_camel).upper(), args.old_check_name.replace('-', '_').upper()] header_guard_new = (new_module + '_' + new_check_name_camel).upper() @@ -210,18 +224,19 @@ old_module_path = os.path.join(clang_tidy_path, old_module) new_module_path = os.path.join(clang_tidy_path, new_module) - # Remove the check from the old module. - cmake_lists = os.path.join(old_module_path, 'CMakeLists.txt') - check_found = deleteMatchingLines(cmake_lists, '\\b' + check_name_camel) - if not check_found: - print("Check name '%s' not found in %s. Exiting." % + if (args.old_check_name != args.new_check_name): + # Remove the check from the old module. + cmake_lists = os.path.join(old_module_path, 'CMakeLists.txt') + check_found = deleteMatchingLines(cmake_lists, '\\b' + check_name_camel) + if not check_found: + print("Check name '%s' not found in %s. Exiting." % (check_name_camel, cmake_lists)) - return 1 + return 1 - modulecpp = filter( - lambda p: p.lower() == old_module.lower() + 'tidymodule.cpp', - os.listdir(old_module_path))[0] - deleteMatchingLines(os.path.join(old_module_path, modulecpp), + modulecpp = filter( + lambda p: p.lower() == old_module.lower() + 'tidymodule.cpp', + os.listdir(old_module_path))[0] + deleteMatchingLines(os.path.join(old_module_path, modulecpp), '\\b' + check_name_camel + '|\\b' + args.old_check_name) for filename in getListOfFiles(clang_tidy_path): @@ -249,14 +264,21 @@ new_module + '/' + new_check_name_camel) replaceInFile(filename, check_name_camel, new_check_name_camel) + if new_module == 'llvm': + new_namespace = new_module + '_check' + else: + new_namespace = new_module if old_module != new_module: check_implementation_files = glob.glob( os.path.join(old_module_path, new_check_name_camel + '*')) for filename in check_implementation_files: # Move check implementation to the directory of the new module. filename = fileRename(filename, old_module_path, new_module_path) - replaceInFile(filename, 'namespace ' + old_module, - 'namespace ' + new_module) + replaceInFileRegex(filename, 'namespace ' + old_module + '[^ \n]*', + 'namespace ' + new_namespace) + + if (args.old_check_name == args.new_check_name): + return # Add check to the new module. adapt_cmake(new_module_path, new_check_name_camel) diff --git a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp --- a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp @@ -3,7 +3,7 @@ #include "llvm/IncludeOrderCheck.h" #include "gtest/gtest.h" -using namespace clang::tidy::llvm; +using namespace clang::tidy::llvm_check; namespace clang { namespace tidy {