summaryrefslogtreecommitdiffstats
path: root/compilerplugins/clang/virtualdown.py
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2018-03-28 10:00:11 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2018-03-28 13:00:53 +0200
commit7f7653c11b4312e89b7ad3cc0e5fb0b6a9b94c5d (patch)
tree0d59cc56326888336dbbe3f7396996c208f2c77d /compilerplugins/clang/virtualdown.py
parentColibre icons: add 32px shape icons (diff)
downloadcore-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-xcompilerplugins/clang/virtualdown.py49
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")
+