[Libreoffice-commits] core.git: 2 commits - chart2/qa compilerplugins/clang include/svx sc/source svx/source

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Mon Apr 10 06:52:12 UTC 2017


 chart2/qa/extras/PivotChartTest.cxx                       |   55 ++-
 compilerplugins/clang/inlinefields.cxx                    |  247 ++++++++++++++
 compilerplugins/clang/inlinefields.py                     |   81 ++++
 include/svx/nbdtmg.hxx                                    |    4 
 sc/source/ui/unoobj/PivotTableDataProvider.cxx            |   10 
 svx/source/accessibility/svxpixelctlaccessiblecontext.cxx |    8 
 svx/source/accessibility/svxrectctaccessiblecontext.cxx   |    8 
 svx/source/form/formcontroller.cxx                        |   34 -
 svx/source/inc/formcontroller.hxx                         |    4 
 svx/source/inc/svxpixelctlaccessiblecontext.hxx           |    2 
 svx/source/inc/svxrectctaccessiblecontext.hxx             |    3 
 svx/source/sidebar/nbdtmg.cxx                             |   34 -
 12 files changed, 422 insertions(+), 68 deletions(-)

New commits:
commit abd8c3646e1295e68fe317bc1a02148a1b5f41a4
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Sat Apr 8 23:43:14 2017 +0200

    pivotcharts: ignore subtotals, grand totals in pivot table data
    
    Change-Id: I08cdd28aaae536fa8306446168dcdb977897dfcd
    Reviewed-on: https://gerrit.libreoffice.org/36308
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/chart2/qa/extras/PivotChartTest.cxx b/chart2/qa/extras/PivotChartTest.cxx
index 7f7b0951faf4..ff1dd586fbdf 100644
--- a/chart2/qa/extras/PivotChartTest.cxx
+++ b/chart2/qa/extras/PivotChartTest.cxx
@@ -126,7 +126,6 @@ void PivotChartTest::testRoundtrip()
     {
         uno::Reference<sheet::XDataPilotTable> xDataPilotTable = lclGetPivotTableByName(1, "DataPilot1", mxComponent);
         uno::Reference<sheet::XDataPilotDescriptor> xDataPilotDescriptor(xDataPilotTable, UNO_QUERY_THROW);
-
         lclModifyOrientation(xDataPilotDescriptor, "Exp.", sheet::DataPilotFieldOrientation_HIDDEN);
     }
 
@@ -161,13 +160,18 @@ void PivotChartTest::testChangePivotTable()
 
     load("/chart2/qa/extras/data/ods/", "PivotTableExample.ods");
 
+    // Check we have the Pivot Table
+    OUString sPivotTableName("DataPilot1");
+    uno::Reference<sheet::XDataPilotTable> xDataPilotTable = lclGetPivotTableByName(1, sPivotTableName, mxComponent);
+    CPPUNIT_ASSERT(xDataPilotTable.is());
+
     // Check that we don't have any pivot chart in the document
     uno::Reference<table::XTablePivotCharts> xTablePivotCharts = getTablePivotChartsFromSheet(1, mxComponent);
     uno::Reference<container::XIndexAccess> xIndexAccess(xTablePivotCharts, UNO_QUERY_THROW);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount());
 
     // Create a new pivot chart
-    xTablePivotCharts->addNewByName("Chart", awt::Rectangle{0, 0, 9000, 9000}, "DataPilot1");
+    xTablePivotCharts->addNewByName("Chart", awt::Rectangle{0, 0, 9000, 9000}, sPivotTableName);
     CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount());
 
     // Get the pivot chart document so we ca access its data
@@ -175,6 +179,8 @@ void PivotChartTest::testChangePivotTable()
 
     CPPUNIT_ASSERT(xChartDoc.is());
 
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(2), getNumberOfDataSeries(xChartDoc));
+
     // Check first data series
     {
         std::vector<double> aReference { 10162.033139, 16614.523063, 27944.146101 };
@@ -197,9 +203,9 @@ void PivotChartTest::testChangePivotTable()
         CPPUNIT_ASSERT_EQUAL(aExpectedLabel, lclGetLabel(xChartDoc, 1));
     }
 
-    // Modify the pivot table
+    // Modify the pivot table, move "Group Segment" to Column fields,
+    // add "Servie Month" to Row fields, remove "Rev." Data field
     {
-        uno::Reference<sheet::XDataPilotTable> xDataPilotTable = lclGetPivotTableByName(1, "DataPilot1", mxComponent);
         uno::Reference<sheet::XDataPilotDescriptor> xDataPilotDescriptor(xDataPilotTable, UNO_QUERY_THROW);
 
         lclModifyOrientation(xDataPilotDescriptor, "Service Month", sheet::DataPilotFieldOrientation_ROW);
@@ -209,7 +215,7 @@ void PivotChartTest::testChangePivotTable()
 
     // Check the pivot chart again as we expect it has been updated when we updated the pivot table
 
-    CPPUNIT_ASSERT(xChartDoc.is());
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getNumberOfDataSeries(xChartDoc));
 
     // Check the first data series
     {
@@ -244,17 +250,46 @@ void PivotChartTest::testChangePivotTable()
         CPPUNIT_ASSERT_EQUAL(aExpectedLabel, lclGetLabel(xChartDoc, 2));
     }
 
