| #!/usr/bin/env python3 | |
| # Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file | |
| # for details. All rights reserved. Use of this source code is governed by a | |
| # BSD-style license that can be found in the LICENSE file. | |
| import argparse | |
| import os | |
| import shutil | |
| import sys | |
| import utils | |
| KOTLIN_EXTENSION = '.kt' | |
| def parse_options(): | |
| parser = argparse.ArgumentParser( | |
| description='Update androidx keep annotations') | |
| parser.add_argument('--androidx', | |
| metavar='<path>', | |
| required=True, | |
| help='Path to the androidx checkout') | |
| parser.add_argument('--dry-run', | |
| '--dry_run', | |
| help="Don't copy, just print what to copy", | |
| default=False, | |
| action='store_true') | |
| return parser.parse_args() | |
| def main(): | |
| args = parse_options() | |
| source_dir = os.path.join(utils.REPO_ROOT, 'src', 'keepanno', 'java', | |
| 'androidx', 'annotation', 'keep') | |
| dest_dir = os.path.join(args.androidx, 'frameworks', 'support', | |
| 'annotation', 'annotation-keep', 'src', | |
| 'commonMain', 'kotlin', 'androidx', 'annotation', | |
| 'keep') | |
| for root, dir_names, filenames in os.walk(source_dir): | |
| if root != source_dir: | |
| print('Unexpected subdirectory under {source_dir}.'.format( | |
| source_dir=source_dir)) | |
| if len(dir_names) > 0: | |
| print('Unexpected subdirectories under {dir_names}.'.format( | |
| dir_names=dir_names)) | |
| for filename in filenames: | |
| if not filename.endswith(KOTLIN_EXTENSION): | |
| print('Unexpected non Kotlin file {filename}.'.format( | |
| filename=os.path.join(root, filename))) | |
| sys.exit(1) | |
| files = ( | |
| 'UnconditionallyKeep.kt', | |
| 'Unspecified.kt', | |
| 'UsesReflectionToAccessField.kt', | |
| 'UsesReflectionToAccessMethod.kt', | |
| 'UsesReflectionToConstruct.kt', | |
| ) | |
| if not filename in files: | |
| print('Skipping {filename}'.format(filename=filename)) | |
| continue | |
| src = os.path.join(root, filename) | |
| dest = os.path.join(dest_dir, filename) | |
| print("Copying '{src}' to '{dest}'".format(src=src, dest=dest)) | |
| if not args.dry_run: | |
| shutil.copyfile(src, dest) | |
| if __name__ == '__main__': | |
| sys.exit(main()) |