1
0
Fork 0
mirror of synced 2024-07-04 14:31:09 -04:00
ultimate-vim/sources_non_forked/cocoa.vim/lib/extras/cocoa_classes.py
2017-11-27 13:43:13 +08:00

65 lines
2.6 KiB
Python
Executable file

#!/usr/bin/python
'''
Creates text file of Cocoa superclasses in given filename or in
./cocoa_indexes/classes.txt by default.
'''
import os, re
from cocoa_definitions import write_file, find
from commands import getoutput
# We need find_headers() to return a dictionary instead of a list
def find_headers(root_folder, frameworks):
'''Returns a dictionary of the headers for each given framework.'''
headers_and_frameworks = {}
folder = root_folder + '/System/Library/Frameworks/'
for framework in frameworks:
bundle = folder + framework + '.framework'
if os.path.isdir(bundle):
headers_and_frameworks[framework] = ' '.join(find(bundle, '.h'))
return headers_and_frameworks
def get_classes(header_files_and_frameworks):
'''Returns list of Cocoa Protocols classes & their framework.'''
classes = {}
for framework, files in header_files_and_frameworks:
for line in getoutput(r"grep -ho '@\(interface\|protocol\) [A-Z]\w\+' "
+ files).split("\n"):
cocoa_class = re.search(r'[A-Z]\w+', line)
if cocoa_class and not classes.has_key(cocoa_class.group(0)):
classes[cocoa_class.group(0)] = framework
classes = classes.items()
classes.sort()
return classes
def get_superclasses(classes_and_frameworks):
'''
Given a list of Cocoa classes & their frameworks, returns a list of their
superclasses in the form: "class\|superclass\|superclass\|...".
'''
args = ''
for classname, framework in classes_and_frameworks:
args += classname + ' ' + framework + ' '
return getoutput('./superclasses ' + args).split("\n")
def output_file(fname=None):
'''Output text file of Cocoa classes to given filename.'''
if fname is None:
fname = './cocoa_indexes/classes.txt'
if not os.path.isdir(os.path.dirname(fname)):
os.mkdir(os.path.dirname(fname))
cocoa_frameworks = ('Foundation', 'AppKit', 'AddressBook', 'CoreData',
'PreferencePanes', 'QTKit', 'ScreenSaver',
'SyncServices', 'WebKit')
iphone_frameworks = ('UIKit', 'GameKit')
iphone_sdk_path = '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk'
headers_and_frameworks = find_headers('', cocoa_frameworks).items() + \
find_headers(iphone_sdk_path, iphone_frameworks).items()
superclasses = get_superclasses(get_classes(headers_and_frameworks))
write_file(fname, superclasses)
if __name__ == '__main__':
from sys import argv
output_file(argv[1] if len(argv) > 1 else None)