Skip to content

Commit 06e07c4

Browse files
committed
Merge pull request #185 from cbrentharris/master
argparse for omit-needless-words.py
2 parents bf5f6bf + 3f3367d commit 06e07c4

File tree

1 file changed

+75
-166
lines changed

1 file changed

+75
-166
lines changed

Diff for: utils/omit-needless-words.py

+75-166
Original file line numberDiff line numberDiff line change
@@ -4,174 +4,83 @@
44
# heuristics that omit 'needless' words from APIs imported from Clang
55
# into Swift.
66

7-
import getopt
8-
import sys
7+
import argparse
98
import subprocess
109

11-
# Print help
12-
def help():
13-
print('omit-needless-words.py [options] -m <modulename>')
14-
print('')
15-
print('Summary:')
16-
print("\tDetermines the effects of omitting 'needless' words from imported APIs")
17-
print('')
18-
print('Options:')
19-
print('\t-s <sdkname>\t\t\tThe SDK to use (e.g., macosx)')
20-
print("\t--sdk=<sdkname>'\t\tDefaults to 'macosx'")
21-
print('')
22-
print('\t-t <triple>\t\t\tThe target triple to use (e.g., x86_64-apple-macosx10.10)')
23-
print("\t--target=<triple>")
24-
print('')
25-
print('\t-i <executable>\t\t\tThe swift-ide-test executable')
26-
print("\t--swift-ide-test=<executable>\tDefaults to 'swift-ide-test'")
27-
print('')
28-
print('\t-d <executable>\t\t\tThe tool to use to diff the results')
29-
print("\t--diff_tool=<executable>\tDefaults to 'opendiff'")
30-
print('')
31-
print('\t-b\t\t\t\tOnly emit the "before" result')
32-
print('\t--only-before')
33-
print('')
34-
print('\t--before-file=<filename>\tEmit "before" results to the given file')
35-
print('\t\t\t\t\tDefaults to <modulename>.before.txt')
36-
print('')
37-
print('\t-a\t\t\t\tOnly emit the "after" result')
38-
print('\t--only-after')
39-
print('')
40-
print('\t--after-file=<filename>\t\tEmit "after" results to the given file')
41-
print('\t\t\t\t\tDefaults to <modulename>.after.txt')
42-
print('')
43-
print('\t-q\t\t\t\tSuppress printing of status messages')
44-
print('')
45-
print('Examples:')
46-
print('\tpython omit-needless-words.py -m AppKit')
47-
48-
# Configuration information
49-
sdk = 'macosx'
50-
target = ''
51-
module = ''
52-
source_filename = 'omit-needless-words.swift'
53-
swift_ide_test = 'swift-ide-test'
54-
diff_tool = 'opendiff'
55-
only_before=0
56-
only_after=0
57-
58-
# Parse command-line arguments.
59-
try:
60-
opts, args = getopt.getopt(sys.argv[1:], 'hs:t:m:i:d:baq',
61-
['help', 'sdk=', 'target=', 'module=',
62-
'swift-ide-test=','diff_tool=','only-before',
63-
'only-after', 'before-file=', 'after-file='])
64-
except getopt.GetoptError:
65-
help()
66-
sys.exit(2)
67-
68-
before_filename = ""
69-
after_filename = ""
70-
verbose = 1
71-
for opt, arg in opts:
72-
if opt in ('-h', '--help'):
73-
help()
74-
sys.exit()
75-
76-
if opt in ('-s', '--sdk'):
77-
sdk = arg
78-
continue
79-
80-
if opt in ('-t', '--target'):
81-
target = arg
82-
continue
83-
84-
if opt in ('-m', '--module'):
85-
module = arg
86-
continue
87-
88-
if opt in ('-i', '--swift-ide-test'):
89-
swift_ide_test = arg
90-
continue
91-
92-
if opt in ('-d', '--diff_tool'):
93-
diff_tool = arg
94-
continue
95-
96-
if opt in ('-b', '--only-before'):
97-
only_before=1
98-
continue
99-
100-
if opt in ('-a', '--only-after'):
101-
only_after=1
102-
continue
103-
104-
if opt == '--before-file':
105-
before_filename = arg
106-
continue
107-
108-
if opt == '--after-file':
109-
after_filename = arg
110-
continue
111-
112-
if opt == '-q':
113-
verbose = 0
114-
continue
10+
DEFAULT_TARGET_BASED_ON_SDK = {
11+
'macosx' : 'x86_64-apple-macosx10.11',
12+
'iphoneos' : 'arm64-apple-ios9.0',
13+
'iphonesimulator' : 'x86_64-apple-ios9.0',
14+
'watchos' : 'armv7k-apple-watchos2.0',
15+
'watchos.simulator' : 'i386-apple-watchos2.0',
16+
'appletvos' : 'arm64-apple-tvos9',
17+
'appletvos.simulator' : 'x86_64-apple-tvos9',
18+
}
19+
20+
def create_parser():
21+
parser = argparse.ArgumentParser(
22+
description="Determines the effects of omitting 'needless' words from imported APIs",
23+
prog='omit-needless-words.py',
24+
usage='python omit-needless-words.py -m AppKit')
25+
parser.add_argument('-m', '--module', required=True, help='The module name.')
26+
parser.add_argument('-s', '--sdk', default='macosx', help="The SDK to use.")
27+
parser.add_argument('-t', '--target', help="The target triple to use.")
28+
parser.add_argument('-i', '--swift-ide-test', default='swift-ide-test', help="The swift-ide-test executable.")
29+
parser.add_argument('-d', '--diff_tool', default='opendiff', help="The tool to use to diff the results.")
30+
parser.add_argument('-b', '--only-before', action='store_true', help='Only emit the "before" result.')
31+
parser.add_argument('--before-file', help='Emit "before" results to the given file [defaults to <modulename>.before.txt].')
32+
parser.add_argument('-a', '--only-after', action='store_true', help='Only emit the "after" result.')
33+
parser.add_argument('--after-file', help='Emit "after" results to the given file [defaults to <modulename>.after.txt].')
34+
parser.add_argument('-q', '--quiet', action='store_true', help='Suppress printing of status messages.')
35+
return parser
36+
37+
def output_command_result_to_file(command_args, filename):
38+
with open(filename, 'w') as output_file:
39+
subprocess.call(command_args, stdout=output_file)
40+
41+
def main():
42+
source_filename = 'omit-needless-words.swift'
43+
parser = create_parser()
44+
args = parser.parse_args()
45+
if not args.target:
46+
args.target = DEFAULT_TARGET_BASED_ON_SDK[args.sdk]
47+
48+
# Figure out the SDK root for the requested SDK
49+
sdkroot = subprocess.check_output(['xcrun', '--show-sdk-path', '--sdk', args.sdk]).rstrip()
50+
if not args.quiet:
51+
print('SDK Root = %s' % (sdkroot))
52+
53+
swift_ide_test_cmd = [args.swift_ide_test, '-print-module', '-source-filename', source_filename, '-sdk', sdkroot, '-target', args.target, '-module-print-skip-overlay', '-skip-unavailable', '-module-print-submodules', '-skip-imports', '-module-to-print=%s' % (args.module)]
54+
omit_needless_words_args = ['-enable-omit-needless-words', '-enable-infer-default-arguments']
11555

