mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00

This test drives the new tools_webrtc/remove_extra_namespace.py tool. Bug: None Change-Id: I9b590aa1213e4cace2d64d555f4dafd893f03606 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/327021 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#41141}
93 lines
3.3 KiB
Python
Executable file
93 lines
3.3 KiB
Python
Executable file
#!/usr/bin/env vpython3
|
|
|
|
# Copyright (c) 2023 The WebRTC project authors. All Rights Reserved.
|
|
#
|
|
# Use of this source code is governed by a BSD-style license
|
|
# that can be found in the LICENSE file in the root of the source
|
|
# tree. An additional intellectual property rights grant can be found
|
|
# in the file PATENTS. All contributing project authors may
|
|
# be found in the AUTHORS file in the root of the source tree.
|
|
"""Remove extra namespace qualifications
|
|
|
|
Looks for names that don't need to be qualified by namespace, and deletes
|
|
the qualifier.
|
|
|
|
Depends on namespace names being properly formatted
|
|
"""
|
|
import os
|
|
import glob
|
|
import sys
|
|
import re
|
|
import argparse
|
|
|
|
|
|
def remove_extra_namespace_from_file(namespace, filename):
|
|
print('Processing namespace', namespace, 'file', filename)
|
|
with open(filename) as file:
|
|
newfile = open(filename + '.NEW', 'w')
|
|
namespaces = []
|
|
changes = 0
|
|
for line in file:
|
|
match = re.match(r'namespace (\S+) {', line)
|
|
if match is not None:
|
|
namespaces.insert(0, match.group(1))
|
|
newfile.write(line)
|
|
continue
|
|
match = re.match(r'}\s+// namespace (\S+)$', line)
|
|
if match is not None:
|
|
if match.group(1) != namespaces[0]:
|
|
print('Namespace mismatch')
|
|
raise RuntimeError('Namespace mismatch')
|
|
del namespaces[0]
|
|
newfile.write(line)
|
|
continue
|
|
# Remove namespace usage. Only replacing when target
|
|
# namespace is the innermost namespace.
|
|
if len(namespaces) > 0 and namespaces[0] == namespace:
|
|
# Note that in namespace foo, we match neither ::foo::name
|
|
# nor morefoo::name
|
|
# Neither do we match foo:: when it is not followed by
|
|
# an identifier character.
|
|
usage_re = r'(?<=[^a-z:]){}::(?=[a-zA-Z])'.format(
|
|
namespaces[0])
|
|
if re.search(usage_re, line):
|
|
line = re.sub(usage_re, '', line)
|
|
changes += 1
|
|
newfile.write(line)
|
|
if changes > 0:
|
|
print('Made', changes, 'changes to', filename)
|
|
os.remove(filename)
|
|
os.rename(filename + '.NEW', filename)
|
|
else:
|
|
os.remove(filename + '.NEW')
|
|
|
|
|
|
def remove_extra_namespace_from_files(namespace, files):
|
|
for file in files:
|
|
if os.path.isfile(file):
|
|
if re.search(r'\.(h|cc)$', file):
|
|
remove_extra_namespace_from_file(namespace, file)
|
|
elif os.path.isdir(file):
|
|
if file in ('third_party', 'out'):
|
|
continue
|
|
subfiles = glob.glob(file + '/*')
|
|
remove_extra_namespace_from_files(namespace, subfiles)
|
|
else:
|
|
print(file, 'is not a file or directory, ignoring')
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
prog='remove_extra_namespace.py',
|
|
description=__doc__.strip().splitlines()[0],
|
|
epilog=''.join(__doc__.splitlines(True)[1:]),
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
)
|
|
parser.add_argument('--namespace')
|
|
parser.add_argument('files', nargs=argparse.REMAINDER)
|
|
args = parser.parse_args()
|
|
return remove_extra_namespace_from_files(args.namespace, args.files)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main())
|