81 files = glob.glob(os.path.join(clang_tidy_path,
"**"), recursive=
True)
83 os.path.normpath(os.path.join(clang_tidy_path,
"../docs/ReleaseNotes.md"))
86 os.path.join(clang_tidy_path,
"..",
"test",
"clang-tidy",
"checkers",
"**"),
89 docs_path = os.path.join(clang_tidy_path,
"..",
"docs",
"clang-tidy",
"checks")
92 for extension
in (
".md",
".rst"):
93 files += glob.glob(os.path.join(docs_path, f
"*{extension}"))
94 files += glob.glob(os.path.join(docs_path,
"*", f
"*{extension}"))
95 return [filename
for filename
in files
if os.path.isfile(filename)]
183 clang_tidy_path: str, old_check_name: str, new_check_name: str
185 filename = os.path.normpath(
186 os.path.join(clang_tidy_path,
"../docs/ReleaseNotes.md")
188 with io.open(filename,
"r", encoding=
"utf8")
as f:
189 lines = f.readlines()
191 lineMatcher = re.compile(
r"#### Renamed checks")
192 nextSectionMatcher = re.compile(
r"### Improvements to include-fixer")
193 checkMatcher = re.compile(
"- The '(.*)")
195 print(
"Updating %s..." % filename)
196 with io.open(filename,
"w", encoding=
"utf8")
as f:
199 add_note_here =
False
203 match = lineMatcher.match(line)
204 match_next = nextSectionMatcher.match(line)
205 match_check = checkMatcher.match(line)
207 last_check = match_check.group(1)
208 if last_check > old_check_name:
216 if header_found
and line.startswith(
"#"):
224 if header_found
and add_note_here:
226 "- The '%s' check was renamed to {doc}`%s\n"
227 " <clang-tidy/checks/%s/%s>`\n"
232 new_check_name.split(
"-", 1)[0],
233 "-".join(new_check_name.split(
"-")[1:]),
242 parser = argparse.ArgumentParser(description=
"Rename clang-tidy check.")
243 parser.add_argument(
"old_check_name", type=str, help=
"Old check name.")
244 parser.add_argument(
"new_check_name", type=str, help=
"New check name.")
246 "--check_class_name",
248 help=
"Old name of the class implementing the check.",
250 args = parser.parse_args()
252 old_module = args.old_check_name.split(
"-")[0]
253 new_module = args.new_check_name.split(
"-")[0]
254 old_name =
"-".join(args.old_check_name.split(
"-")[1:])
255 new_name =
"-".join(args.new_check_name.split(
"-")[1:])
257 if args.check_class_name:
258 check_name_camel = args.check_class_name
261 "".join(map(
lambda elem: elem.capitalize(), old_name.split(
"-"))) +
"Check"
264 new_check_name_camel = (
265 "".join(map(
lambda elem: elem.capitalize(), new_name.split(
"-"))) +
"Check"
268 clang_tidy_path = os.path.dirname(__file__)
270 header_guard_variants = [
271 (args.old_check_name.replace(
"-",
"_")).upper() +
"_CHECK",
272 (old_module +
"_" + check_name_camel).upper(),
273 (old_module +
"_" + new_check_name_camel).upper(),
274 args.old_check_name.replace(
"-",
"_").upper(),
276 header_guard_new = (new_module +
"_" + new_check_name_camel).upper()
278 old_module_path = os.path.join(clang_tidy_path, old_module)
279 new_module_path = os.path.join(clang_tidy_path, new_module)
281 if old_module != new_module:
283 cmake_lists = os.path.join(old_module_path,
"CMakeLists.txt")
287 "Check name '%s' not found in %s. Exiting."
288 % (check_name_camel, cmake_lists)
295 lambda p: p.lower() == old_module.lower() +
"tidymodule.cpp",
296 os.listdir(old_module_path),
301 os.path.join(old_module_path, modulecpp),
302 "\\b" + check_name_camel +
"|\\b" + args.old_check_name,
307 filename, old_module +
"/" + old_name, new_module +
"/" + new_name
309 filename =
fileRename(filename, args.old_check_name, args.new_check_name)
310 filename =
fileRename(filename, check_name_camel, new_check_name_camel)
311 for header_guard
in header_guard_variants:
316 if new_module +
"/" + new_name +
".rst" in filename:
319 args.old_check_name +
"\n" +
"=" * len(args.old_check_name) +
"\n",
320 args.new_check_name +
"\n" +
"=" * len(args.new_check_name) +
"\n",
323 replaceInFile(filename, args.old_check_name, args.new_check_name)
326 old_module +
"::" + check_name_camel,
327 new_module +
"::" + new_check_name_camel,
331 old_module +
"/" + check_name_camel,
332 new_module +
"/" + new_check_name_camel,
335 filename, old_module +
"/" + old_name, new_module +
"/" + new_name
337 replaceInFile(filename, check_name_camel, new_check_name_camel)
339 if old_module != new_module
or new_module ==
"llvm":
340 if new_module ==
"llvm":
341 new_namespace = new_module +
"_check"
343 new_namespace = new_module
344 check_implementation_files = glob.glob(
345 os.path.join(old_module_path, new_check_name_camel +
"*")
347 for filename
in check_implementation_files:
349 filename =
fileRename(filename, old_module_path, new_module_path)
352 "namespace clang::tidy::" + old_module +
"[^ \n]*",
353 "namespace clang::tidy::" + new_namespace,
356 if old_module != new_module:
361 new_module_path, new_module, args.new_check_name, new_check_name_camel
364 os.system(os.path.join(clang_tidy_path,
"add_new_check.py") +
" --update-docs")