-    // Modify the pivot table
+    // Remove "Service Month" so row fields are empty - check we handle empty rows
     {
-        uno::Reference<sheet::XDataPilotTable> xDataPilotTable = lclGetPivotTableByName(1, "DataPilot1", mxComponent);
-        uno::Reference<sheet::XDataPilotDescriptor> xDataPilotDescriptor(xDataPilotTable, UNO_QUERY_THROW);
-
+        uno::Reference<sheet::XDataPilotDescriptor> xDataPilotDescriptor(xDataPilotTable, uno::UNO_QUERY_THROW);
         lclModifyOrientation(xDataPilotDescriptor, "Service Month", sheet::DataPilotFieldOrientation_HIDDEN);
     }
 
     // Check the pivot chart again as we expect it has been updated when we updated the pivot table
 
-    CPPUNIT_ASSERT(xChartDoc.is());
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getNumberOfDataSeries(xChartDoc));
+
+    // Check the first data series
+    {
+        std::vector<double> aReference { 10162.033139 };
+        xSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 0)->getData();
+        lclCheckSequence(aReference, xSequence, 1E-3);
+        CPPUNIT_ASSERT_EQUAL(OUString("Big"), lclGetLabel(xChartDoc, 0));
+    }
+    // Check the second data series
+    {
+        std::vector<double> aReference { 16614.523063 };
+        xSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 1)->getData();
+        lclCheckSequence(aReference, xSequence, 1E-3);
+        CPPUNIT_ASSERT_EQUAL(OUString("Medium"), lclGetLabel(xChartDoc, 1));
+    }
+    // Check the third data series
+    {
+        std::vector<double> aReference { 27944.146101 };
+        xSequence = getDataSequenceFromDocByRole(xChartDoc, "values-y", 2)->getData();
+        lclCheckSequence(aReference, xSequence, 1E-3);
+        CPPUNIT_ASSERT_EQUAL(OUString("Small"), lclGetLabel(xChartDoc, 2));
+    }
+
+    // Enable column totals and check the data is still unchanged
+    {
+        uno::Reference<sheet::XDataPilotDescriptor> xDataPilotDescriptor(xDataPilotTable, uno::UNO_QUERY_THROW);
+        uno::Reference<beans::XPropertySet> xProperties(xDataPilotTable, uno::UNO_QUERY_THROW);
+        xProperties->setPropertyValue("ColumnGrand", uno::makeAny(true));
+    }
+
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getNumberOfDataSeries(xChartDoc));
 
     // Check the first data series
     {
diff --git a/sc/source/ui/unoobj/PivotTableDataProvider.cxx b/sc/source/ui/unoobj/PivotTableDataProvider.cxx
index 5eb66c65257a..df7b180c6892 100644
--- a/sc/source/ui/unoobj/PivotTableDataProvider.cxx
+++ b/sc/source/ui/unoobj/PivotTableDataProvider.cxx
@@ -265,9 +265,8 @@ void PivotTableDataProvider::collectPivotTableData()
 {
     ScDPCollection* pDPCollection = m_pDocument->GetDPCollection();
     ScDPObject* pDPObject = pDPCollection->GetByName(m_sPivotTableName);
-
-    uno::Reference<sheet::XDataPilotResults> xDPResults(pDPObject->GetSource(), uno::UNO_QUERY);
-    uno::Sequence<uno::Sequence<sheet::DataResult>> xDataResultsSequence = xDPResults->getResults();
+    if (!pDPObject)
+        return;
 
     m_aCategoriesColumnOrientation.clear();
     m_aCategoriesRowOrientation.clear();
@@ -278,6 +277,9 @@ void PivotTableDataProvider::collectPivotTableData()
     m_aPageFields.clear();
     m_aDataFields.clear();
 
+    uno::Reference<sheet::XDataPilotResults> xDPResults(pDPObject->GetSource(), uno::UNO_QUERY);
+    uno::Sequence<uno::Sequence<sheet::DataResult>> xDataResultsSequence = xDPResults->getResults();
+
     double fNan;
     rtl::math::setNan(&fNan);
 
@@ -286,6 +288,8 @@ void PivotTableDataProvider::collectPivotTableData()
         size_t nIndex = 0;
         for (sheet::DataResult const & rDataResult : xDataResults)
         {
+            if (rDataResult.Flags & css::sheet::DataResultFlags::SUBTOTAL)
+                continue;
             if (rDataResult.Flags == 0 || rDataResult.Flags & css::sheet::DataResultFlags::HASDATA)
             {
                 if (nIndex >= m_aDataRowVector.size())
commit 67af00a76a3bb86790447e2b223b03c5dddacc4a
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Fri Apr 7 14:45:20 2017 +0200

    new loplugin:inlinefields
    
    look for fields which can be declared inline in the parent class.
    
    start with some likely candidates in svx
    
    Change-Id: I56cdca273272b72bb728ed2e3f5e1e976f8c7c32
    Reviewed-on: https://gerrit.libreoffice.org/36262
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/compilerplugins/clang/inlinefields.cxx b/compilerplugins/clang/inlinefields.cxx
new file mode 100644
index 000000000000..e663c118ed22
--- /dev/null
+++ b/compilerplugins/clang/inlinefields.cxx
@@ -0,0 +1,247 @@
+/* -*- 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 <fstream>
+#include <set>
+#include "plugin.hxx"
+#include "compat.hxx"
+
+/**
+if a field is
+- a pointer
+- only assigned to in the constructor via a new expression
+- unconditionally deleted in the destructor
+then it can probably just be allocated inline in the parent object
+
+TODO check for cases where the pointer is passed by non-const reference
+
+Be warned that it produces around 5G of log file.
+
+The process goes something like this:
+  $ make check
+  $ make FORCE_COMPILE_ALL=1 COMPILER_PLUGIN_TOOL='inlinefields' check
+  $ ./compilerplugins/clang/inlinefields.py
+
+and then
+  $ for dir in *; do make FORCE_COMPILE_ALL=1 UPDATE_FILES=$dir COMPILER_PLUGIN_TOOL='inlinefieldsremove' $dir; done
+to auto-remove the method declarations
+
+Note that the actual process may involve a fair amount of undoing, hand editing, and general messing around
+to get it to work :-)
+
+*/
+
+namespace {
+
+struct MyFieldInfo
+{
+    std::string parentClass;
+    std::string fieldName;
+    std::string sourceLocation;
+};
+bool operator < (const MyFieldInfo &lhs, const MyFieldInfo &rhs)
+{
+    return std::tie(lhs.parentClass, lhs.fieldName)
+         < std::tie(rhs.parentClass, rhs.fieldName);
+}
+
+
+// try to limit the voluminous output a little
+static std::set<MyFieldInfo> excludedSet;
+static std::set<MyFieldInfo> definitionSet;
+static std::set<MyFieldInfo> deletedInDestructorSet;
+static std::set<MyFieldInfo> newedInConstructorSet;
+
+class InlineFields:
+    public RecursiveASTVisitor<InlineFields>, public loplugin::Plugin
+{
+public:
+    explicit InlineFields(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 MyFieldInfo & s : definitionSet)
+            output += "definition:\t" + s.parentClass + "\t" + s.fieldName + "\t" + s.sourceLocation + "\n";
+        for (const MyFieldInfo & s : excludedSet)
+            output += "excluded:\t" + s.parentClass + "\t" + s.fieldName + "\n";
+        for (const MyFieldInfo & s : deletedInDestructorSet)
+            output += "deletedInDestructor:\t" + s.parentClass + "\t" + s.fieldName + "\n";
+        for (const MyFieldInfo & s : newedInConstructorSet)
+            output += "newedInConstructor:\t" + s.parentClass + "\t" + s.fieldName + "\n";
+        ofstream myfile;
+        myfile.open( SRCDIR "/loplugin.inlinefields.log", ios::app | ios::out);
+        myfile << output;
+        myfile.close();
+    }
+
+    bool shouldVisitTemplateInstantiations () const { return true; }
+    bool shouldVisitImplicitCode() const { return true; }
+
+    bool VisitFieldDecl( const FieldDecl* );
+    bool VisitCXXConstructorDecl( const CXXConstructorDecl* );
+    bool VisitCXXDeleteExpr( const CXXDeleteExpr* );
+    bool VisitBinAssign( const BinaryOperator* );
+private:
+    MyFieldInfo niceName(const FieldDecl*);
+    void checkTouched(const FieldDecl* fieldDecl, const Expr* memberExpr);
+};
+
+MyFieldInfo InlineFields::niceName(const FieldDecl* fieldDecl)
+{
+    MyFieldInfo aInfo;
+
+    const RecordDecl* recordDecl = fieldDecl->getParent();
+
+    if (const CXXRecordDecl* cxxRecordDecl = dyn_cast<CXXRecordDecl>(recordDecl))
+    {
+        if (cxxRecordDecl->getTemplateInstantiationPattern())
+            cxxRecordDecl = cxxRecordDecl->getTemplateInstantiationPattern();
+        aInfo.parentClass = cxxRecordDecl->getQualifiedNameAsString();
+    }
+    else
+        aInfo.parentClass = recordDecl->getQualifiedNameAsString();
+
+    aInfo.fieldName = fieldDecl->getNameAsString();
+
+    SourceLocation expansionLoc = compiler.getSourceManager().getExpansionLoc( fieldDecl->getLocation() );
+    StringRef name = compiler.getSourceManager().getFilename(expansionLoc);
+    aInfo.sourceLocation = std::string(name.substr(strlen(SRCDIR)+1)) + ":" + std::to_string(compiler.getSourceManager().getSpellingLineNumber(expansionLoc));
+    normalizeDotDotInFilePath(aInfo.sourceLocation);
+
+    return aInfo;
+}
+
+bool InlineFields::VisitFieldDecl( const FieldDecl* fieldDecl )
+{
+    fieldDecl = fieldDecl->getCanonicalDecl();
+    if (ignoreLocation( fieldDecl )) {
+        return true;
+    }
+    // ignore stuff that forms part of the stable URE interface
+    if (isInUnoIncludeFile(compiler.getSourceManager().getSpellingLoc(fieldDecl->getLocation()))) {
+        return true;
+    }
+    QualType type = fieldDecl->getType();
+    if (!type->isPointerType())
+        return true;
+    definitionSet.insert(niceName(fieldDecl));
+    return true;
+}
+
+bool InlineFields::VisitCXXConstructorDecl( const CXXConstructorDecl* decl )
+{
+    if( ignoreLocation( decl ) )
+        return true;
+    if (decl->isCopyOrMoveConstructor())
+        return true;
+    for(auto it = decl->init_begin(); it != decl->init_end(); ++it)
+    {
+        const CXXCtorInitializer* init = *it;
+        const FieldDecl* fieldDecl = init->getMember();
+        if( !fieldDecl || !fieldDecl->getType()->isPointerType() )
+            continue;
+        auto e = init->getInit();
+        if (auto parentListExpr = dyn_cast<ParenListExpr>(e))
+            e = parentListExpr->getExpr(0);
+        e = e->IgnoreParenImpCasts();
+        if( isa<CXXNewExpr>(e) )
+            newedInConstructorSet.insert(niceName(fieldDecl));
+        else if( isa<CXXNullPtrLiteralExpr>(e) || isa<GNUNullExpr>(e))
+            ; // ignore
+        else
+            excludedSet.insert(niceName(fieldDecl));
+    }
+    return true;
+}
+
+static bool isSameParent(const CXXMethodDecl* cxxMethodDecl, const FieldDecl* fieldDecl)
+{
+    return cxxMethodDecl->getParent() == dyn_cast<CXXRecordDecl>(fieldDecl->getParent());
+}
+
+bool InlineFields::VisitBinAssign(const BinaryOperator * binaryOp)
+{
+    if( ignoreLocation( binaryOp ) )
+        return true;
+    auto memberExpr = dyn_cast<MemberExpr>(binaryOp->getLHS());
+    if (!memberExpr)
+        return true;
+    auto fieldDecl = dyn_cast<FieldDecl>(memberExpr->getMemberDecl());
+    if (!fieldDecl || !fieldDecl->getType()->isPointerType()) {
+        return true;
+    }
+    const FunctionDecl* parentFunction = parentFunctionDecl(binaryOp);
+    if (!parentFunction) {
+        return true;
+    }
+    // if the field is being assigned from outside it's own constructor or destructor, exclude
+    auto constructorDecl = dyn_cast<CXXConstructorDecl>(parentFunction);
+    if (constructorDecl && isSameParent(constructorDecl, fieldDecl)) {
+        if( isa<CXXNewExpr>(binaryOp->getRHS()) )
+            newedInConstructorSet.insert(niceName(fieldDecl));
+        else {
+            excludedSet.insert(niceName(fieldDecl));
+            std::cout << "assign in constructor:" << std::endl;
+            binaryOp->getRHS()->dump();
+        }
+        return true;
+    }
+    auto destructorDecl = dyn_cast<CXXDestructorDecl>(parentFunction);
+    if (destructorDecl && isSameParent(destructorDecl, fieldDecl)) {
+        auto e = binaryOp->getRHS()->IgnoreParenImpCasts();
+        if( !isa<CXXNullPtrLiteralExpr>(e) && !isa<GNUNullExpr>(e)) {
+            excludedSet.insert(niceName(fieldDecl));
+            std::cout << "assign in destructor:" << std::endl;
+            e->dump();
+        }
+        return true;
+    }
+    excludedSet.insert(niceName(fieldDecl));
+    return true;
+}
+
+bool InlineFields::VisitCXXDeleteExpr(const CXXDeleteExpr * deleteExpr)
+{
+    if( ignoreLocation( deleteExpr ) )
+        return true;
+    auto memberExpr = dyn_cast<MemberExpr>(deleteExpr->getArgument()->IgnoreParenImpCasts());
+    if (!memberExpr)
+        return true;
+    auto fieldDecl = dyn_cast<FieldDecl>(memberExpr->getMemberDecl());
+    if (!fieldDecl || !fieldDecl->getType()->isPointerType()) {
+        return true;
+    }
+    // TODO for some reason, this part is not working properly, it doesn't find the parent
+    // function for delete statements properly
+    const FunctionDecl* parentFunction = parentFunctionDecl(deleteExpr);
+    if (!parentFunction) {
+        return true;
+    }
+    auto destructorDecl = dyn_cast<CXXDestructorDecl>(parentFunction);
+    if (destructorDecl && isSameParent(destructorDecl, fieldDecl)) {
+        deletedInDestructorSet.insert(niceName(fieldDecl));
+        return true;
+    }
+    excludedSet.insert(niceName(fieldDecl));
+    return true;
+}
+
+loplugin::Plugin::Registration< InlineFields > X("inlinefields", false);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/compilerplugins/clang/inlinefields.py b/compilerplugins/clang/inlinefields.py
new file mode 100755
index 000000000000..2605fd7bc173
--- /dev/null
+++ b/compilerplugins/clang/inlinefields.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+
+import sys
+import re
+import io
+
+definitionToSourceLocationMap = dict() # dict of tuple(parentClass, fieldName) to sourceLocation
+definitionSet = set()
+excludedSet = set()
+deletedInDestructorSet = set()
+newedInConstructorSet = set();
+
+# clang does not always use exactly the same numbers in the type-parameter vars it generates
+# so I need to substitute them to ensure we can match correctly.
+normalizeTypeParamsRegex = re.compile(r"type-parameter-\d+-\d+")
+def normalizeTypeParams( line ):
+    return normalizeTypeParamsRegex.sub("type-parameter-?-?", line)
+
+# reading as binary (since we known it is pure ascii) is much faster than reading as unicode
+with io.open("loplugin.inlinefields.log", "rb", buffering=1024*1024) as txt:
+    for line in txt:
+        tokens = line.strip().split("\t")
+        if tokens[0] == "definition:":
+            parentClass = normalizeTypeParams(tokens[1])
+            fieldName = normalizeTypeParams(tokens[2])
+            sourceLocation = tokens[3]
+            fieldInfo = (parentClass, fieldName)
+            definitionSet.add(fieldInfo)
+            definitionToSourceLocationMap[fieldInfo] = sourceLocation
+        elif tokens[0] == "excluded:":
+            parentClass = normalizeTypeParams(tokens[1])
+            fieldName = normalizeTypeParams(tokens[2])
+            fieldInfo = (parentClass, fieldName)
+            excludedSet.add(fieldInfo)
+        elif tokens[0] == "deletedInDestructor:":
+            parentClass = normalizeTypeParams(tokens[1])
+            fieldName = normalizeTypeParams(tokens[2])
+            fieldInfo = (parentClass, fieldName)
+            deletedInDestructorSet.add(fieldInfo)
+        elif tokens[0] == "newedInConstructor:":
+            parentClass = normalizeTypeParams(tokens[1])
+            fieldName = normalizeTypeParams(tokens[2])
+            fieldInfo = (parentClass, fieldName)
+            newedInConstructorSet.add(fieldInfo)
+        else:
+            print( "unknown line: " + line)
+
+# Invert the definitionToSourceLocationMap
+# If we see more than one method at the same sourceLocation, it's being autogenerated as part of a template
+# and we should just ignore it
+sourceLocationToDefinitionMap = {}
+for k, v in definitionToSourceLocationMap.iteritems():
+    sourceLocationToDefinitionMap[v] = sourceLocationToDefinitionMap.get(v, [])
+    sourceLocationToDefinitionMap[v].append(k)
+for k, definitions in sourceLocationToDefinitionMap.iteritems():
+    if len(definitions) > 1:
+        for d in definitions:
+            definitionSet.remove(d)
+
+tmp1list = list()
+for d in definitionSet:
+# TODO see comment in InlineFields::VisitCXXDeleteExpr
+#    if d in excludedSet or d not in deletedInDestructorSet or d not in newedInConstructorSet:
+    if d in excludedSet or d not in newedInConstructorSet:
+        continue
+    srcLoc = definitionToSourceLocationMap[d];
+    tmp1list.append((d[0] + " " + d[1], srcLoc))
+
+# sort results by filename:lineno
+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)]
+tmp1list.sort(key=lambda v: natural_sort_key(v[1]))
+
+# print out the results
+with open("loplugin.inlinefields.report", "wt") as f:
+    for v in tmp1list:
+        f.write(v[1] + "\n")
+        f.write("    " + v[0] + "\n")
+
+
diff --git a/include/svx/nbdtmg.hxx b/include/svx/nbdtmg.hxx
index 52285b1924e1..aeb4ae6651fb 100644
--- a/include/svx/nbdtmg.hxx
+++ b/include/svx/nbdtmg.hxx
@@ -180,8 +180,8 @@ class SVX_DLLPUBLIC NumberingTypeMgr: public NBOTypeMgrBase
     private:
         NumberingTypeMgr(const NumberingTypeMgr&) = delete;
     public:
-        NumberSettingsArr_Impl*     pNumberSettingsArr;
-        NumberSettingsArr_Impl*     pDefaultNumberSettingsArr;
+        NumberSettingsArr_Impl      maNumberSettingsArr;
+        NumberSettingsArr_Impl      maDefaultNumberSettingsArr;
     public:
         NumberingTypeMgr();
         virtual ~NumberingTypeMgr() override;
diff --git a/svx/source/accessibility/svxpixelctlaccessiblecontext.cxx b/svx/source/accessibility/svxpixelctlaccessiblecontext.cxx
index c93a67537432..31f509a11852 100644
--- a/svx/source/accessibility/svxpixelctlaccessiblecontext.cxx
+++ b/svx/source/accessibility/svxpixelctlaccessiblecontext.cxx
@@ -530,7 +530,7 @@ SvxPixelCtlAccessibleChild::SvxPixelCtlAccessibleChild(
     mrParentWindow( rWindow ),
     mxParent(rxParent),
     m_bPixelColorOrBG(bPixelColorOrBG),
-    mpBoundingBox( new tools::Rectangle( rBoundingBox ) ),
+    maBoundingBox( rBoundingBox ),
     mnIndexInParent( nIndexInParent ),
     mnClientId( 0 )
 {
@@ -771,8 +771,6 @@ void SAL_CALL SvxPixelCtlAccessibleChild::disposing()
         }
 
         mxParent.clear();
-
-        delete mpBoundingBox;
     }
 }
 
@@ -794,10 +792,10 @@ tools::Rectangle SvxPixelCtlAccessibleChild::GetBoundingBoxOnScreen()
 
 tools::Rectangle const & SvxPixelCtlAccessibleChild::GetBoundingBox()
 {
-    // no guard necessary, because no one changes mpBoundingBox after creating it
+    // no guard necessary, because no one changes maBoundingBox after creating it
     ThrowExceptionIfNotAlive();
 
-    return *mpBoundingBox;
+    return maBoundingBox;
 }
 
 OUString SvxPixelCtlAccessibleChild::GetName()
diff --git a/svx/source/accessibility/svxrectctaccessiblecontext.cxx b/svx/source/accessibility/svxrectctaccessiblecontext.cxx
index 2f474038dacc..0b091932c1d1 100644
--- a/svx/source/accessibility/svxrectctaccessiblecontext.cxx
+++ b/svx/source/accessibility/svxrectctaccessiblecontext.cxx
@@ -660,7 +660,7 @@ SvxRectCtlChildAccessibleContext::SvxRectCtlChildAccessibleContext(
     msDescription( rDescription ),
     msName( rName ),
     mxParent(rxParent),
-    mpBoundingBox( new tools::Rectangle( rBoundingBox ) ),
+    maBoundingBox( rBoundingBox ),
     mrParentWindow( rParentWindow ),
     mnClientId( 0 ),
     mnIndexInParent( nIndexInParent ),
@@ -986,8 +986,6 @@ void SAL_CALL SvxRectCtlChildAccessibleContext::disposing()
         }
 
         mxParent.clear();
-
-        delete mpBoundingBox;
     }
 }
 
