import sys import subprocess import re import os import shutil import json # usage # python class-hierarchy.py *directory to scan within* # outputs nested json if len(sys.argv) < 2: print "No path specified" sys.exit() path = sys.argv[1] hasSuperclass = set() allClassNames = set() allClasses = {} for dirpath, dnames, fnames in os.walk(path): for f in fnames: # if f.endswith(".h") or f.endswith(".m"): path = dirpath + '/' + f; aFile = open(path) for match in re.finditer("@interface\s+(\w+)\s+:\s+(\w+)", aFile.read()): if match != None: className = match.group(1) superClassName = match.group(2) # print className + ' ' + superClassName if not className in allClasses: classDict = {} allClasses[className] = classDict else: classDict = allClasses[className] if not superClassName in allClasses: allClasses[superClassName] = {className: classDict} else: allClasses[superClassName][className] = classDict hasSuperclass.add(className) allClassNames.add(superClassName) allClassNames.add(className) rootClassNames = allClassNames.difference(hasSuperclass) tree = {} for rootClassName in rootClassNames: tree[rootClassName] = allClasses[rootClassName] print json.dumps(tree)