21 with open(fileName,
"r")
as f:
24 txt = re.sub(sFrom, sTo, txt)
25 print(
"Replacing '%s' -> '%s' in '%s'..." % (sFrom, sTo, fileName))
26 with open(fileName,
"w")
as f:
34 with open(fileName,
"r")
as f:
40 txt = txt.replace(sFrom, sTo)
41 print(
"Replacing '%s' -> '%s' in '%s'..." % (sFrom, sTo, fileName))
42 with open(fileName,
"w")
as f:
47 return ''.
join([
'//===--- ',
48 os.path.basename(filename),
50 '-' * max(0, 42 - len(os.path.basename(filename))),
55 return ''.
join([
'//===--- ',
56 os.path.basename(filename),
58 '-' * max(0, 52 - len(os.path.basename(filename))),
63 if sFrom
not in fileName
or sFrom == sTo:
65 newFileName = fileName.replace(sFrom, sTo)
66 print(
"Renaming '%s' -> '%s'..." % (fileName, newFileName))
67 os.rename(fileName, newFileName)
73 with open(fileName,
"r")
as f:
76 not_matching_lines = [l
for l
in lines
if not re.search(pattern, l)]
77 if len(not_matching_lines) == len(lines):
80 print(
"Removing lines matching '%s' in '%s'..." % (pattern, fileName))
81 print(
' ' +
' '.
join([l
for l
in lines
if re.search(pattern, l)]))
82 with open(fileName,
"w")
as f:
83 f.writelines(not_matching_lines)
89 files = glob.glob(os.path.join(clang_tidy_path,
'*'))
91 if os.path.isdir(dirname):
92 files += glob.glob(os.path.join(dirname,
'*'))
93 files += glob.glob(os.path.join(clang_tidy_path,
'..',
'test',
95 files += glob.glob(os.path.join(clang_tidy_path,
'..',
'docs',
96 'clang-tidy',
'checks',
'*'))
97 return [filename
for filename
in files
if os.path.isfile(filename)]
103 filename = os.path.join(module_path,
'CMakeLists.txt')
104 with open(filename,
'r')
as f:
105 lines = f.readlines()
107 cpp_file = check_name_camel +
'.cpp'
111 if line.strip() == cpp_file:
114 print(
'Updating %s...' % filename)
115 with open(filename,
'wb')
as f:
119 cpp_line = line.strip().endswith(
'.cpp')
120 if (
not file_added)
and (cpp_line
or cpp_found):
122 if (line.strip() > cpp_file)
or (
not cpp_line):
123 f.write(
' ' + cpp_file +
'\n')
131 modulecpp = filter(
lambda p: p.lower() == module.lower() +
'tidymodule.cpp',
132 os.listdir(module_path))[0]
133 filename = os.path.join(module_path, modulecpp)
134 with open(filename,
'r')
as f:
135 lines = f.readlines()
137 print(
'Updating %s...' % filename)
138 with open(filename,
'wb')
as f:
142 check_decl = (
' CheckFactories.registerCheck<' + check_name_camel +
143 '>(\n "' + check_name +
'");\n')
147 match = re.search(
'#include "(.*)"', line)
150 if match.group(1) > check_name_camel:
152 f.write(
'#include "' + check_name_camel +
'.h"\n')
155 f.write(
'#include "' + check_name_camel +
'.h"\n')
158 if line.strip() ==
'}':
162 match = re.search(
'registerCheck<(.*)>', line)
163 if match
and match.group(1) > check_name_camel:
171 filename = os.path.normpath(os.path.join(clang_tidy_path,
172 '../docs/ReleaseNotes.rst'))
173 with open(filename,
'r')
as f:
174 lines = f.readlines()
176 lineMatcher = re.compile(
'Renamed checks')
177 nextSectionMatcher = re.compile(
'Improvements to include-fixer')
178 checkMatcher = re.compile(
'- The \'(.*)')
180 print(
'Updating %s...' % filename)
181 with open(filename,
'wb')
as f:
184 add_note_here =
False
188 match = lineMatcher.match(line)
189 match_next = nextSectionMatcher.match(line)
190 match_check = checkMatcher.match(line)
192 last_check = match_check.group(1)
193 if last_check > old_check_name:
204 if line.startswith(
'^^^^'):
208 if header_found
and add_note_here:
209 if not line.startswith(
'^^^^'):
210 f.write(
"""- The '%s' check was renamed to :doc:`%s
211 <clang-tidy/checks/%s>`
213 """ % (old_check_name, new_check_name, new_check_name))
219 parser = argparse.ArgumentParser(description=
'Rename clang-tidy check.')
220 parser.add_argument(
'old_check_name', type=str,
221 help=
'Old check name.')
222 parser.add_argument(
'new_check_name', type=str,
223 help=
'New check name.')
224 parser.add_argument(
'--check_class_name', type=str,
225 help=
'Old name of the class implementing the check.')
226 args = parser.parse_args()
228 old_module = args.old_check_name.split(
'-')[0]
229 new_module = args.new_check_name.split(
'-')[0]
230 if args.check_class_name:
231 check_name_camel = args.check_class_name
233 check_name_camel = (
''.
join(map(
lambda elem: elem.capitalize(),
234 args.old_check_name.split(
'-')[1:])) +
237 new_check_name_camel = (
''.
join(map(
lambda elem: elem.capitalize(),
238 args.new_check_name.split(
'-')[1:])) +
241 clang_tidy_path = os.path.dirname(__file__)
243 header_guard_variants = [
244 (args.old_check_name.replace(
'-',
'_')).upper() +
'_CHECK',
245 (old_module +
'_' + check_name_camel).upper(),
246 (old_module +
'_' + new_check_name_camel).upper(),
247 args.old_check_name.replace(
'-',
'_').upper()]
248 header_guard_new = (new_module +
'_' + new_check_name_camel).upper()
250 old_module_path = os.path.join(clang_tidy_path, old_module)
251 new_module_path = os.path.join(clang_tidy_path, new_module)
253 if (args.old_check_name != args.new_check_name):
255 cmake_lists = os.path.join(old_module_path,
'CMakeLists.txt')
258 print(
"Check name '%s' not found in %s. Exiting." %
259 (check_name_camel, cmake_lists))
263 lambda p: p.lower() == old_module.lower() +
'tidymodule.cpp',
264 os.listdir(old_module_path))[0]
266 '\\b' + check_name_camel +
'|\\b' + args.old_check_name)
269 originalName = filename
270 filename =
fileRename(filename, args.old_check_name,
272 filename =
fileRename(filename, check_name_camel, new_check_name_camel)
277 for header_guard
in header_guard_variants:
280 if args.new_check_name +
'.rst' in filename:
283 args.old_check_name +
'\n' +
'=' * len(args.old_check_name) +
'\n',
284 args.new_check_name +
'\n' +
'=' * len(args.new_check_name) +
'\n')
286 replaceInFile(filename, args.old_check_name, args.new_check_name)
287 replaceInFile(filename, old_module +
'::' + check_name_camel,
288 new_module +
'::' + new_check_name_camel)
290 new_module +
'/' + new_check_name_camel)
291 replaceInFile(filename, check_name_camel, new_check_name_camel)
293 if old_module != new_module
or new_module ==
'llvm':
294 if new_module ==
'llvm':
295 new_namespace = new_module +
'_check'
297 new_namespace = new_module
298 check_implementation_files = glob.glob(
299 os.path.join(old_module_path, new_check_name_camel +
'*'))
300 for filename
in check_implementation_files:
302 filename =
fileRename(filename, old_module_path, new_module_path)
304 'namespace ' + new_namespace)
306 if (args.old_check_name == args.new_check_name):
311 adapt_module(new_module_path, new_module, args.new_check_name,
312 new_check_name_camel)
314 os.system(os.path.join(clang_tidy_path,
'add_new_check.py')
319 if __name__ ==
'__main__':