Skip to content

Instantly share code, notes, and snippets.

@timonus
Created January 16, 2015 00:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save timonus/bc8a515444b55a0622d6 to your computer and use it in GitHub Desktop.
Save timonus/bc8a515444b55a0622d6 to your computer and use it in GitHub Desktop.
Class Hierarchy Visualizer
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment