summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compilerplugins/clang/mergeclasses.cxx199
-rwxr-xr-xcompilerplugins/clang/mergeclasses.py73
-rw-r--r--mergeclasses.results334
3 files changed, 606 insertions, 0 deletions
diff --git a/compilerplugins/clang/mergeclasses.cxx b/compilerplugins/clang/mergeclasses.cxx
new file mode 100644
index 000000000000..b6fccfe9418f
--- /dev/null
+++ b/compilerplugins/clang/mergeclasses.cxx
@@ -0,0 +1,199 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cassert>
+#include <string>
+#include <iostream>
+#include "plugin.hxx"
+#include "compat.hxx"
+#include <fstream>
+
+/**
+
+Idea from Norbert (shm_get) - look for classes that are
+(a) not instantiated
+(b) have zero or one subclasses
+and warn about them - would allow us to remove a bunch of abstract classes
+that can be merged into one class and simplified.
+
+Dump a list of
+- unique classes that exist (A)
+- unique classes that are instantiated (B)
+- unique class-subclass relationships (C)
+Then
+ let D = A minus B
+ for each class in D, look in C and count the entries, then dump it if no-entries == 1
+
+The process goes something like this:
+ $ make check
+ $ make FORCE_COMPILE_ALL=1 COMPILER_PLUGIN_TOOL='mergeclasses' check
+ $ ./compilerplugins/clang/mergeclasses.py > mergeclasses.results
+
+FIXME exclude 'static-only' classes, which some people may use/have used instead of a namespace to tie together a bunch of functions
+
+*/
+
+namespace {
+
+// try to limit the voluminous output a little
+static std::set<std::string> instantiatedSet;
+static std::set<std::pair<std::string,std::string> > childToParentClassSet; // childClassName -> parentClassName
+static std::map<std::string,std::string> definitionMap; // className -> filename
+
+class MergeClasses:
+ public RecursiveASTVisitor<MergeClasses>, public loplugin::Plugin
+{
+public:
+ explicit MergeClasses(InstantiationData const & data): Plugin(data) {}
+
+ virtual void run() override
+ {
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+
+ // dump all our output in one write call - this is to try and limit IO "crosstalk" between multiple processes
+ // writing to the same logfile
+ std::string output;
+ for (const std::string & s : instantiatedSet)
+ output += "instantiated:\t" + s + "\n";
+ for (const std::pair<std::string,std::string> & s : childToParentClassSet)
+ output += "has-subclass:\t" + s.first + "\t" + s.second + "\n";
+ for (const std::pair<std::string,std::string> & s : definitionMap)
+ output += "definition:\t" + s.first + "\t" + s.second + "\n";
+ ofstream myfile;
+ myfile.open( SRCDIR "/mergeclasses.log", ios::app | ios::out);
+ myfile << output;
+ myfile.close();
+ }
+
+ bool VisitVarDecl(const VarDecl *);
+ bool VisitFieldDecl(const FieldDecl *);
+ bool VisitCXXConstructExpr( const CXXConstructExpr* var );
+ bool VisitCXXRecordDecl( const CXXRecordDecl* decl);
+ bool VisitFunctionDecl( const FunctionDecl* decl);
+ bool VisitCallExpr(const CallExpr* decl);
+};
+
+static bool startsWith(const std::string& rStr, const char* pSubStr) {
+ return rStr.compare(0, strlen(pSubStr), pSubStr) == 0;
+}
+
+static void addToInstantiatedSet(const std::string& s)
+{
+ // ignore stuff in the standard library, and UNO stuff we can't touch.
+ if (startsWith(s, "rtl::") || startsWith(s, "sal::") || startsWith(s, "com::sun::")
+ || startsWith(s, "std::") || startsWith(s, "boost::")
+ || s == "OString" || s == "OUString" || s == "bad_alloc")
+ {
+ return;
+ }
+ instantiatedSet.insert(s);
+}
+
+// check for implicit construction
+bool MergeClasses::VisitVarDecl( const VarDecl* pVarDecl )
+{
+ if (ignoreLocation(pVarDecl)) {
+ return true;
+ }
+ addToInstantiatedSet(pVarDecl->getType().getAsString());
+ return true;
+}
+
+// check for implicit construction
+bool MergeClasses::VisitFieldDecl( const FieldDecl* pFieldDecl )
+{
+ if (ignoreLocation(pFieldDecl)) {
+ return true;
+ }
+ addToInstantiatedSet(pFieldDecl->getType().getAsString());
+ return true;
+}
+
+bool MergeClasses::VisitCXXConstructExpr( const CXXConstructExpr* pCXXConstructExpr )
+{
+ if (ignoreLocation(pCXXConstructExpr)) {
+ return true;
+ }
+ const CXXConstructorDecl* pCXXConstructorDecl = pCXXConstructExpr->getConstructor();
+ const CXXRecordDecl* pParentCXXRecordDecl = pCXXConstructorDecl->getParent();
+ if (ignoreLocation(pParentCXXRecordDecl)) {
+ return true;
+ }
+ std::string s = pParentCXXRecordDecl->getQualifiedNameAsString();
+ addToInstantiatedSet(s);
+ return true;
+}
+
+bool MergeClasses::VisitCXXRecordDecl(const CXXRecordDecl* decl)
+{
+ if (ignoreLocation(decl)) {
+ return true;
+ }
+ if (decl->hasDefinition())
+ {
+ SourceLocation spellingLocation = compiler.getSourceManager().getSpellingLoc(decl->getCanonicalDecl()->getLocStart());
+ std::string filename = compiler.getSourceManager().getFilename(spellingLocation);
+ filename = filename.substr(strlen(SRCDIR));
+ definitionMap.insert( std::pair<std::string,std::string>(decl->getQualifiedNameAsString(), filename) );
+ for (auto it = decl->bases_begin(); it != decl->bases_end(); ++it)
+ {
+ const CXXBaseSpecifier spec = *it;
+ // need to look through typedefs, hence the getUnqualifiedDesugaredType
+ QualType baseType = spec.getType().getDesugaredType(compiler.getASTContext());
+ childToParentClassSet.insert( std::pair<std::string,std::string>(decl->getQualifiedNameAsString(), baseType.getAsString()) );
+ }
+ }
+ return true;
+}
+
+bool MergeClasses::VisitFunctionDecl(const FunctionDecl* decl)
+{
+ if (ignoreLocation(decl)) {
+ return true;
+ }
+ return true;
+}
+
+static bool startswith(const std::string& s, const std::string& prefix)
+{
+ return s.rfind(prefix,0) == 0;
+}
+
+static bool endswith(const std::string& s, const std::string& suffix)
+{
+ return s.rfind(suffix) == (s.size()-suffix.size());
+}
+
+bool MergeClasses::VisitCallExpr(const CallExpr* decl)
+{
+ if (ignoreLocation(decl)) {
+ return true;
+ }
+ // VclPtr<T>::Create using a forwarding constructor, so we need to handle it differently in order
+ // to pick up the instantiation via it.
+ if (decl->getCalleeDecl() && isa<CXXMethodDecl>(decl->getCalleeDecl()))
+ {
+ const CXXMethodDecl * pMethod = dyn_cast<CXXMethodDecl>(decl->getCalleeDecl());
+ std::string s = pMethod->getQualifiedNameAsString();
+ if (startswith(s, "VclPtr<") && endswith(s, ">::Create"))
+ {
+ const ClassTemplateSpecializationDecl *pTemplateDecl = dyn_cast<ClassTemplateSpecializationDecl>(pMethod->getParent());
+ QualType windowType = pTemplateDecl->getTemplateArgs()[0].getAsType();
+ instantiatedSet.insert(windowType.getAsString());
+ }
+ }
+ return true;
+}
+
+
+loplugin::Plugin::Registration< MergeClasses > X("mergeclasses", false);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/compilerplugins/clang/mergeclasses.py b/compilerplugins/clang/mergeclasses.py
new file mode 100755
index 000000000000..07b68f320f28
--- /dev/null
+++ b/compilerplugins/clang/mergeclasses.py
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+
+import sys
+
+instantiatedSet = set()
+definitionSet = set()
+parentChildDict = {}
+definitionToFileDict = {}
+
+with open("mergeclasses.log") as txt:
+ for line in txt:
+
+ if line.startswith("instantiated:\t"):
+ idx1 = line.find("\t")
+ clazzName = line[idx1+1 : len(line)-1]
+ if (clazzName.startswith("const ")):
+ clazzName = clazzName[6:]
+ if (clazzName.startswith("class ")):
+ clazzName = clazzName[6:]
+ if (clazzName.endswith(" &")):
+ clazzName = clazzName[:len(clazzName)-3]
+ instantiatedSet.add(clazzName)
+
+ elif line.startswith("definition:\t"):
+ idx1 = line.find("\t")
+ idx2 = line.find("\t", idx1+1)
+ clazzName = line[idx1+1 : idx2]
+ fileName = line[idx2+1 : len(line)-1]
+ definitionSet.add(clazzName)
+ definitionToFileDict[clazzName] = fileName
+
+ elif line.startswith("has-subclass:\t"):
+ idx1 = line.find("\t")
+ idx2 = line.find("\t", idx1+1)
+ child = line[idx1+1 : idx2]
+ parent = line[idx2+1 : len(line)-1]
+ if (parent.startswith("class ")):
+ parent = parent[6:]
+ elif (parent.startswith("struct ")):
+ parent = parent[7:]
+ if (child.startswith("class ")):
+ child = child[6:]
+ elif (child.startswith("struct ")):
+ child = child[7:]
+ if (parent not in parentChildDict):
+ parentChildDict[parent] = set()
+ parentChildDict[parent].add(child)
+
+def extractModuleName(clazz):
+ filename = definitionToFileDict[clazz]
+ if filename.startswith("include/"):
+ filename = filename[8:]
+ idx = filename.find("/")
+ return filename[:idx]
+
+for clazz in sorted(definitionSet - instantiatedSet):
+ # find uninstantiated classes without any subclasses
+ if (not(clazz in parentChildDict)) or (len(parentChildDict[clazz]) != 1):
+ continue
+ # exclude some common false positives
+ a = ['Dialog', 'Dlg', 'com::sun', 'Base']
+ if any(x in clazz for x in a):
+ continue
+ # ignore base class that contain the word "mutex", they are normally there to
+ # help with the WeakComponentImpl template magic
+ if clazz.find("mutex") != -1 or clazz.find("Mutex") != -1:
+ continue
+ otherclazz = next(iter(parentChildDict[clazz]))
+ # exclude combinations that span modules because we often use those to make cross-module dependencies more manageable.
+ if extractModuleName(clazz) != extractModuleName(otherclazz):
+ continue
+ print "merge", clazz, "with", otherclazz
+
diff --git a/mergeclasses.results b/mergeclasses.results
new file mode 100644
index 000000000000..85739e15064c
--- /dev/null
+++ b/mergeclasses.results
@@ -0,0 +1,334 @@
+merge (anonymous namespace)::Data with cppu::PropertySetMixinImpl::Impl
+merge (anonymous namespace)::ITimeoutHandler with SvtFileView_Impl
+merge (anonymous namespace)::VCLXToolkit_Impl with (anonymous namespace)::VCLXToolkit
+merge AbstractMailMergeWizard with AbstractMailMergeWizard_Impl
+merge AbstractSearchProgress with AbstractSearchProgress_Impl
+merge AbstractSwInsertDBColAutoPilot with AbstractSwInsertDBColAutoPilot_Impl
+merge AbstractTakeProgress with AbstractTakeProgress_Impl
+merge BiNode with NameNode
+merge CffGlobal with CffSubsetterContext
+merge CompareLine with SwCompareLine
+merge DdeGetPutItem with sfx2::ImplDdeItem
+merge DocumentSettingsSerializer with sd::DocumentSettings
+merge DomVisitor with DomExport
+merge DownloadInteractionHandler with UpdateCheck
+merge EscherPersistTable with EscherEx
+merge ExcBoolRecord with Exc1904
+merge FailTest with testMathMalformedXml
+merge FmGridListener with FmXGridPeer::GridListenerDelegator
+merge GroupTable with PPTWriterBase
+merge Help with SfxHelp
+merge IActionListener with UpdateCheck
+merge IDocumentChartDataProviderAccess with sw::DocumentChartDataProviderManager
+merge IDocumentContentOperations with sw::DocumentContentOperationsManager
+merge IDocumentDeviceAccess with sw::DocumentDeviceManager
+merge IDocumentDrawModelAccess with sw::DocumentDrawModelManager
+merge IDocumentExternalData with sw::DocumentExternalDataManager
+merge IDocumentFieldsAccess with sw::DocumentFieldsManager
+merge IDocumentLayoutAccess with sw::DocumentLayoutManager
+merge IDocumentLinksAdministration with sw::DocumentLinksAdministrationManager
+merge IDocumentListItems with sw::DocumentListItemsManager
+merge IDocumentListsAccess with sw::DocumentListsManager
+merge IDocumentMarkAccess with sw::mark::MarkManager
+merge IDocumentMarkAccess::ILazyDeleter with sw::mark::LazyFieldmarkDeleter
+merge IDocumentOutlineNodes with sw::DocumentOutlineNodesManager
+merge IDocumentRedlineAccess with sw::DocumentRedlineManager
+merge IDocumentSettingAccess with sw::DocumentSettingManager
+merge IDocumentState with sw::DocumentStateManager
+merge IDocumentStatistics with sw::DocumentStatisticsManager
+merge IDocumentStylePoolAccess with sw::DocumentStylePoolManager
+merge IDocumentTimerAccess with sw::DocumentTimerManager
+merge IDocumentUndoRedo with sw::UndoManager
+merge IGrammarContact with SwGrammarContact
+merge IInterface with SwDoc
+merge IMailDispatcherListener with SwMailDispatcherListener_Impl
+merge IStyleAccess with SwStyleManager
+merge IStylePoolIteratorAccess with (anonymous namespace)::Iterator
+merge ISwFrameControl with SwFrameMenuButtonBase
+merge IXFAttrList with XFSaxAttrList
+merge IXFStream with XFSaxStream
+merge IXFStyle with XFStyle
+merge ImplFontOptions with FontConfigFontOptions
+merge ImplGlyphFallbackFontSubstitution with FcGlyphFallbackSubstititution
+merge ImplPreMatchFontSubstitution with FcPreMatchSubstititution
+merge LwpDLList with LwpParaProperty
+merge LwpDLVListHead with LwpPropList
+merge Obj0Type with ObjkType
+merge OldBasicPassword with basic::SfxScriptLibraryContainer
+merge OpenGLDeviceInfo with X11OpenGLDeviceInfo
+merge OpenGLSalBitmapOp with ScaleOp
+merge PPTExBulletProvider with PPTWriter
+merge PreCreationStruct with OWriteStream_Impl
+merge SalInfoPrinter with PspSalInfoPrinter
+merge SalInstance with SalGenericInstance
+merge SalPrinter with PspSalPrinter
+merge SalSession with (anonymous namespace)::IceSalSession
+merge SalSystem with SalGenericSystem
+merge ScDPCache::DBConnector with (anonymous namespace)::DBConnector
+merge ScEEAbsImport with ScEEImport
+merge ScOrcusFilters with ScOrcusFiltersImpl
+merge ScRangeManagerTable::InitListener with ScNameDlg
+merge ScRefHandler with ScRefHdlrImplBase
+merge ScRefHandlerCaller with ScTPValidationValue
+merge ScRefHandlerHelper with ScValidationDlg
+merge ScSimpleEditSourceHelper with ScEditEngineTextObj
+merge SdTransferable::UserData with sd::slidesorter::controller::TransferableData
+merge SdwTextBoxRecord with SdwTextArt
+merge ServerFontLayoutEngine with HbLayoutEngine
+merge SfxSingleRecordReader with SfxMultiRecordReader
+merge SfxStatusListenerInterface with SfxPopupWindow
+merge SfxUndoContext with sw::UndoRedoContext
+merge SfxUndoListener with framework::UndoManagerHelper_Impl
+merge StarSymbolToMSMultiFont with StarSymbolToMSMultiFontImpl
+merge StgReader with WW8Reader
+merge SvListView with SvTreeListBox
+merge SvMetaObject with SvMetaName
+merge SvxNodeIdx with EditNodeIdx
+merge SvxPosition with EditPosition
+merge SvxShapeMaster with SdXShape
+merge SvxUnoDrawMSFactory with SvxFmMSFactory
+merge SwXParaFrameEnumeration with SwXParaFrameEnumerationImpl
+merge SwXParagraphEnumeration with SwXParagraphEnumerationImpl
+merge SwXTextRanges with SwXTextRangesImpl
+merge SwpHintsArray with SwpHints
+merge UniqueIndexImpl with UniqueIndex
+merge UpdateCheckConfigListener with UpdateCheck
+merge ValueGetter with CellValueGetter
+merge ValueSetter with CellValueSetter
+merge VariableTextField with VariableDateTimeField
+merge VclGrid::GridEntry with VclGrid::ExtendedGridEntry
+merge Viewport3D with Camera3D
+merge XFDate with XFDateStart
+merge XFDateTimePart with XFTimePart
+merge XMLTransformer with XMLTransformerBase
+merge XclDebugObjCounter with XclRootData
+merge _LibreOfficeKit with LibLibreOffice_Impl
+merge _LibreOfficeKitDocument with LibLODocument_Impl
+merge _SwPamRanges with SwPamRanges
+merge _SwRedlineTable with SwRedlineTable
+merge _uno_ExtEnvironment with (anonymous namespace)::uno_DefaultEnvironment
+merge abp::OModuleResourceClient with abp::OABSPilotUno
+merge accessibility::IComboListBoxHelper with VCLListBoxHelper
+merge apitest::CellProperties with sc_apitest::ScCellRangeObj
+merge apitest::DataPilotField with sc_apitest::ScDataPilotFieldObj
+merge apitest::XCellRangeData with sc_apitest::ScCellRangeObj
+merge apitest::XCellRangesQuery with sc_apitest::ScCellRangeObj
+merge apitest::XDataPilotDescriptor with sc_apitest::ScDataPilotTableObj
+merge apitest::XDataPilotFieldGrouping with sc_apitest::ScDataPilotFieldObj
+merge apitest::XDataPilotTable with sc_apitest::ScDataPilotTableObj
+merge apitest::XDataPilotTable2 with sc_apitest::ScDataPilotTableObj
+merge apitest::XDatabaseRange with sc_apitest::ScDatabaseRangeObj
+merge apitest::XGoalSeek with sc_apitest::ScModelObj
+merge apitest::XNamedRange with sc_apitest::ScNamedRangeObj
+merge apitest::XNamedRanges with sc_apitest::ScNamedRangesObj
+merge apitest::XPrintAreas with sc_apitest::ScTableSheetObj
+merge apitest::XSheetAnnotation with sc_apitest::ScAnnontationObj
+merge apitest::XSheetAnnotations with sc_apitest::ScAnnontationsObj
+merge apitest::XSheetOutline with sc_apitest::ScOutlineObj
+merge apitest::XSpreadsheets2 with sc_apitest::ScTableSheetsObj
+merge apitest::XStyleLoader with sc_apitest::ScStyleLoaderObj
+merge apitest::XText with sc_apitest::ScAnnotationShapeObj
+merge apitest::XTextField with sc_apitest::ScEditFieldObj_Cell
+merge basctl::docs::IDocumentDescriptorFilter with basctl::(anonymous namespace)::FilterDocuments
+merge basebmp::BitmapDevice with basebmp::(anonymous namespace)::BitmapRenderer
+merge basebmp::IBitmapDeviceDamageTracker with (anonymous namespace)::DamageTracker
+merge cairocanvas::CanvasHelper with cairocanvas::SpriteCanvasHelper
+merge cairocanvas::DeviceHelper with cairocanvas::SpriteDeviceHelper
+merge cairocanvas::Sprite with cairocanvas::CanvasCustomSpriteSpriteBase_Base
+merge canvas::ISurfaceProxy with canvas::SurfaceProxy
+merge canvas::ISurfaceProxyManager with canvas::SurfaceProxyManager
+merge chart::ChartController::RefCountable with chart::ChartController::TheModel
+merge chart::ConfigItemListener with chart::ConfigColorScheme
+merge chart::ExplicitValueProvider with chart::ChartView
+merge chart::LegendEntryProvider with chart::VSeriesPlotter
+merge chart::MarkHandleProvider with chart::SelectionHelper
+merge chart::ResourceChangeListener with chart::ChartTypeTabPage
+merge chart::WindowController with chart::ChartController
+merge comphelper::IMapModificationListener with comphelper::MapEnumerator
+merge comphelper::IPropertyInfoService with frm::ConcreteInfoService
+merge comphelper::NameContainerImpl with comphelper::NameContainer
+merge comphelper::OInteractionSelect with comphelper::OInteraction
+merge comphelper::OSeekableInputWrapper_BASE with comphelper::OSeekableInputWrapper
+merge comphelper::OStatefulPropertySet with PropertySetBase
+merge connectivity::hsqldb::IMethodGuardAccess with connectivity::hsqldb::OHsqlConnection
+merge connectivity::sdbcx::IObjectCollection with (anonymous namespace)::OHardRefMap
+merge cppcanvas::Bitmap with cppcanvas::internal::ImplBitmap
+merge cppcanvas::BitmapCanvas with cppcanvas::internal::ImplBitmapCanvas
+merge cppcanvas::Color with cppcanvas::internal::ImplColor
+merge cppcanvas::CustomSprite with cppcanvas::internal::ImplCustomSprite
+merge cppcanvas::Font with cppcanvas::internal::ImplFont
+merge cppcanvas::PolyPolygon with cppcanvas::internal::ImplPolyPolygon
+merge cppcanvas::Renderer with cppcanvas::internal::ImplRenderer
+merge cppu::PropertySetMixinImpl with cppu::PropertySetMixin
+merge dbaccess::IPropertyContainer with dbaccess::OColumn
+merge dbaccess::IRefreshListener with dbaccess::OConnection
+merge dbaui::(anonymous namespace)::IImageProvider with dbaui::(anonymous namespace)::ImageProvider
+merge dbaui::(anonymous namespace)::ILabelProvider with dbaui::(anonymous namespace)::LabelProvider
+merge dbaui::IApplicationController with dbaui::OApplicationController
+merge dbaui::IEntryFilter with dbaui::(anonymous namespace)::FilterByEntryDataId
+merge dbaui::OOdbcLibWrapper with dbaui::OOdbcEnumeration
+merge dbaui::PropertyStorage with dbaui::SetItemPropertyStorage
+merge dbaui::SbaGridListener with dbaui::SbaXDataBrowserController
+merge dbmm::IMigrationProgress with dbmm::ProgressPage
+merge dbmm::IProgressConsumer with dbmm::ProgressDelegator
+merge dbmm::MacroMigrationModuleClient with dbmm::MacroMigrationDialogService
+merge dbp::OModuleResourceClient with dbp::OUnoAutoPilot
+merge dbtools::ISQLStatementHelper with connectivity::mysql::OTables
+merge extensions::resource::IResourceType with extensions::resource::StringResourceAccess
+merge formula::ExternalReferenceHelper with ScExternalRefManager
+merge formula::IStructHelper with formula::StructPage
+merge framework::IComboBoxListener with framework::ComboboxToolbarController
+merge framework::IEditListener with framework::EditToolbarController
+merge framework::ILayoutNotifications with framework::LayoutManager
+merge framework::IListBoxListener with framework::DropdownToolbarController
+merge framework::ISpinfieldListener with framework::SpinfieldToolbarController
+merge framework::IStorageListener with framework::XMLBasedAcceleratorConfiguration
+merge frm::IAttributeHandler with frm::AttributeHandler
+merge frm::ICommandDescriptionProvider with frm::DefaultCommandDescriptionProvider
+merge frm::ICommandImageProvider with frm::DocumentCommandImageProvider
+merge frm::IEngineStatusListener with frm::RichTextControlImpl
+merge frm::IEngineTextChangeListener with frm::ORichTextModel
+merge frm::IFeatureDispatcher with frm::OFormNavigationHelper
+merge frm::IMultiAttributeDispatcher with frm::RichTextControl
+merge frm::ITextAttributeListener with frm::OAttributeDispatcher
+merge frm::ITextSelectionListener with frm::ORichTextPeer
+merge ftp::CurlInput with InsertData
+merge ftp::FTPHandleProvider with ftp::FTPContentProvider
+merge ftp::ResultSetFactory with ResultSetFactoryI
+merge helpdatafileproxy::hdf_internal::Noncopyable with helpdatafileproxy::Hdf
+merge i_xml_parser_event_handler with (anonymous namespace)::recently_used_file_filter
+merge io_stm::IRingBuffer with io_stm::MemRingBuffer
+merge io_stm::I_FIFO with io_stm::MemFIFO
+merge linguistic::Flushable with linguistic::SpellCache
+merge oglcanvas::CanvasHelper with oglcanvas::BitmapCanvasHelper
+merge oglcanvas::IBufferContext with oglcanvas::(anonymous namespace)::BufferContextImpl
+merge ooo::vba::XHelperInterface with ooo::vba::msforms::XShape
+merge oox::drawingml::DMLTextExport with DocxAttributeOutput
+merge oox::dump::Address with oox::dump::TokenAddress
+merge oox::dump::ItemFormat with oox::dump::CombiList::ExtItemFormat
+merge oox::formulaimport::XmlStream with oox::formulaimport::XmlStreamBuilder
+merge oox::ole::OleObjectInfo with oox::vml::OleObjectInfo
+merge oox::ole::StdHlinkInfo with oox::xls::HyperlinkModel
+merge oox::vml::VMLTextExport with DocxAttributeOutput
+merge oox::xls::BiffContextHandler with oox::xls::BiffWorksheetContextBase
+merge oox::xls::IWorksheetProgress with oox::xls::WorksheetGlobals
+merge osl::DirectoryCreationObserver with osl_Directory::DirCreatedObserver
+merge pcr::(anonymous namespace)::ISQLCommandPropertyUI with pcr::(anonymous namespace)::SQLCommandPropertyUI
+merge pcr::IButtonClickListener with pcr::OBrowserListBox
+merge pcr::IControlContext with pcr::OBrowserListBox
+merge pcr::IModifyListener with pcr::CommonBehaviourControl
+merge pcr::IPropertyControlObserver with pcr::OPropertyBrowserController
+merge pcr::IPropertyInfoService with pcr::OPropertyInfoService
+merge pcr::IPropertyLineListener with pcr::OPropertyBrowserController
+merge pcr::ISQLCommandAdapter with pcr::(anonymous namespace)::ISQLCommandPropertyUI
+merge pcr::PropertyHandlerComponent with pcr::HandlerComponentBase
+merge psp::PrinterBmp with SalPrinterBmp
+merge reportdesign::ITraverseReport with rptui::NavigatorTree
+merge rptui::IConditionalFormatAction with rptui::ConditionalFormattingDialog
+merge sc::CompiledFormula with sc::opencl::DynamicKernel
+merge sc::opencl::Cumipmt with sc::opencl::OpCumipmt
+merge sc::opencl::Fvschedule with sc::opencl::OpFvschedule
+merge sc::opencl::IRR with sc::opencl::OpIRR
+merge sc::opencl::MIRR with sc::opencl::OpMIRR
+merge sc::opencl::PriceMat with sc::opencl::OpPriceMat
+merge sc::opencl::RATE with sc::opencl::OpIntrate
+merge sc::opencl::RRI with sc::opencl::OpRRI
+merge sc::opencl::SumOfProduct with sc::opencl::OpSumProduct
+merge sc::opencl::XNPV with sc::opencl::OpXNPV
+merge sd::IBluetoothSocket with sd::BufferedStreamSocket
+merge sd::ICustomAnimationListController with sd::CustomAnimationPane
+merge sd::sidebar::IDisposable with sd::sidebar::PanelBase
+merge sd::sidebar::ISidebarReceiver with sd::sidebar::PanelBase
+merge sd::sidebar::MasterPageContainerFiller::ContainerAdapter with sd::sidebar::MasterPageContainer::Implementation
+merge sd::sidebar::MasterPageContainerQueue::ContainerAdapter with sd::sidebar::MasterPageContainer::Implementation
+merge sd::slidesorter::view::(anonymous namespace)::AnimatorAccess with sd::slidesorter::view::InsertAnimator::Implementation
+merge sd::slidesorter::view::ILayerInvalidator with sd::slidesorter::view::(anonymous namespace)::LayerInvalidator
+merge sdext::presenter::PresenterClockTimer::Listener with sdext::presenter::(anonymous namespace)::TimeLabel::Listener
+merge sdr::SelectionController with sdr::table::SvxTableController
+merge sdr::event::EventHandler with sdr::event::TimerEventHandler
+merge sdr::table::TableDesignUser with sdr::table::SdrTableObjImpl
+merge sfx2::IXmlIdRegistry with sfx2::XmlIdRegistry
+merge sfx2::IXmlIdRegistrySupplier with SfxObjectShell
+merge sfx::MultiControlWrapperHelper with sfx::MultiControlWrapper
+merge slideshow::internal::AnimatableShape with slideshow::internal::AttributableShape
+merge slideshow::internal::AnimationFunction with slideshow::internal::ExpressionNode
+merge slideshow::internal::AnimationNode with slideshow::internal::BaseNode
+merge slideshow::internal::AttributableShape with slideshow::internal::DrawShape
+merge slideshow::internal::DocTreeNodeSupplier with slideshow::internal::DrawShape
+merge slideshow::internal::HSLColorAnimation with slideshow::internal::(anonymous namespace)::HSLWrapper
+merge slideshow::internal::HyperlinkArea with slideshow::internal::DrawShape
+merge slideshow::internal::HyperlinkHandler with (anonymous namespace)::SlideShowImpl::SeparateListenerImpl
+merge slideshow::internal::PairAnimation with slideshow::internal::(anonymous namespace)::TupleAnimation
+merge slideshow::internal::PauseEventHandler with slideshow::internal::SoundPlayer
+merge slideshow::internal::ScreenUpdater::UpdateLock with (anonymous namespace)::UpdateLock
+merge slideshow::internal::ShapeListenerEventHandler with slideshow::internal::ShapeManagerImpl
+merge slideshow::internal::ShapeManager with slideshow::internal::SubsettableShapeManager
+merge slideshow::internal::Slide with slideshow::internal::(anonymous namespace)::SlideImpl
+merge slideshow::internal::SubsettableShapeManager with slideshow::internal::ShapeManagerImpl
+merge slideshow::internal::UnoView with slideshow::internal::(anonymous namespace)::SlideView
+merge slideshow::internal::UserPaintEventHandler with slideshow::internal::PaintOverlayHandler
+merge slideshow::internal::View with slideshow::internal::UnoView
+merge slideshow::internal::ViewRepaintHandler with (anonymous namespace)::SlideShowImpl::SeparateListenerImpl
+merge slideshow::internal::ViewUpdate with slideshow::internal::ShapeManagerImpl
+merge store::IStoreHandle with store::OStoreObject
+merge store::PageCache with store::PageCache_Impl
+merge svgio::svgreader::InfoProvider with svgio::svgreader::SvgNode
+merge svl::IUndoManager with SfxUndoManager
+merge svl::StyleSheetCallback with (anonymous namespace)::AddStyleSheetCallback
+merge svl::StyleSheetDisposer with (anonymous namespace)::StyleSheetDisposerFunctor
+merge svt::IAccessibleBrowseBox with accessibility::AccessibleBrowseBoxAccess
+merge svt::IAccessibleTabListBox with accessibility::AccessibleTabListBox
+merge svt::IContentTitleTranslation with NameTranslator_Impl
+merge svt::IEditImplementation with svt::GenericEditImplementation
+merge svt::IEnumerationResultHandler with SvtFileView_Impl
+merge svt::IFilePickerController with SvtFileDialog_Base
+merge svt::IFilePickerListener with SvtFilePicker
+merge svt::IValueNormalization with svt::StandardFormatNormalizer
+merge svt::table::IAccessibleTable with svt::table::TableControl
+merge svt::table::IAccessibleTableControl with accessibility::AccessibleGridControlAccess
+merge svt::table::IColumnModel with svt::table::UnoGridColumnFacade
+merge svt::table::ITableControl with svt::table::TableControl_Impl
+merge svt::table::ITableDataSort with svt::table::UnoControlTableModel
+merge svt::table::ITableInputHandler with svt::table::DefaultInputHandler
+merge svt::table::ITableModelListener with svt::table::TableControl_Impl
+merge svt::table::ITableRenderer with svt::table::GridTableRenderer
+merge svx::IContextRequestObserver with svx::FmTextControlShell
+merge svx::IControllerFeatureInvalidation with FmXFormShell
+merge svx::IFocusObserver with svx::FmTextControlShell
+merge svx::IPropertyValueProvider with svx::PropertyValueProvider
+merge svx::ISlotInvalidator with svx::FmTextControlShell
+merge svxform::(anonymous namespace)::IScript with svxform::(anonymous namespace)::NewStyleUNOScript
+merge svxform::DispatchInterceptor with svxform::FormController
+merge svxform::IFormScriptingEnvironment with svxform::FormScriptingEnvironment
+merge sw::IShellCursorSupplier with SwCrsrShell
+merge sw::WriterListener with SwClient
+merge sw::mark::ContentIdxStore with (anonymous namespace)::ContentIdxStoreImpl
+merge sw::mark::IBookmark with sw::mark::Bookmark
+merge sw::mark::ICheckboxFieldmark with sw::mark::CheckboxFieldmark
+merge sw::util::WrtRedlineAuthor with WW8_WrtRedlineAuthor
+merge tdoc_ucp::OfficeDocumentsEventListener with tdoc_ucp::ContentProvider
+merge toolkit::ScrollableInterface with toolkit::ScrollableWrapper
+merge ucbhelper::InterceptedInteraction with comphelper::StillReadWriteInteraction
+merge unographic::GraphicTransformer with unographic::Graphic
+merge utl::ITerminationListener with frm::StandardFormatsSupplier
+merge vcl::DisplayConnectionDispatch with vcl::DisplayConnection
+merge vcl::ExtOutDevData with vcl::PDFExtOutDevData
+merge vcl::IMnemonicEntryList with SvTreeListBox
+merge vcl::PDFOutputStream with PDFExportStreamDoc
+merge vcl::SolarThreadExecutor with vcl::solarthread::detail::GenericSolarThreadExecutor
+merge vclcanvas::DeviceHelper with vclcanvas::SpriteDeviceHelper
+merge vclcanvas::Sprite with vclcanvas::CanvasCustomSpriteSpriteBase_Base
+merge webdav_ucp::DAVAuthListener with webdav_ucp::DAVAuthListener_Impl
+merge writerfilter::Stream with writerfilter::LoggedStream
+merge writerfilter::Table with writerfilter::LoggedTable
+merge writerfilter::dmapper::TableManager with writerfilter::dmapper::DomainMapperTableManager
+merge writerfilter::ooxml::OOXMLDocument with writerfilter::ooxml::OOXMLDocumentImpl
+merge writerfilter::ooxml::OOXMLPropertySet with writerfilter::ooxml::OOXMLPropertySetImpl
+merge writerfilter::ooxml::OOXMLStream with writerfilter::ooxml::OOXMLStreamImpl
+merge writerfilter::ooxml::OOXMLTable with writerfilter::ooxml::OOXMLTableImpl
+merge writerfilter::rtftok::RTFDocument with writerfilter::rtftok::RTFDocumentImpl
+merge ww8::WW8Struct with ww8::WW8Sttb
+merge xmloff::IEventAttacher with xmloff::OElementImport
+merge xmloff::IEventAttacherManager with xmloff::ODefaultEventAttacherManager
+merge xmloff::IFormsExportContext with xmloff::OFormLayerXMLExport_Impl
+merge xmloff::IPropertyHandler with xmloff::PropertyHandlerBase