# 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)
namespace clang {
namespace tidy {
-namespace %(module)s {
+namespace %(namespace)s {
/// FIXME: Write a short description.
///
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
};
-} // namespace %(module)s
+} // namespace %(namespace)s
} // namespace tidy
} // namespace clang
""" % {'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:
namespace clang {
namespace tidy {
-namespace %(module)s {
+namespace %(namespace)s {
void %(check_name)s::registerMatchers(MatchFinder *Finder) {
// FIXME: Add matchers.
<< 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.
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)
namespace clang {
namespace tidy {
-namespace llvm {
+namespace llvm_check {
LLVMHeaderGuardCheck::LLVMHeaderGuardCheck(StringRef Name,
ClangTidyContext *Context)
return StringRef(Guard).upper();
}
-} // namespace llvm
+} // namespace llvm_check
} // namespace tidy
} // namespace clang
//
//===----------------------------------------------------------------------===//
-#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:
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
namespace clang {
namespace tidy {
-namespace llvm {
+namespace llvm_check {
namespace {
class IncludeOrderPPCallbacks : public PPCallbacks {
IncludeDirectives.clear();
}
-} // namespace llvm
+} // namespace llvm_check
} // namespace tidy
} // namespace clang
//
//===----------------------------------------------------------------------===//
-#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`.
///
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
namespace clang {
namespace tidy {
-namespace llvm {
+namespace llvm_check {
class LLVMModule : public ClangTidyModule {
public:
static ClangTidyModuleRegistry::Add<LLVMModule> 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.
} // namespace ast_matchers
namespace tidy {
-namespace llvm {
+namespace llvm_check {
void PreferIsaOrDynCastInConditionalsCheck::registerMatchers(
MatchFinder *Finder) {
}
}
-} // namespace llvm
+} // namespace llvm_check
} // namespace tidy
} // namespace clang
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_AVOIDCASTINCONDITIONALCHECK_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_AVOIDCASTINCONDITIONALCHECK_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_PREFERISAORDYNCASTINCONDITIONALSCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_PREFERISAORDYNCASTINCONDITIONALSCHECK_H
#include "../ClangTidyCheck.h"
namespace clang {
namespace tidy {
-namespace llvm {
+namespace llvm_check {
/// \brief Looks at conditionals and finds and replaces cases of ``cast<>``, which will
/// assert rather than return a null pointer, and ``dyn_cast<>`` where
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_AVOIDCASTINCONDITIONALCHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_LLVM_PREFERISAORDYNCASTINCONDITIONALSCHECK_H
namespace clang {
namespace tidy {
-namespace llvm {
+namespace llvm_check {
void TwineLocalCheck::registerMatchers(MatchFinder *Finder) {
auto TwineType =
}
}
-} // namespace llvm
+} // namespace llvm_check
} // namespace tidy
} // namespace clang
//
//===----------------------------------------------------------------------===//
-#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.
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
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
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()
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):
new_module + '/' + new_check_name_camel)
replaceInFile(filename, check_name_camel, new_check_name_camel)
- if old_module != new_module:
+ if old_module != new_module or new_module == 'llvm':
+ if new_module == 'llvm':
+ new_namespace = new_module + '_check'
+ else:
+ new_namespace = 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)
#include "llvm/IncludeOrderCheck.h"
#include "gtest/gtest.h"
-using namespace clang::tidy::llvm;
+using namespace clang::tidy::llvm_check;
namespace clang {
namespace tidy {