Guest User

Untitled

a guest
Feb 21st, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. # xref a number of python files (only functions)
  2.  
  3. import re, sys
  4. from collections import defaultdict
  5.  
  6. DEF_RE = re.compile(r"\s*def\s+(\w+)\s*\(")
  7. CALL_RE = re.compile(r"\b(\w+)\(")
  8.  
  9. repo = defaultdict(lambda:defaultdict(dict))
  10.  
  11. def get_defs(name):
  12. for i, line in enumerate(open(name)):
  13. m = DEF_RE.match(line)
  14. if m:
  15. repo[name][m.group(1)] = []
  16.  
  17. def get_calls(name):
  18. for i, line in enumerate(open(name)):
  19. if not DEF_RE.match(line):
  20. for m in CALL_RE.finditer(line):
  21. fun = m.group(1)
  22. for n, ns in repo.items():
  23. if fun in ns:
  24. ns[fun].append((name, i))
  25.  
  26. if __name__ == '__main__':
  27. internal = True
  28. compress = True
  29.  
  30. for name in sys.argv[1:]:
  31. get_defs(name)
  32.  
  33. for name in sys.argv[1:]:
  34. get_calls(name)
  35.  
  36. for name, names in repo.items():
  37. print name
  38. print "-" * len(name)
  39. for name1, refs in sorted(names.items()):
  40. if internal or not all(n == name for n, i in refs):
  41. print " %s" % name1
  42. if compress:
  43. refs1 = []
  44. for nn, i in sorted(refs):
  45. if refs1 and refs1[-1][0] == nn:
  46. refs1[-1][1].append(i)
  47. else:
  48. refs1.append((nn, [i]))
  49. for nn, ii in refs1:
  50. print " %s %s" % (nn, ", ".join(str(i) for i in ii))
  51. else:
  52. for ref in sorted(refs):
  53. print " %s:%i" % ref
  54. print
Add Comment
Please, Sign In to add comment