diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-03-28 10:00:11 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-03-28 13:00:53 +0200 |
commit | 7f7653c11b4312e89b7ad3cc0e5fb0b6a9b94c5d (patch) | |
tree | 0d59cc56326888336dbbe3f7396996c208f2c77d /compilerplugins/clang/virtualdown.py | |
parent | Colibre icons: add 32px shape icons (diff) | |
download | core-7f7653c11b4312e89b7ad3cc0e5fb0b6a9b94c5d.tar.gz core-7f7653c11b4312e89b7ad3cc0e5fb0b6a9b94c5d.zip |
new loplugin virtualdown
Look for virtual methods where we can push their definition "down" i.e.
the base virtual method does not need to exist at all, because all the
call-sites are calling the more specific overrides.
Change-Id: Ib8e82637bfb6bc2a06df45de0e289d27344fb3ab
Reviewed-on: https://gerrit.libreoffice.org/51986
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins/clang/virtualdown.py')
-rwxr-xr-x | compilerplugins/clang/virtualdown.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/compilerplugins/clang/virtualdown.py b/compilerplugins/clang/virtualdown.py new file mode 100755 index 000000000000..f2121c07a29b --- /dev/null +++ b/compilerplugins/clang/virtualdown.py @@ -0,0 +1,49 @@ +#!/usr/bin/python + +import io +import re +import sys + +definitionSet = set() +definitionToSourceLocationMap = dict() +callSet = set() + + +with io.open("loplugin.virtualdown.log", "rb", buffering=1024*1024) as txt: + for line in txt: + tokens = line.strip().split("\t") + if tokens[0] == "definition:": + fullMethodName = tokens[1] + sourceLocation = tokens[2] + definitionSet.add(fullMethodName) + definitionToSourceLocationMap[fullMethodName] = sourceLocation + elif tokens[0] == "call:": + fullMethodName = tokens[1] + callSet.add(fullMethodName) + +unnecessaryVirtualSet = set() + +for clazz in (definitionSet - callSet): +# if clazz.startswith("canvas::"): continue +# if clazz == "basegfx::unotools::UnoPolyPolygon::void-modifying()const": continue + # ignore external code + if definitionToSourceLocationMap[clazz].startswith("external/"): continue + + unnecessaryVirtualSet.add((clazz,definitionToSourceLocationMap[clazz] )) + + +# sort the results using a "natural order" so sequences like [item1,item2,item10] sort nicely +def natural_sort_key(s, _nsre=re.compile('([0-9]+)')): + return [int(text) if text.isdigit() else text.lower() + for text in re.split(_nsre, s)] + +# sort results by name and line number +tmp1list = sorted(unnecessaryVirtualSet, key=lambda v: natural_sort_key(v[1])) + +with open("compilerplugins/clang/virtualdown.results", "wt") as f: + for t in tmp1list: + f.write( t[1] + "\n" ) + f.write( " " + t[0] + "\n" ) + # add an empty line at the end to make it easier for the removevirtuals plugin to mmap() the output file + f.write("\n") + |