#!/usr/bin/env python # #===- rename_check.py - clang-tidy check renamer -------------*- python -*--===# # # The LLVM Compiler Infrastructure # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # #===------------------------------------------------------------------------===# import os import glob import argparse def replaceInFile(fileName, sFrom, sTo): if sFrom == sTo: return txt = None with open(fileName, "r") as f: txt = f.read() if sFrom not in txt: return txt = txt.replace(sFrom, sTo) print("Replace '%s' -> '%s' in '%s'" % (sFrom, sTo, fileName)) with open(fileName, "w") as f: f.write(txt) def generateCommentLineHeader(filename): return ''.join(['//===--- ', os.path.basename(filename), ' - clang-tidy ', '-' * max(0, 42 - len(os.path.basename(filename))), '*- C++ -*-===//']) def generateCommentLineSource(filename): return ''.join(['//===--- ', os.path.basename(filename), ' - clang-tidy', '-' * max(0, 52 - len(os.path.basename(filename))), '-===//']) def fileRename(fileName, sFrom, sTo): if sFrom not in fileName: return fileName newFileName = fileName.replace(sFrom, sTo) print("Rename '%s' -> '%s'" % (fileName, newFileName)) os.rename(fileName, newFileName) return newFileName def getListOfFiles(clang_tidy_path): files = glob.glob(os.path.join(clang_tidy_path, '*')) for dirname in files: if os.path.isdir(dirname): files += glob.glob(os.path.join(dirname, '*')) files += glob.glob(os.path.join(clang_tidy_path, '..', 'test', 'clang-tidy', '*')) files += glob.glob(os.path.join(clang_tidy_path, '..', 'docs', 'clang-tidy', 'checks', '*')) return [filename for filename in files if os.path.isfile(filename)] def main(): parser = argparse.ArgumentParser(description='Rename clang-tidy check.') parser.add_argument('module', type=str, help='Module where the renamed check is defined') parser.add_argument('old_check_name', type=str, help='Old check name.') parser.add_argument('new_check_name', type=str, help='New check name.') args = parser.parse_args() args.module = args.module.lower() check_name_camel = ''.join(map(lambda elem: elem.capitalize(), args.old_check_name.split('-'))) + 'Check' check_name_new_camel = (''.join(map(lambda elem: elem.capitalize(), args.new_check_name.split('-'))) + 'Check') clang_tidy_path = os.path.dirname(__file__) header_guard_old = (args.module.upper() + '_' + args.old_check_name.upper().replace('-', '_')) header_guard_new = (args.module.upper() + '_' + args.new_check_name.upper().replace('-', '_')) for filename in getListOfFiles(clang_tidy_path): originalName = filename filename = fileRename(filename, args.old_check_name, args.new_check_name) filename = fileRename(filename, check_name_camel, check_name_new_camel) replaceInFile(filename, generateCommentLineHeader(originalName), generateCommentLineHeader(filename)) replaceInFile(filename, generateCommentLineSource(originalName), generateCommentLineSource(filename)) replaceInFile(filename, header_guard_old, header_guard_new) replaceInFile(filename, args.old_check_name, args.new_check_name) replaceInFile(filename, check_name_camel, check_name_new_camel) if __name__ == '__main__': main()