@@ -1009,10 +1007,10 @@ tools::Rectangle SvxRectCtlChildAccessibleContext::GetBoundingBoxOnScreen()
 
 tools::Rectangle const & SvxRectCtlChildAccessibleContext::GetBoundingBox()
 {
-    // no guard necessary, because no one changes mpBoundingBox after creating it
+    // no guard necessary, because no one changes maBoundingBox after creating it
     ThrowExceptionIfNotAlive();
 
-    return *mpBoundingBox;
+    return maBoundingBox;
 }
 
 void SvxRectCtlChildAccessibleContext::setStateChecked( bool bChecked )
diff --git a/svx/source/form/formcontroller.cxx b/svx/source/form/formcontroller.cxx
index bd28d36b9a7e..55aeb92c3117 100644
--- a/svx/source/form/formcontroller.cxx
+++ b/svx/source/form/formcontroller.cxx
@@ -540,7 +540,6 @@ FormController::FormController(const Reference< css::uno::XComponentContext > &
                   ,m_aRowSetApproveListeners(m_aMutex)
                   ,m_aParameterListeners(m_aMutex)
                   ,m_aFilterListeners(m_aMutex)
-                  ,m_pControlBorderManager( new ::svxform::ControlBorderManager )
                   ,m_xFormOperations()
                   ,m_aMode( OUString( "DataMode"  ) )
                   ,m_aLoadEvent( LINK( this, FormController, OnLoad ) )
@@ -610,9 +609,6 @@ FormController::~FormController()
         m_xAggregate->setDelegator( nullptr );
         m_xAggregate.clear();
     }
-
-    DELETEZ( m_pControlBorderManager );
-
 }
 
 
@@ -1164,7 +1160,7 @@ void FormController::disposing()
     removeBoundFieldListener();
     stopFiltering();
 
-    m_pControlBorderManager->restoreAll();
+    m_aControlBorderManager.restoreAll();
 
     m_aFilterRows.clear();
 
@@ -1284,13 +1280,13 @@ void SAL_CALL FormController::propertyChange(const PropertyChangeEvent& evt)
             bool bEnable = lcl_shouldUseDynamicControlBorder( evt.Source, evt.NewValue );
             if ( bEnable )
             {
-                m_pControlBorderManager->enableDynamicBorderColor();
+                m_aControlBorderManager.enableDynamicBorderColor();
                 if ( m_xActiveControl.is() )
-                    m_pControlBorderManager->focusGained( m_xActiveControl.get() );
+                    m_aControlBorderManager.focusGained( m_xActiveControl.get() );
             }
             else
             {
-                m_pControlBorderManager->disableDynamicBorderColor();
+                m_aControlBorderManager.disableDynamicBorderColor();
             }
         }
     }
@@ -1621,7 +1617,7 @@ void FormController::focusGained(const FocusEvent& e)
     ::osl::ClearableMutexGuard aGuard( m_aMutex );
     impl_checkDisposed_throw();
 
