blob: c6a38e7077942d2e158d7cb7e9693618ef6260c2 [file] [log] [blame]
#!/usr/bin/python
# This tool helps assess the impact of automatically applying
# heuristics that omit 'needless' words from APIs imported from Clang
# into Swift.
import getopt
import sys
import subprocess
# Print help
def help():
print('omit-needless-words.py [options] -m <modulename>')
print('')
print('Summary:')
print("\tDetermines the effects of omitting 'needless' words from imported APIs")
print('')
print('Options:')
print('\t-s <sdkname>\t\t\tThe SDK to use (e.g., macosx)')
print("\t--sdk=<sdkname>'\t\tDefaults to 'macosx'")
print('')
print('\t-t <triple>\t\t\tThe target triple to use (e.g., x86_64-apple-macosx10.10)')
print("\t--target=<triple>'\t\tDefaults to 'x86_64-apple-macosx10.10'")
print('')
print('\t-i <executable>\t\t\tThe swift-ide-test executable')
print("\t--swift-ide-test=<executable>\tDefaults to 'swift-ide-test'")
print('')
print('\t-d <executable>\t\t\tThe tool to use to diff the results')
print("\t--diff_tool=<executable>\tDefaults to 'opendiff'")
print('')
print('\t-b\t\t\t\tOnly omit the "before" result')
print('\t--only-before')
print('')
print('\t-a\t\t\t\tOnly omit the "after" result')
print('\t--only-after')
print('Examples:')
print('\tpython omit-needless-words.py -m AppKit')
# Configuration information
sdk = 'macosx'
target = ''
module = ''
source_filename = 'omit-needless-words.swift'
swift_ide_test = 'swift-ide-test'
diff_tool = 'opendiff'
only_before=0
only_after=0
# Parse command-line arguments.
try:
opts, args = getopt.getopt(sys.argv[1:], 'hs:t:m:i:d:ba',
['help', 'sdk=', 'target=', 'module=',
'swift-ide-test=','diff_tool=','only-before',
'only-after'])
except getopt.GetoptError:
help()
sys.exit(2)
for opt, arg in opts:
if opt in ('-h', '--help'):
help()
sys.exit()
if opt in ('-s', '--sdk'):
sdk = arg
continue
if opt in ('-t', '--target'):
target = arg
continue
if opt in ('-m', '--module'):
module = arg
continue
if opt in ('-i', '--swift-ide-test'):
swift_ide_test = arg
continue
if opt in ('-d', '--diff_tool'):
diff_tool = arg
continue
if opt in ('-b', '--only-before'):
only_before=1
continue
if opt in ('-a', '--only-after'):
only_after=1
continue
help()
sys.exit(2)
if module == '':
help()
sys.exit(2)
if target == '':
if sdk == 'macosx':
target = 'x86_64-apple-macosx10.10'
if sdk == 'iphoneos':
target = 'arm64-apple-ios8.0'
if sdk == 'iphonesimulator':
target = 'x86_64-apple-ios8.0'
if sdk == 'watchos':
target = 'armv7k-apple-watchos2.0'
if sdk == 'watchos.simulator':
target = 'i386-apple-watchos2.0'
if sdk == 'appletvos':
target = 'arm64-apple-tvos9'
if sdk == 'appletvos.simulator':
target = 'x86_64-apple-tvos9'
# Figure out the SDK root for the requested SDK
sdkroot = subprocess.check_output(['xcrun', '--show-sdk-path', '--sdk', sdk]).rstrip()
print('SDK Root = %s' % (sdkroot))
swift_ide_test_cmd = [swift_ide_test, '-print-module', '-source-filename', source_filename, '-sdk', sdkroot, '-target', target, '-module-print-skip-overlay', '-skip-unavailable', '-module-print-submodules', '-skip-parameter-names', '-skip-imports', '-module-to-print=%s' % (module)]
omit_needless_words_args = ['-enable-omit-needless-words', '-enable-infer-default-arguments']
# Determine the output files.
before_filename = '%s.before.txt' % (module)
after_filename = '%s.after.txt' % (module)
# Create a .swift file we can feed into swift-ide-test
subprocess.call(['touch', source_filename])
if only_after == 0:
# Print the interface without omitting needless words
print('Writing %s...' % before_filename)
before_file = open(before_filename, 'w')
subprocess.call(swift_ide_test_cmd, stdout=before_file)
before_file.close()
if only_before == 0:
# Print the interface omitting needless words
print('Writing %s...' % after_filename)
after_file = open(after_filename, 'w')
subprocess.call(swift_ide_test_cmd + omit_needless_words_args, stdout=after_file)
after_file.close()
# Remove the .swift file we fed into swift-ide-test
subprocess.call(['rm', '-f', source_filename])
# Diff them.
if diff_tool != '':
subprocess.call([diff_tool, before_filename, after_filename])