[Libreoffice-commits] core.git: compilerplugins/clang mergeclasses.results

Noel Grandin noel at peralex.com
Mon Sep 7 23:10:30 PDT 2015


 compilerplugins/clang/mergeclasses.cxx |  199 +++++++++++++++++++
 compilerplugins/clang/mergeclasses.py  |   73 +++++++
 mergeclasses.results                   |  334 +++++++++++++++++++++++++++++++++
 3 files changed, 606 insertions(+)

New commits:
commit d7efea29cdc2faa57d172d7e4d8def18fd49536c
Author: Noel Grandin <noel at peralex.com>
Date:   Tue Sep 8 08:07:33 2015 +0200

    new loplugin mergeclasses
    
    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
    
    Change-Id: I4e43fdd2f549b5cbe25dcb7cee5e9dd3c1df8ba0

diff --git a/compilerplugins/clang/mergeclasses.cxx b/compilerplugins/clang/mergeclasses.cxx
new file mode 100644
index 0000000..b6fccfe
--- /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 0000000..07b68f3
--- /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 0000000..85739e1
--- /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


More information about the Libreoffice-commits mailing list