clang-tools  4.0.0
rename_check.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #
3 #===- rename_check.py - clang-tidy check renamer -------------*- python -*--===#
4 #
5 # The LLVM Compiler Infrastructure
6 #
7 # This file is distributed under the University of Illinois Open Source
8 # License. See LICENSE.TXT for details.
9 #
10 #===------------------------------------------------------------------------===#
11 
12 import os
13 import glob
14 import argparse
15 
16 
17 def replaceInFile(fileName, sFrom, sTo):
18  if sFrom == sTo:
19  return
20  txt = None
21  with open(fileName, "r") as f:
22  txt = f.read()
23 
24  if sFrom not in txt:
25  return
26 
27  txt = txt.replace(sFrom, sTo)
28  print("Replace '%s' -> '%s' in '%s'" % (sFrom, sTo, fileName))
29  with open(fileName, "w") as f:
30  f.write(txt)
31 
32 
34  return ''.join(['//===--- ',
35  os.path.basename(filename),
36  ' - clang-tidy ',
37  '-' * max(0, 42 - len(os.path.basename(filename))),
38  '*- C++ -*-===//'])
39 
40 
42  return ''.join(['//===--- ',
43  os.path.basename(filename),
44  ' - clang-tidy',
45  '-' * max(0, 52 - len(os.path.basename(filename))),
46  '-===//'])
47 
48 
49 def fileRename(fileName, sFrom, sTo):
50  if sFrom not in fileName:
51  return fileName
52  newFileName = fileName.replace(sFrom, sTo)
53  print("Rename '%s' -> '%s'" % (fileName, newFileName))
54  os.rename(fileName, newFileName)
55  return newFileName
56 
57 
58 def getListOfFiles(clang_tidy_path):
59  files = glob.glob(os.path.join(clang_tidy_path, '*'))
60  for dirname in files:
61  if os.path.isdir(dirname):
62  files += glob.glob(os.path.join(dirname, '*'))
63  files += glob.glob(os.path.join(clang_tidy_path, '..', 'test',
64  'clang-tidy', '*'))
65  files += glob.glob(os.path.join(clang_tidy_path, '..', 'docs',
66  'clang-tidy', 'checks', '*'))
67  return [filename for filename in files if os.path.isfile(filename)]
68 
69 
70 def main():
71  parser = argparse.ArgumentParser(description='Rename clang-tidy check.')
72  parser.add_argument('module', type=str,
73  help='Module where the renamed check is defined')
74  parser.add_argument('old_check_name', type=str,
75  help='Old check name.')
76  parser.add_argument('new_check_name', type=str,
77  help='New check name.')
78  args = parser.parse_args()
79 
80  args.module = args.module.lower()
81  check_name_camel = ''.join(map(lambda elem: elem.capitalize(),
82  args.old_check_name.split('-'))) + 'Check'
83  check_name_new_camel = (''.join(map(lambda elem: elem.capitalize(),
84  args.new_check_name.split('-'))) +
85  'Check')
86 
87  clang_tidy_path = os.path.dirname(__file__)
88 
89  header_guard_old = (args.module.upper() + '_' +
90  args.old_check_name.upper().replace('-', '_'))
91  header_guard_new = (args.module.upper() + '_' +
92  args.new_check_name.upper().replace('-', '_'))
93 
94  for filename in getListOfFiles(clang_tidy_path):
95  originalName = filename
96  filename = fileRename(filename, args.old_check_name,
97  args.new_check_name)
98  filename = fileRename(filename, check_name_camel, check_name_new_camel)
99  replaceInFile(filename, generateCommentLineHeader(originalName),
100  generateCommentLineHeader(filename))
101  replaceInFile(filename, generateCommentLineSource(originalName),
102  generateCommentLineSource(filename))
103  replaceInFile(filename, header_guard_old, header_guard_new)
104  replaceInFile(filename, args.old_check_name, args.new_check_name)
105  replaceInFile(filename, check_name_camel, check_name_new_camel)
106 
107 if __name__ == '__main__':
108  main()
def generateCommentLineSource
Definition: rename_check.py:41
def generateCommentLineHeader
Definition: rename_check.py:33
def getListOfFiles
Definition: rename_check.py:58
static std::string join(ArrayRef< SpecialMemberFunctionsCheck::SpecialMemberFunctionKind > SMFS, llvm::StringRef AndOr)