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:
33 with open(fileName,
"r") as f: 39 txt = txt.replace(sFrom, sTo)
40 print(
"Replacing '%s' -> '%s' in '%s'..." % (sFrom, sTo, fileName))
41 with open(fileName,
"w")
as f:
46 return ''.
join([
'//===--- ',
47 os.path.basename(filename),
49 '-' * max(0, 42 - len(os.path.basename(filename))),
54 return ''.
join([
'//===--- ',
55 os.path.basename(filename),
57 '-' * max(0, 52 - len(os.path.basename(filename))),
62 if sFrom
not in fileName
or sFrom == sTo:
64 newFileName = fileName.replace(sFrom, sTo)
65 print(
"Renaming '%s' -> '%s'..." % (fileName, newFileName))
66 os.rename(fileName, newFileName)
71 with open(fileName,
"r") as f: 74 not_matching_lines = [l for l
in lines
if not re.search(pattern, l)]
75 if len(not_matching_lines) == len(lines):
78 print(
"Removing lines matching '%s' in '%s'..." % (pattern, fileName))
79 print(
' ' +
' '.
join([l
for l
in lines
if re.search(pattern, l)]))
80 with open(fileName,
"w")
as f:
81 f.writelines(not_matching_lines)
86 files = glob.glob(os.path.join(clang_tidy_path,
'*'))
88 if os.path.isdir(dirname):
89 files += glob.glob(os.path.join(dirname,
'*'))
90 files += glob.glob(os.path.join(clang_tidy_path,
'..',
'test',
92 files += glob.glob(os.path.join(clang_tidy_path,
'..',
'docs',
93 'clang-tidy',
'checks',
'*'))
94 return [filename
for filename
in files
if os.path.isfile(filename)]
99 filename = os.path.join(module_path,
'CMakeLists.txt')
100 with open(filename,
'r') as f: 101 lines = f.readlines() 103 cpp_file = check_name_camel + '.cpp' 107 if line.strip() == cpp_file:
110 print(
'Updating %s...' % filename)
111 with open(filename,
'wb')
as f:
115 cpp_line = line.strip().endswith(
'.cpp')
116 if (
not file_added)
and (cpp_line
or cpp_found):
118 if (line.strip() > cpp_file)
or (
not cpp_line):
119 f.write(
' ' + cpp_file +
'\n')
127 modulecpp = filter(
lambda p: p.lower() == module.lower() +
'tidymodule.cpp',
128 os.listdir(module_path))[0]
129 filename = os.path.join(module_path, modulecpp)
130 with open(filename,
'r') as f: 131 lines = f.readlines() 133 print('Updating %s...' % filename)
134 with open(filename,
'wb')
as f:
138 check_decl = (
' CheckFactories.registerCheck<' + check_name_camel +
139 '>(\n "' + check_name +
'");\n')
143 match = re.search(
'#include "(.*)"', line)
146 if match.group(1) > check_name_camel:
148 f.write(
'#include "' + check_name_camel +
'.h"\n')
151 f.write(
'#include "' + check_name_camel +
'.h"\n')
154 if line.strip() ==
'}':
158 match = re.search(
'registerCheck<(.*)>', line)
159 if match
and match.group(1) > check_name_camel:
167 filename = os.path.normpath(os.path.join(clang_tidy_path,
168 '../docs/ReleaseNotes.rst'))
169 with open(filename,
'r') as f: 170 lines = f.readlines() 172 print('Updating %s...' % filename)
173 with open(filename,
'wb')
as f:
179 match = re.search(
'Improvements to clang-tidy', line)
183 if not line.startswith(
'----'):
185 - The '%s' check was renamed to :doc:`%s 186 <clang-tidy/checks/%s>` 187 """ % (old_check_name, new_check_name, new_check_name))
193 parser = argparse.ArgumentParser(description=
'Rename clang-tidy check.')
194 parser.add_argument(
'old_check_name', type=str,
195 help=
'Old check name.')
196 parser.add_argument(
'new_check_name', type=str,
197 help=
'New check name.')
198 parser.add_argument(
'--check_class_name', type=str,
199 help=
'Old name of the class implementing the check.')
200 args = parser.parse_args()
202 old_module = args.old_check_name.split(
'-')[0]
203 new_module = args.new_check_name.split(
'-')[0]
204 if args.check_class_name:
205 check_name_camel = args.check_class_name
207 check_name_camel = (
''.
join(map(
lambda elem: elem.capitalize(),
208 args.old_check_name.split(
'-')[1:])) +
211 new_check_name_camel = (
''.
join(map(
lambda elem: elem.capitalize(),
212 args.new_check_name.split(
'-')[1:])) +
215 clang_tidy_path = os.path.dirname(__file__)
217 header_guard_variants = [
218 (args.old_check_name.replace(
'-',
'_')).upper() +
'_CHECK',
219 (old_module +
'_' + check_name_camel).upper(),
220 (old_module +
'_' + new_check_name_camel).upper(),
221 args.old_check_name.replace(
'-',
'_').upper()]
222 header_guard_new = (new_module +
'_' + new_check_name_camel).upper()
224 old_module_path = os.path.join(clang_tidy_path, old_module)
225 new_module_path = os.path.join(clang_tidy_path, new_module)
227 if (args.old_check_name != args.new_check_name):
229 cmake_lists = os.path.join(old_module_path,
'CMakeLists.txt')
232 print(
"Check name '%s' not found in %s. Exiting." %
233 (check_name_camel, cmake_lists))
237 lambda p: p.lower() == old_module.lower() +
'tidymodule.cpp',
238 os.listdir(old_module_path))[0]
240 '\\b' + check_name_camel +
'|\\b' + args.old_check_name)
243 originalName = filename
244 filename =
fileRename(filename, args.old_check_name,
246 filename =
fileRename(filename, check_name_camel, new_check_name_camel)
251 for header_guard
in header_guard_variants:
254 if args.new_check_name +
'.rst' in filename:
257 args.old_check_name +
'\n' +
'=' * len(args.old_check_name) +
'\n',
258 args.new_check_name +
'\n' +
'=' * len(args.new_check_name) +
'\n')
260 replaceInFile(filename, args.old_check_name, args.new_check_name)
261 replaceInFile(filename, old_module +
'::' + check_name_camel,
262 new_module +
'::' + new_check_name_camel)
264 new_module +
'/' + new_check_name_camel)
265 replaceInFile(filename, check_name_camel, new_check_name_camel)
267 if old_module != new_module
or new_module ==
'llvm':
268 if new_module ==
'llvm':
269 new_namespace = new_module +
'_check' 271 new_namespace = new_module
272 check_implementation_files = glob.glob(
273 os.path.join(old_module_path, new_check_name_camel +
'*'))
274 for filename
in check_implementation_files:
276 filename =
fileRename(filename, old_module_path, new_module_path)
278 'namespace ' + new_namespace)
280 if (args.old_check_name == args.new_check_name):
285 adapt_module(new_module_path, new_module, args.new_check_name,
286 new_check_name_camel)
288 os.system(os.path.join(clang_tidy_path,
'add_new_check.py')
292 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 replaceInFileRegex(fileName, sFrom, sTo)
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)