[Libreoffice-commits] core.git: compilerplugins/clang sc/source sd/inc sd/source solenv/CompilerTest_compilerplugins_clang.mk

Noel Grandin noel.grandin at collabora.co.uk
Mon Nov 21 06:20:16 UTC 2016


 compilerplugins/clang/datamembershadow.cxx      |  157 ++++++++++++++++++++++++
 compilerplugins/clang/test/datamembershadow.cxx |   19 ++
 sc/source/ui/vba/vbanames.cxx                   |    3 
 sc/source/ui/vba/vbatextboxshape.cxx            |    1 
 sc/source/ui/vba/vbatextboxshape.hxx            |    1 
 sd/inc/sdundo.hxx                               |    3 
 sd/source/core/annotations/Annotation.cxx       |    1 
 sd/source/ui/inc/unmodpg.hxx                    |    4 
 sd/source/ui/view/unmodpg.cxx                   |    7 -
 solenv/CompilerTest_compilerplugins_clang.mk    |    1 
 10 files changed, 181 insertions(+), 16 deletions(-)

New commits:
commit 04f262ace019dc87bb52f32c42107a8f2b348d89
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Thu Nov 17 10:59:34 2016 +0200

    new loplugin datamembershadow
    
    Change-Id: Ib14319848bafd1fe7e0e663c434bbdeef5e98ecf
    Reviewed-on: https://gerrit.libreoffice.org/30963
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/compilerplugins/clang/datamembershadow.cxx b/compilerplugins/clang/datamembershadow.cxx
new file mode 100644
index 0000000..a1d4528
--- /dev/null
+++ b/compilerplugins/clang/datamembershadow.cxx
@@ -0,0 +1,157 @@
+/* -*- 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 <string>
+#include <iostream>
+#include <map>
+#include <set>
+
+#include "plugin.hxx"
+#include "clang/AST/CXXInheritance.h"
+
+/**
+ * Check for data member being shadowed.
+ *
+ * @TODO check for any members in superclass hierarchy with duplicate names,
+ *       more specific names will make the code easier to read
+ */
+namespace
+{
+
+class DataMemberShadow:
+    public RecursiveASTVisitor<DataMemberShadow>, public loplugin::Plugin
+{
+public:
+    explicit DataMemberShadow(InstantiationData const & data): Plugin(data) {}
+
+    virtual void run() override {
+        TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+    }
+
+    bool VisitFieldDecl(FieldDecl const *);
+};
+
+bool DataMemberShadow::VisitFieldDecl(FieldDecl const * fieldDecl)
+{
+    if (ignoreLocation(fieldDecl)) {
+        return true;
+    }
+    StringRef aFileName = compiler.getSourceManager().getFilename(
+            compiler.getSourceManager().getSpellingLoc(fieldDecl->getLocStart()));
+
+    // FIXME complex stuff to fix later
+
+    if (aFileName == SRCDIR "/connectivity/source/inc/calc/CTable.hxx")
+        return true;
+    if (aFileName.startswith(SRCDIR "/chart2/source/"))
+        return true;
+    if (aFileName == SRCDIR "/cppcanvas/source/mtfrenderer/emfplus.cxx")
+        return true;
+    if (aFileName == SRCDIR "/cui/source/customize/eventdlg.hxx")
+        return true;
+    if (aFileName == SRCDIR "/include/sfx2/recentdocsview.hxx")
+        return true;
+    if (aFileName == SRCDIR "/include/sfx2/templatelocalview.hxx")
+        return true;
+    if (aFileName == SRCDIR "/filter/source/graphicfilter/idxf/dxfentrd.hxx")
+        return true;
+    if (aFileName == SRCDIR "/framework/source/uielement/popuptoolbarcontroller.cxx")
+        return true;
+    if (aFileName == SRCDIR "/lotuswordpro/source/filter/xfilter/xfcellstyle.hxx")
+        return true;
+    if (aFileName == SRCDIR "/lotuswordpro/source/filter/xfilter/xfdrawobj.hxx")
+        return true;
+    if (aFileName == SRCDIR "/sc/source/ui/vba/vbastyles.hxx")
+        return true;
+    if (aFileName == SRCDIR "/sd/inc/Outliner.hxx")
+        return true;
+    if (aFileName == SRCDIR "/sd/source/ui/annotations/annotationtag.cxx")
+        return true;
+    if (aFileName == SRCDIR "/sd/source/ui/inc/FrameView.hxx"
+        || aFileName == SRCDIR "/sd/source/filter/ppt/../../ui/inc/FrameView.hxx")
+        return true;
+    if (aFileName == SRCDIR "/sd/source/ui/inc/unopage.hxx")
+        return true;
+    if (aFileName == SRCDIR "/sd/source/ui/view/viewoverlaymanager.cxx")
+        return true;
+    if (aFileName == SRCDIR "/sdext/source/presenter/PresenterSpritePane.hxx")
+        return true;
+    if (aFileName == SRCDIR "/store/source/stortree.hxx"
+        || aFileName == SRCDIR "/store/source/stordata.hxx")
+        return true;
+    if (aFileName == SRCDIR "/svx/source/table/cell.hxx"
+        || aFileName == SRCDIR "/svx/source/unodraw/../table/cell.hxx"
+        || aFileName == SRCDIR "/svx/source/accessibility/../table/cell.hxx")
+        return true;
+    if (aFileName == SRCDIR "/sw/source/uibase/inc/dbtree.hxx")
+        return true;
+    if (aFileName == SRCDIR "/vcl/unx/generic/print/genpspgraphics.cxx")
+        return true;
+    if (aFileName == SRCDIR "/xmloff/source/draw/ximplink.hxx")
+        return true;
+
+    const CXXRecordDecl* parentCXXRecordDecl = dyn_cast<CXXRecordDecl>(fieldDecl->getParent());
+    if (!parentCXXRecordDecl) {
+        return true;
+    }
+
+    fieldDecl = fieldDecl->getCanonicalDecl();
+
+#if CLANG_VERSION >= 30800
+
+    auto BaseMatchesCallback = [&](const CXXBaseSpecifier *cxxBaseSpecifier, CXXBasePath& Paths)
+    {
+        if (!cxxBaseSpecifier->getType().getTypePtr())
+            return false;
+        const CXXRecordDecl* baseCXXRecordDecl = cxxBaseSpecifier->getType()->getAsCXXRecordDecl();
+        if (!baseCXXRecordDecl)
+            return false;
+        if (baseCXXRecordDecl->isInvalidDecl())
+            return false;
+        for (const FieldDecl* baseFieldDecl : baseCXXRecordDecl->fields())
+        {
+            if (baseFieldDecl->getAccess() == AS_private
+                || !baseFieldDecl->getDeclName().isIdentifier()
+                || fieldDecl->getName() != baseFieldDecl->getName()) {
+                continue;
+            }
+            std::string sPath;
+            for (CXXBasePathElement const & pathElement : Paths) {
+                if (!sPath.empty()) {
+                    sPath += "->";
+                }
+                sPath += pathElement.Class->getNameAsString();
+            }
+            sPath += "->";
+            sPath += baseCXXRecordDecl->getNameAsString();
+            report(DiagnosticsEngine::Warning,
+                    "data member %0 is shadowing member in superclass, through inheritance path %1",
+                    fieldDecl->getLocStart())
+                << fieldDecl->getName()
+                << sPath
+                << fieldDecl->getSourceRange();
+            report(DiagnosticsEngine::Note,
+                    "superclass member here",
+                    baseFieldDecl->getLocStart())
+                << baseFieldDecl->getSourceRange();
+        }
+        return false;
+    };
+
+    CXXBasePaths aPaths;
+    parentCXXRecordDecl->lookupInBases(BaseMatchesCallback, aPaths);
+#endif
+    return true;
+}
+
+loplugin::Plugin::Registration< DataMemberShadow > X("datamembershadow", true);
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/compilerplugins/clang/test/datamembershadow.cxx b/compilerplugins/clang/test/datamembershadow.cxx
new file mode 100644
index 0000000..663750a
--- /dev/null
+++ b/compilerplugins/clang/test/datamembershadow.cxx
@@ -0,0 +1,19 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * 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/.
+ */
+
+
+struct Bar {
+    int x; // expected-note {{superclass member here [loplugin:datamembershadow]}}
+};
+
+struct Foo : public Bar {
+    int x; // expected-error {{data member x is shadowing member in superclass, through inheritance path Foo->Bar [loplugin:datamembershadow]}}
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/sc/source/ui/vba/vbanames.cxx b/sc/source/ui/vba/vbanames.cxx
index b30ebe3..49e9b0d 100644
--- a/sc/source/ui/vba/vbanames.cxx
+++ b/sc/source/ui/vba/vbanames.cxx
@@ -41,10 +41,9 @@ using namespace ::com::sun::star;
 class NamesEnumeration : public EnumerationHelperImpl
 {
     uno::Reference< frame::XModel > m_xModel;
-    uno::WeakReference< XHelperInterface > m_xParent;
     uno::Reference< sheet::XNamedRanges > m_xNames;
 public:
-    NamesEnumeration( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< container::XEnumeration >& xEnumeration,  const uno::Reference< frame::XModel >& xModel , const uno::Reference< sheet::XNamedRanges >& xNames ) throw ( uno::RuntimeException ) : EnumerationHelperImpl( xParent, xContext, xEnumeration ), m_xModel( xModel ), m_xParent( xParent ), m_xNames( xNames ) {}
+    NamesEnumeration( const uno::Reference< XHelperInterface >& xParent, const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< container::XEnumeration >& xEnumeration,  const uno::Reference< frame::XModel >& xModel , const uno::Reference< sheet::XNamedRanges >& xNames ) throw ( uno::RuntimeException ) : EnumerationHelperImpl( xParent, xContext, xEnumeration ), m_xModel( xModel ), m_xNames( xNames ) {}
 
     virtual uno::Any SAL_CALL nextElement(  ) throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException, std::exception) override
     {
diff --git a/sc/source/ui/vba/vbatextboxshape.cxx b/sc/source/ui/vba/vbatextboxshape.cxx
index f3f1c7e..f0e84e7 100644
--- a/sc/source/ui/vba/vbatextboxshape.cxx
+++ b/sc/source/ui/vba/vbatextboxshape.cxx
@@ -28,7 +28,6 @@ using namespace ooo::vba;
 ScVbaTextBoxShape::ScVbaTextBoxShape( const uno::Reference< uno::XComponentContext >& xContext, const uno::Reference< drawing::XShape >& xShape, const uno::Reference< drawing::XShapes >& xShapes, const uno::Reference< frame::XModel >& xModel ) : TextBoxShapeImpl_BASE( uno::Reference< XHelperInterface >(), xContext, xShape, xShapes, xModel, ScVbaShape::getType( xShape )  )
 {
     m_xTextRange.set( xShape , uno::UNO_QUERY_THROW );
-    m_xModel.set( xModel );
 }
 
 OUString SAL_CALL
diff --git a/sc/source/ui/vba/vbatextboxshape.hxx b/sc/source/ui/vba/vbatextboxshape.hxx
index f6616e1..2e76242 100644
--- a/sc/source/ui/vba/vbatextboxshape.hxx
+++ b/sc/source/ui/vba/vbatextboxshape.hxx
@@ -30,7 +30,6 @@ typedef cppu::ImplInheritanceHelper< ScVbaShape, ov::msforms::XTextBoxShape > Te
 class ScVbaTextBoxShape : public TextBoxShapeImpl_BASE
 {
     css::uno::Reference< css::text::XTextRange > m_xTextRange;
-    css::uno::Reference< css::frame::XModel > m_xModel;
 public:
     ScVbaTextBoxShape( const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::drawing::XShape >& xShape, const css::uno::Reference< css::drawing::XShapes >& xShapes, const css::uno::Reference< css::frame::XModel >& xModel );
 
diff --git a/sd/inc/sdundo.hxx b/sd/inc/sdundo.hxx
index c704139..fa2d06e 100644
--- a/sd/inc/sdundo.hxx
+++ b/sd/inc/sdundo.hxx
@@ -39,8 +39,9 @@ public:
 
 protected:
     SdDrawDocument* mpDoc;
-    OUString maComment;
     sal_Int32 mnViewShellId;
+private:
+    OUString maComment;
 };
 
 #endif // INCLUDED_SD_INC_SDUNDO_HXX
diff --git a/sd/source/core/annotations/Annotation.cxx b/sd/source/core/annotations/Annotation.cxx
index 52e9995..88af756 100644
--- a/sd/source/core/annotations/Annotation.cxx
+++ b/sd/source/core/annotations/Annotation.cxx
@@ -100,7 +100,6 @@ private:
     virtual void SAL_CALL disposing() override;
 
     SdPage* mpPage;
-    mutable ::osl::Mutex m_aMutex;
     RealPoint2D m_Position;
     RealSize2D m_Size;
     OUString m_Author;
diff --git a/sd/source/ui/inc/unmodpg.hxx b/sd/source/ui/inc/unmodpg.hxx
index c48482a..6647406 100644
--- a/sd/source/ui/inc/unmodpg.hxx
+++ b/sd/source/ui/inc/unmodpg.hxx
@@ -38,8 +38,6 @@ class ModifyPageUndoAction : public SdUndoAction
     bool        mbOldBckgrndObjsVisible;
     bool        mbNewBckgrndObjsVisible;
 
-    OUString        maComment;
-
 public:
     ModifyPageUndoAction(
         SdDrawDocument*         pTheDoc,
@@ -52,8 +50,6 @@ public:
     virtual ~ModifyPageUndoAction() override;
     virtual void Undo() override;
     virtual void Redo() override;
-
-    virtual OUString GetComment() const override;
 };
 
 class RenameLayoutTemplateUndoAction : public SdUndoAction
diff --git a/sd/source/ui/view/unmodpg.cxx b/sd/source/ui/view/unmodpg.cxx
index 7da1392..ac3176c 100644
--- a/sd/source/ui/view/unmodpg.cxx
+++ b/sd/source/ui/view/unmodpg.cxx
@@ -70,7 +70,7 @@ ModifyPageUndoAction::ModifyPageUndoAction(
         mbOldBckgrndObjsVisible = false;
     }
 
-    maComment = SD_RESSTR(STR_UNDO_MODIFY_PAGE);
+    SetComment( SD_RESSTR(STR_UNDO_MODIFY_PAGE) );
 }
 
 void ModifyPageUndoAction::Undo()
@@ -163,11 +163,6 @@ ModifyPageUndoAction::~ModifyPageUndoAction()
 {
 }
 
-OUString ModifyPageUndoAction::GetComment() const
-{
-    return maComment;
-}
-
 RenameLayoutTemplateUndoAction::RenameLayoutTemplateUndoAction(
     SdDrawDocument* pDocument,
     const OUString& rOldLayoutName,
diff --git a/solenv/CompilerTest_compilerplugins_clang.mk b/solenv/CompilerTest_compilerplugins_clang.mk
index b0ed916..ae1a07f 100644
--- a/solenv/CompilerTest_compilerplugins_clang.mk
+++ b/solenv/CompilerTest_compilerplugins_clang.mk
@@ -12,6 +12,7 @@ $(eval $(call gb_CompilerTest_CompilerTest,compilerplugins_clang))
 $(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
     compilerplugins/clang/test/salbool \
     compilerplugins/clang/test/finalprotected \
+    compilerplugins/clang/test/datamembershadow \
 ))
 
 # vim: set noet sw=4 ts=4:


More information about the Libreoffice-commits mailing list