-    m_pControlBorderManager->focusGained( e.Source );
+    m_aControlBorderManager.focusGained( e.Source );
 
     Reference< XControl >  xControl(e.Source, UNO_QUERY);
     if (m_bDBConnection)
@@ -1772,7 +1768,7 @@ void FormController::focusLost(const FocusEvent& e)
 {
     OSL_ENSURE( !impl_isDisposed_nofail(), "FormController: already disposed!" );
 
-    m_pControlBorderManager->focusLost( e.Source );
+    m_aControlBorderManager.focusLost( e.Source );
 
     Reference< XControl >  xControl(e.Source, UNO_QUERY);
     Reference< XWindowPeer >  xNext(e.NextFocus, UNO_QUERY);
@@ -1799,13 +1795,13 @@ void SAL_CALL FormController::mouseReleased( const awt::MouseEvent& /*_rEvent*/
 
 void SAL_CALL FormController::mouseEntered( const awt::MouseEvent& _rEvent )
 {
-    m_pControlBorderManager->mouseEntered( _rEvent.Source );
+    m_aControlBorderManager.mouseEntered( _rEvent.Source );
 }
 
 
 void SAL_CALL FormController::mouseExited( const awt::MouseEvent& _rEvent )
 {
-    m_pControlBorderManager->mouseExited( _rEvent.Source );
+    m_aControlBorderManager.mouseExited( _rEvent.Source );
 }
 
 
@@ -1817,7 +1813,7 @@ void SAL_CALL FormController::componentValidityChanged( const EventObject& _rSou
     OSL_ENSURE( xControl.is() && xValidatable.is(), "FormController::componentValidityChanged: huh?" );
 
     if ( xControl.is() && xValidatable.is() )
-        m_pControlBorderManager->validityChanged( xControl, xValidatable );
+        m_aControlBorderManager.validityChanged( xControl, xValidatable );
 }
 
 
@@ -1913,17 +1909,17 @@ void FormController::setModel(const Reference< XTabControllerModel > & Model)
                 bool bEnableDynamicControlBorder = lcl_shouldUseDynamicControlBorder(
                     xModelProps.get(), xModelProps->getPropertyValue( FM_PROP_DYNAMIC_CONTROL_BORDER ) );
                 if ( bEnableDynamicControlBorder )
-                    m_pControlBorderManager->enableDynamicBorderColor();
+                    m_aControlBorderManager.enableDynamicBorderColor();
                 else
-                    m_pControlBorderManager->disableDynamicBorderColor();
+                    m_aControlBorderManager.disableDynamicBorderColor();
 
                 sal_Int32 nColor = 0;
                 if ( xModelProps->getPropertyValue( FM_PROP_CONTROL_BORDER_COLOR_FOCUS ) >>= nColor )
-                    m_pControlBorderManager->setStatusColor( ControlStatus::Focused, nColor );
+                    m_aControlBorderManager.setStatusColor( ControlStatus::Focused, nColor );
                 if ( xModelProps->getPropertyValue( FM_PROP_CONTROL_BORDER_COLOR_MOUSE ) >>= nColor )
-                    m_pControlBorderManager->setStatusColor( ControlStatus::MouseHover, nColor );
+                    m_aControlBorderManager.setStatusColor( ControlStatus::MouseHover, nColor );
                 if ( xModelProps->getPropertyValue( FM_PROP_CONTROL_BORDER_COLOR_INVALID ) >>= nColor )
-                    m_pControlBorderManager->setStatusColor( ControlStatus::Invalid, nColor );
+                    m_aControlBorderManager.setStatusColor( ControlStatus::Invalid, nColor );
             }
         }
     }