116-
help()
117-
sys.exit(2)
118-
119-
if module == '':
120-
help()
121-
sys.exit(2)
122-
123-
if target == '':
124-
if sdk == 'macosx':
125-
target = 'x86_64-apple-macosx10.11'
126-
if sdk == 'iphoneos':
127-
target = 'arm64-apple-ios9.0'
128-
if sdk == 'iphonesimulator':
129-
target = 'x86_64-apple-ios9.0'
130-
if sdk == 'watchos':
131-
target = 'armv7k-apple-watchos2.0'
132-
if sdk == 'watchos.simulator':
133-
target = 'i386-apple-watchos2.0'
134-
if sdk == 'appletvos':
135-
target = 'arm64-apple-tvos9'
136-
if sdk == 'appletvos.simulator':
137-
target = 'x86_64-apple-tvos9'
138-
139-
# Figure out the SDK root for the requested SDK
140-
sdkroot = subprocess.check_output(['xcrun', '--show-sdk-path', '--sdk', sdk]).rstrip()
141-
if verbose != 0:
142-
print('SDK Root = %s' % (sdkroot))
143-
144-
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-imports', '-module-to-print=%s' % (module)]
145-
omit_needless_words_args = ['-enable-omit-needless-words', '-enable-infer-default-arguments']
146-
147-
# Determine the output files.
148-
if before_filename == "":
149-
before_filename = '%s.before.txt' % (module)
150-
if after_filename == "":
151-
after_filename = '%s.after.txt' % (module)
152-
153-
# Create a .swift file we can feed into swift-ide-test
154-
subprocess.call(['touch', source_filename])
155-
156-
if only_after == 0:
157-
# Print the interface without omitting needless words
158-
if verbose != 0:
159-
print('Writing %s...' % before_filename)
160-
before_file = open(before_filename, 'w')
161-
subprocess.call(swift_ide_test_cmd, stdout=before_file)
162-
before_file.close()
163-
164-
if only_before == 0:
165-
# Print the interface omitting needless words
166-
if verbose != 0:
167-
print('Writing %s...' % after_filename)
168-
after_file = open(after_filename, 'w')
169-
subprocess.call(swift_ide_test_cmd + omit_needless_words_args, stdout=after_file)
170-
after_file.close()
56+
# Determine the output files.
57+
# No good way with argparse to set default value based on depenency of other arg.
58+
if not args.before_file:
59+
args.before_file = '%s.before.txt' % (args.module)
60+
if not args.after_file:
61+
args.after_file = '%s.after.txt' % (args.module)
62+
63+
# Create a .swift file we can feed into swift-ide-test
64+
subprocess.call(['touch', source_filename])
65+
66+
if not args.only_after:
67+
# Print the interface without omitting needless words
68+
if not args.quiet:
69+
print('Writing %s...' % args.before_file)
70+
output_command_result_to_file(swift_ide_test_cmd, args.before_file)
71+
72+
if not args.only_before:
73+
# Print the interface omitting needless words
74+
if not args.quiet:
75+
print('Writing %s...' % args.after_file)
76+
output_command_result_to_file(swift_ide_test_cmd + omit_needless_words_args, args.after_file)
77+
78+
# Remove the .swift file we fed into swift-ide-test
79+
subprocess.call(['rm', '-f', source_filename])
80+
81+
# Diff them
82+
subprocess.call([args.diff_tool, args.before_file, args.after_file])
17183

172-
# Remove the .swift file we fed into swift-ide-test
173-
subprocess.call(['rm', '-f', source_filename])
84+
if __name__ == '__main__':
85+
main()
17486

175-
# Diff them.
176-
if diff_tool != '':
177-
subprocess.call([diff_tool, before_filename, after_filename])

0 commit comments

Comments
 (0)