Mercurial > hg-stable
view mercurial/lsprofcalltree.py @ 33438:8056481caa81
codemod: simplify nested withs
This is the result of running:
python codemod_nestedwith.py **/*.py
where codemod_nestedwith.py looks like this:
#!/usr/bin/env python
# codemod_nestedwith.py - codemod tool to rewrite nested with
#
# Copyright 2017 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import, print_function
import sys
import redbaron
def readpath(path):
with open(path) as f:
return f.read()
def writepath(path, content):
with open(path, 'w') as f:
f.write(content)
def main(argv):
if not argv:
print('Usage: codemod_nestedwith.py FILES')
for i, path in enumerate(argv):
print('(%d/%d) scanning %s' % (i + 1, len(argv), path))
changed = False
red = redbaron.RedBaron(readpath(path))
processed = set()
for node in red.find_all('with'):
if node in processed or node.type != 'with':
continue
top = node
child = top[0]
while True:
if len(top) > 1 or child.type != 'with':
break
# estimate line length after merging two "with"s
new = '%swith %s:' % (top.indentation, top.contexts.dumps())
new += ', %s' % child.contexts.dumps()
# only do the rewrite if the end result is within 80 chars
if len(new) > 80:
break
processed.add(child)
top.contexts.extend(child.contexts)
top.value = child.value
top.value.decrease_indentation(4)
child = child[0]
changed = True
if changed:
print('updating %s' % path)
writepath(path, red.dumps())
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Differential Revision: https://phab.mercurial-scm.org/D77
author | Jun Wu <quark@fb.com> |
---|---|
date | Thu, 13 Jul 2017 18:31:35 -0700 |
parents | 5a988b3c9645 |
children | 1ae0faa14797 |
line wrap: on
line source
""" lsprofcalltree.py - lsprof output which is readable by kcachegrind Authors: * David Allouche <david <at> allouche.net> * Jp Calderone & Itamar Shtull-Trauring * Johan Dahlin This software may be used and distributed according to the terms of the GNU General Public License, incorporated herein by reference. """ from __future__ import absolute_import, print_function def label(code): if isinstance(code, str): return '~' + code # built-in functions ('~' sorts at the end) else: return '%s %s:%d' % (code.co_name, code.co_filename, code.co_firstlineno) class KCacheGrind(object): def __init__(self, profiler): self.data = profiler.getstats() self.out_file = None def output(self, out_file): self.out_file = out_file print('events: Ticks', file=out_file) self._print_summary() for entry in self.data: self._entry(entry) def _print_summary(self): max_cost = 0 for entry in self.data: totaltime = int(entry.totaltime * 1000) max_cost = max(max_cost, totaltime) print('summary: %d' % max_cost, file=self.out_file) def _entry(self, entry): out_file = self.out_file code = entry.code if isinstance(code, str): print('fi=~', file=out_file) else: print('fi=%s' % code.co_filename, file=out_file) print('fn=%s' % label(code), file=out_file) inlinetime = int(entry.inlinetime * 1000) if isinstance(code, str): print('0 ', inlinetime, file=out_file) else: print('%d %d' % (code.co_firstlineno, inlinetime), file=out_file) # recursive calls are counted in entry.calls if entry.calls: calls = entry.calls else: calls = [] if isinstance(code, str): lineno = 0 else: lineno = code.co_firstlineno for subentry in calls: self._subentry(lineno, subentry) print(file=out_file) def _subentry(self, lineno, subentry): out_file = self.out_file code = subentry.code print('cfn=%s' % label(code), file=out_file) if isinstance(code, str): print('cfi=~', file=out_file) print('calls=%d 0' % subentry.callcount, file=out_file) else: print('cfi=%s' % code.co_filename, file=out_file) print('calls=%d %d' % ( subentry.callcount, code.co_firstlineno), file=out_file) totaltime = int(subentry.totaltime * 1000) print('%d %d' % (lineno, totaltime), file=out_file)