@@ -2436,7 +2432,7 @@ void FormController::implControlInserted( const Reference< XControl>& _rxControl
         if ( xValidatable.is() )
         {
             xValidatable->addFormComponentValidityListener( this );
-            m_pControlBorderManager->validityChanged( _rxControl, xValidatable );
+            m_aControlBorderManager.validityChanged( _rxControl, xValidatable );
         }
     }
 
diff --git a/svx/source/inc/formcontroller.hxx b/svx/source/inc/formcontroller.hxx
index 5ee325731154..7fe54a170052 100644
--- a/svx/source/inc/formcontroller.hxx
+++ b/svx/source/inc/formcontroller.hxx
@@ -166,8 +166,8 @@ namespace svxform
         Idle                        m_aTabActivationIdle;
         Timer                       m_aFeatureInvalidationTimer;
 
-        ::svxform::ControlBorderManager*
-                                    m_pControlBorderManager;
+        ::svxform::ControlBorderManager
+                                    m_aControlBorderManager;
 
         css::uno::Reference< css::form::runtime::XFormOperations >
                                     m_xFormOperations;
diff --git a/svx/source/inc/svxpixelctlaccessiblecontext.hxx b/svx/source/inc/svxpixelctlaccessiblecontext.hxx
index 827fab99a0b2..618801734d3d 100644
--- a/svx/source/inc/svxpixelctlaccessiblecontext.hxx
+++ b/svx/source/inc/svxpixelctlaccessiblecontext.hxx
@@ -69,7 +69,7 @@ class SvxPixelCtlAccessibleChild :
     SvxPixelCtl& mrParentWindow;
     css::uno::Reference< css::accessibility::XAccessible > mxParent;
     bool m_bPixelColorOrBG;//Pixel Color Or BackGround Color
