File: AddOverrides.py

package info (click to toggle)
vtk9 9.1.0%2Breally9.1.0%2Bdfsg2-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 153,832 kB
  • sloc: cpp: 1,800,419; ansic: 261,033; python: 86,332; yacc: 4,033; java: 3,977; xml: 3,068; sh: 2,702; perl: 2,189; lex: 1,761; objc: 143; makefile: 139; tcl: 59
file content (94 lines) | stat: -rw-r--r-- 2,932 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# This Python script can be used to add override statements where they are
# reported to be needed according to warnings produced by clang-700.1.76 on macOS
# 10.11.6 with the -Winconsistent-missing-override option enabled. To run the
# script, invoke

# > python AddOverrides.py <overrides.txt>

# Each line of the overrides.txt file has the form

# <source file>:<line number>:<position>: warning: 'RequestDataDescription' \
#   overrides a member function but is not marked 'override' [-Winconsistent-missing-override]

# It can be generated by running

# > ninja clean
# > ninja &> output.txt
# > grep "overrides a member function but" output.txt | sort | uniq > overrides.txt

# The script should be idempotent, so it can be run a second time without adversly
# affecting files that have already been modified during a first run.

import re
import sys
import __future__

lines_map = {}

# Load override warning file. Store file name as key and list of lines to modify
# as values.
with open(sys.argv[1], 'r') as f:
  for line in f:
    components = line.split(':')
    file_name = components[0]
    line_number = int(components[1])
    if file_name in lines_map:
      lines_map[file_name].add(line_number)
    else:
      lines_map[file_name] = {line_number}
    #break

# Sort the line numbers
for k, v in lines_map.items():
  sorted_line_numbers = sorted(v)
  lines_map[k] = sorted_line_numbers

# Now open each file in the dictionary, append override to the end of each
# line, and save out the modified file

for file_name, line_numbers in lines_map.items():
  lines = []
  with open(file_name, 'r') as f:
    contents = f.read()
    lines = contents.split('\n')
    f.close()

  out_file = open(file_name, 'w')

  counter = 1
  in_multi_line = False
  for line in lines:

    if line.find('override') >= 0:
      in_multi_line = False
    else:

      if in_multi_line or (counter in line_numbers and re.match('^vtk.*Macro', line.lstrip()) is None):
        if line.endswith(');'):
          line = line[0:-1] + ' override;'
          in_multi_line = False
          #print(65, file_name, line, counter)
        elif line.endswith('=0;'):
          line = line[0:-3] + ' override = 0;'
          in_multi_line = False
        elif line.endswith(' = 0;'):
          line = line[0:-5] + ' override = 0;'
          in_multi_line = False
        elif line.endswith(')'):
          line = line + ' override'
          in_multi_line = False
          #print(75, file_name, line, counter)
        elif line.find('{') >= 0:
          idx = line.find('{')
          line = line[:idx].rstrip() + ' override ' + line[idx:].lstrip()
          in_multi_line = False
          print(65, file_name, line, counter)
        elif line.endswith(',') or line.endswith('('):
          in_multi_line = True

    counter = counter + 1
    out_file.write('%s' % line)
    if counter <= len(lines):
      out_file.write('\n')

  out_file.close()