summaryrefslogtreecommitdiffstats
path: root/compilerplugins/clang/unnecessaryvirtual.py
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/unnecessaryvirtual.py')
-rwxr-xr-xcompilerplugins/clang/unnecessaryvirtual.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/compilerplugins/clang/unnecessaryvirtual.py b/compilerplugins/clang/unnecessaryvirtual.py
new file mode 100755
index 000000000..01a32bfc3
--- /dev/null
+++ b/compilerplugins/clang/unnecessaryvirtual.py
@@ -0,0 +1,104 @@
+#!/usr/bin/python3
+
+import io
+import re
+import sys
+
+definitionSet = set()
+definitionToSourceLocationMap = dict()
+overridingSet = set()
+nonEmptySet = set()
+
+
+with io.open("workdir/loplugin.unnecessaryvirtual.log", "r", 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] == "overriding:":
+ fullMethodName = tokens[1]
+ overridingSet.add(fullMethodName)
+ elif tokens[0] == "nonempty:":
+ fullMethodName = tokens[1]
+ nonEmptySet.add(fullMethodName)
+ else:
+ print( "unknown line: " + line)
+
+unnecessaryVirtualSet = set()
+
+for clazz in (definitionSet - overridingSet):
+ # windows-specific stuff
+ if clazz.startswith("canvas::"): continue
+ if clazz.startswith("psp::PrinterInfoManager"): continue
+ if clazz.startswith("DdeTopic::"): continue
+ if clazz == "basegfx::unotools::UnoPolyPolygon::void-modifying()const": continue
+ if clazz == "SalLayout::_Bool-IsKashidaPosValid(int,)const": continue
+ if clazz == "SalLayout::void-DisableGlyphInjection(_Bool,)": continue
+ # Linux-TDF specific
+ if clazz == "X11SalFrame::void-updateGraphics(_Bool,)": continue
+ # OSX specific
+ if clazz == "SalFrame::void-SetRepresentedURL(const class rtl::OUString &,)": continue
+ if clazz == "SalMenu::_Bool-AddMenuBarButton(const struct SalMenuButtonItem &,)": continue
+ if clazz == "SalMenu::class Rectangle-GetMenuBarButtonRectPixel(sal_uInt16,class SalFrame *,)": continue
+ if clazz == "SalMenu::void-RemoveMenuBarButton(sal_uInt16,)": continue
+ if clazz == "SalLayout::_Bool-DrawTextSpecial(class SalGraphics &,sal_uInt32,)const": continue
+ # GTK < 3
+ if clazz == "GtkSalDisplay::int-CaptureMouse(class SalFrame *,)": continue
+ # some test magic
+ if clazz.startswith("apitest::"): continue
+
+ loc = definitionToSourceLocationMap[clazz]
+
+ # ignore external code
+ if loc.startswith("external/"): continue
+ # there is a bunch of Windows specific code that we don't see
+ if loc.startswith("include/canvas/"): continue
+ # not sure what the problem is here
+ if loc.startswith("include/test/"): continue
+
+ unnecessaryVirtualSet.add( (clazz,loc) )
+
+
+deadSet = set()
+
+for clazz in (definitionSet - nonEmptySet):
+
+ # ignore destructors
+ if "::~" in clazz: continue
+
+ loc = definitionToSourceLocationMap[clazz]
+
+ # ignore external code
+ if loc.startswith("external/"): continue
+
+ deadSet.add( (clazz,loc) )
+
+
+# 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 by both the source-line and the datatype, so the output file ordering is stable
+# when we have multiple items on the same source line
+def v_sort_key(v):
+ return natural_sort_key(v[1]) + [v[0]]
+
+# sort results by name and line number
+tmp1list = sorted(unnecessaryVirtualSet, key=lambda v: v_sort_key(v))
+tmp2list = sorted(deadSet, key=lambda v: v_sort_key(v))
+
+with open("compilerplugins/clang/unnecessaryvirtual.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")
+
+with open("compilerplugins/clang/unnecessaryvirtual-dead.results", "wt") as f:
+ for t in tmp2list:
+ f.write( t[1] + "\n" )
+ f.write( " " + t[0] + "\n" )
+