-    tools::Rectangle*  mpBoundingBox;
+    tools::Rectangle  maBoundingBox;
     /// index of child in parent
     long                                mnIndexInParent;
 public:
diff --git a/svx/source/inc/svxrectctaccessiblecontext.hxx b/svx/source/inc/svxrectctaccessiblecontext.hxx
index 1a71e781d2ef..5cfe6f87d288 100644
--- a/svx/source/inc/svxrectctaccessiblecontext.hxx
+++ b/svx/source/inc/svxrectctaccessiblecontext.hxx
@@ -45,6 +45,7 @@
 #include <comphelper/servicehelper.hxx>
 #include <svx/rectenum.hxx>
 #include <vcl/vclptr.hxx>
+#include <tools/gen.hxx>
 
 namespace com { namespace sun { namespace star { namespace awt {
     struct Point;
@@ -437,7 +438,7 @@ private:
                                         mxParent;
 
     /// Bounding box
-    tools::Rectangle*                          mpBoundingBox;
+    tools::Rectangle                         maBoundingBox;
 
     /// window of parent
     const vcl::Window&                       mrParentWindow;
diff --git a/svx/source/sidebar/nbdtmg.cxx b/svx/source/sidebar/nbdtmg.cxx
index 6f9ef286743d..1e9f1b10e064 100644
--- a/svx/source/sidebar/nbdtmg.cxx
+++ b/svx/source/sidebar/nbdtmg.cxx
@@ -426,20 +426,14 @@ bool BulletsTypeMgr::IsCustomized(sal_uInt16 nIndex)
 // Numbering Type lib
 NumberingTypeMgr::NumberingTypeMgr()
     : NBOTypeMgrBase()
-    , pNumberSettingsArr (new NumberSettingsArr_Impl)
 {
     Init();
-    pDefaultNumberSettingsArr = pNumberSettingsArr;
-    pNumberSettingsArr = new NumberSettingsArr_Impl;
-    //Initial the first time to store the default value. Then do it again for customized value
-    Init();
+    maDefaultNumberSettingsArr = maNumberSettingsArr;
     ImplLoad("standard.syb");
 }
 
 NumberingTypeMgr::~NumberingTypeMgr()
 {
-    delete pNumberSettingsArr;
-    delete pDefaultNumberSettingsArr;
 }
 
 class theNumberingTypeMgr : public rtl::Static<NumberingTypeMgr, theNumberingTypeMgr> {};
@@ -472,7 +466,7 @@ void NumberingTypeMgr::Init()
             pNumEntry->pNumSetting = pNew;
             if ( i < 8 )
                 pNumEntry->sDescription = SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS + i );
-            pNumberSettingsArr->push_back(std::shared_ptr<NumberSettings_Impl>(pNumEntry));
+            maNumberSettingsArr.push_back(std::shared_ptr<NumberSettings_Impl>(pNumEntry));
         }
     }
     catch(Exception&)
@@ -497,10 +491,10 @@ sal_uInt16 NumberingTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 m
     OUString sLclSuffix = aFmt.GetSuffix();
     sal_Int16 eNumType = aFmt.GetNumberingType();
 
-    sal_uInt16 nCount = pNumberSettingsArr->size();
+    sal_uInt16 nCount = maNumberSettingsArr.size();
     for(sal_uInt16 i = nFromIndex; i < nCount; ++i)
     {
-        NumberSettings_Impl* _pSet = (*pNumberSettingsArr)[i].get();
+        NumberSettings_Impl* _pSet = maNumberSettingsArr[i].get();
         sal_Int16 eNType = _pSet->pNumSetting->nNumberType;
         OUString sLocalPrefix = _pSet->pNumSetting->sPrefix;
         OUString sLocalSuffix = _pSet->pNumSetting->sSuffix;
@@ -526,11 +520,11 @@ void NumberingTypeMgr::RelplaceNumRule(SvxNumRule& aNum, sal_uInt16 nIndex, sal_
     SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
     SvxNumType eNumType = aFmt.GetNumberingType();
 
-    sal_uInt16 nCount = pNumberSettingsArr->size();
+    sal_uInt16 nCount = maNumberSettingsArr.size();
     if ( nIndex >= nCount )
         return;
 
-    NumberSettings_Impl* _pSet = (*pNumberSettingsArr)[nIndex].get();
+    NumberSettings_Impl* _pSet = maNumberSettingsArr[nIndex].get();
 
     _pSet->pNumSetting->sPrefix = aFmt.GetPrefix();
     _pSet->pNumSetting->sSuffix = aFmt.GetSuffix();
@@ -555,10 +549,10 @@ void NumberingTypeMgr::RelplaceNumRule(SvxNumRule& aNum, sal_uInt16 nIndex, sal_
 
 void NumberingTypeMgr::ApplyNumRule(SvxNumRule& aNum, sal_uInt16 nIndex, sal_uInt16 mLevel, bool isDefault, bool isResetSize)
 {
-    if(pNumberSettingsArr->size() <= nIndex)
+    if(maNumberSettingsArr.size() <= nIndex)
         return;
-    NumberSettingsArr_Impl*     pCurrentNumberSettingsArr=pNumberSettingsArr;
-    if (isDefault) pCurrentNumberSettingsArr=pDefaultNumberSettingsArr;
+    NumberSettingsArr_Impl*     pCurrentNumberSettingsArr = &maNumberSettingsArr;
+    if (isDefault) pCurrentNumberSettingsArr = &maDefaultNumberSettingsArr;
     NumberSettings_Impl* _pSet = (*pCurrentNumberSettingsArr)[nIndex].get();
     SvxNumType eNewType = _pSet->pNumSetting->nNumberType;
 
@@ -586,13 +580,13 @@ OUString NumberingTypeMgr::GetDescription(sal_uInt16 nIndex, bool isDefault)
 {
     OUString sRet;
     sal_uInt16 nLength = 0;
-    nLength = pNumberSettingsArr->size();
+    nLength = maNumberSettingsArr.size();
 
     if ( nIndex >= nLength )
         return sRet;
     else
-        sRet = (*pNumberSettingsArr)[nIndex]->sDescription;
-    if (isDefault) sRet = (*pDefaultNumberSettingsArr)[nIndex]->sDescription;
+        sRet = maNumberSettingsArr[nIndex]->sDescription;
+    if (isDefault) sRet = maDefaultNumberSettingsArr[nIndex]->sDescription;
 
     return sRet;
 }
@@ -601,12 +595,12 @@ bool NumberingTypeMgr::IsCustomized(sal_uInt16 nIndex)
 {
     bool bRet = false;
     sal_uInt16 nLength = 0;
-    nLength = pNumberSettingsArr->size();
+    nLength = maNumberSettingsArr.size();
 
     if ( nIndex >= nLength )
         bRet = false;
     else
-        bRet = (*pNumberSettingsArr)[nIndex]->bIsCustomized;
+        bRet = maNumberSettingsArr[nIndex]->bIsCustomized;
 
     return bRet;
 }


More information about the Libreoffice-commits mailing list