22 with open(fileName,
"r") as f: 28 txt = txt.replace(sFrom, sTo)
29 print(
"Replacing '%s' -> '%s' in '%s'..." % (sFrom, sTo, fileName))
30 with open(fileName,
"w")
as f:
35 return ''.
join([
'//===--- ',
36 os.path.basename(filename),
38 '-' * max(0, 42 - len(os.path.basename(filename))),
43 return ''.
join([
'//===--- ',
44 os.path.basename(filename),
46 '-' * max(0, 52 - len(os.path.basename(filename))),
51 if sFrom
not in fileName
or sFrom == sTo:
53 newFileName = fileName.replace(sFrom, sTo)
54 print(
"Renaming '%s' -> '%s'..." % (fileName, newFileName))
55 os.rename(fileName, newFileName)
60 with open(fileName,
"r") as f: 63 not_matching_lines = [l for l
in lines
if not re.search(pattern, l)]
64 if len(not_matching_lines) == len(lines):
67 print(
"Removing lines matching '%s' in '%s'..." % (pattern, fileName))
68 print(
' ' +
' '.
join([l
for l
in lines
if re.search(pattern, l)]))
69 with open(fileName,
"w")
as f:
70 f.writelines(not_matching_lines)
75 files = glob.glob(os.path.join(clang_tidy_path,
'*'))
77 if os.path.isdir(dirname):
78 files += glob.glob(os.path.join(dirname,
'*'))
79 files += glob.glob(os.path.join(clang_tidy_path,
'..',
'test',
81 files += glob.glob(os.path.join(clang_tidy_path,
'..',
'docs',
82 'clang-tidy',
'checks',
'*'))
83 return [filename
for filename
in files
if os.path.isfile(filename)]
88 filename = os.path.join(module_path,
'CMakeLists.txt')
89 with open(filename,
'r') as f: 92 cpp_file = check_name_camel + '.cpp' 96 if line.strip() == cpp_file:
99 print(
'Updating %s...' % filename)
100 with open(filename,
'wb')
as f:
104 cpp_line = line.strip().endswith(
'.cpp')
105 if (
not file_added)
and (cpp_line
or cpp_found):
107 if (line.strip() > cpp_file)
or (
not cpp_line):
108 f.write(
' ' + cpp_file +
'\n')
116 modulecpp = filter(
lambda p: p.lower() == module.lower() +
'tidymodule.cpp',
117 os.listdir(module_path))[0]
118 filename = os.path.join(module_path, modulecpp)
119 with open(filename,
'r') as f: 120 lines = f.readlines() 122 print('Updating %s...' % filename)
123 with open(filename,
'wb')
as f:
127 check_decl = (
' CheckFactories.registerCheck<' + check_name_camel +
128 '>(\n "' + check_name +
'");\n')
132 match = re.search(
'#include "(.*)"', line)
135 if match.group(1) > check_name_camel:
137 f.write(
'#include "' + check_name_camel +
'.h"\n')
140 f.write(
'#include "' + check_name_camel +
'.h"\n')
143 if line.strip() ==
'}':
147 match = re.search(
'registerCheck<(.*)>', line)
148 if match
and match.group(1) > check_name_camel:
156 filename = os.path.normpath(os.path.join(clang_tidy_path,
157 '../docs/ReleaseNotes.rst'))
158 with open(filename,
'r') as f: 159 lines = f.readlines() 161 print('Updating %s...' % filename)
162 with open(filename,
'wb')
as f:
168 match = re.search(
'Improvements to clang-tidy', line)
172 if not line.startswith(
'----'):
174 - The '%s' check was renamed to `%s 175 <http://clang.llvm.org/extra/clang-tidy/checks/%s.html>`_ 176 """ % (old_check_name, new_check_name, new_check_name))
182 parser = argparse.ArgumentParser(description=
'Rename clang-tidy check.')
183 parser.add_argument(
'old_check_name', type=str,
184 help=
'Old check name.')
185 parser.add_argument(
'new_check_name', type=str,
186 help=
'New check name.')
187 parser.add_argument(
'--check_class_name', type=str,
188 help=
'Old name of the class implementing the check.')
189 args = parser.parse_args()
191 old_module = args.old_check_name.split(
'-')[0]
192 new_module = args.new_check_name.split(
'-')[0]
193 if args.check_class_name:
194 check_name_camel = args.check_class_name
196 check_name_camel = (
''.
join(map(
lambda elem: elem.capitalize(),
197 args.old_check_name.split(
'-')[1:])) +
200 new_check_name_camel = (
''.
join(map(
lambda elem: elem.capitalize(),
201 args.new_check_name.split(
'-')[1:])) +
204 clang_tidy_path = os.path.dirname(__file__)
206 header_guard_variants = [
207 (old_module +
'_' + new_check_name_camel).upper(),
208 args.old_check_name.replace(
'-',
'_').upper()]
209 header_guard_new = (new_module +
'_' + new_check_name_camel).upper()
211 old_module_path = os.path.join(clang_tidy_path, old_module)
212 new_module_path = os.path.join(clang_tidy_path, new_module)
215 cmake_lists = os.path.join(old_module_path,
'CMakeLists.txt')
218 print(
"Check name '%s' not found in %s. Exiting." %
219 (check_name_camel, cmake_lists))
223 lambda p: p.lower() == old_module.lower() +
'tidymodule.cpp',
224 os.listdir(old_module_path))[0]
226 check_name_camel +
'|' + args.old_check_name)
229 originalName = filename
230 filename =
fileRename(filename, args.old_check_name,
232 filename =
fileRename(filename, check_name_camel, new_check_name_camel)
237 for header_guard
in header_guard_variants:
240 if args.new_check_name +
'.rst' in filename:
243 args.old_check_name +
'\n' +
'=' * len(args.old_check_name) +
'\n',
244 args.new_check_name +
'\n' +
'=' * len(args.new_check_name) +
'\n')
246 replaceInFile(filename, args.old_check_name, args.new_check_name)
247 replaceInFile(filename, old_module +
'::' + check_name_camel,
248 new_module +
'::' + new_check_name_camel)
250 new_module +
'/' + new_check_name_camel)
251 replaceInFile(filename, check_name_camel, new_check_name_camel)
253 if old_module != new_module:
254 check_implementation_files = glob.glob(
255 os.path.join(old_module_path, new_check_name_camel +
'*'))
256 for filename
in check_implementation_files:
258 filename =
fileRename(filename, old_module_path, new_module_path)
260 'namespace ' + new_module)
264 adapt_module(new_module_path, new_module, args.new_check_name,
265 new_check_name_camel)
267 os.system(os.path.join(clang_tidy_path,
'add_new_check.py')
271 if __name__ ==
'__main__':
def generateCommentLineHeader(filename)
def replaceInFile(fileName, sFrom, sTo)
def fileRename(fileName, sFrom, sTo)
def add_release_notes(clang_tidy_path, old_check_name, new_check_name)
def generateCommentLineSource(filename)
def adapt_cmake(module_path, check_name_camel)
def adapt_module(module_path, module, check_name, check_name_camel)
def getListOfFiles(clang_tidy_path)
def deleteMatchingLines(fileName, pattern)
static std::string join(ArrayRef< SpecialMemberFunctionsCheck::SpecialMemberFunctionKind > SMFS, llvm::StringRef AndOr)