[Libreoffice-commits] core.git: compilerplugins/clang vcl/source

Noel Grandin noel at peralex.com
Wed May 18 10:26:51 UTC 2016


 compilerplugins/clang/vclwidgets.cxx |   38 ++++++++++++++++++-----------------
 vcl/source/outdev/outdev.cxx         |    2 +
 2 files changed, 22 insertions(+), 18 deletions(-)

New commits:
commit 27fd3c4e66c079a0b19a5ff0ff1bf25caaa9b637
Author: Noel Grandin <noel at peralex.com>
Date:   Wed May 18 12:25:54 2016 +0200

    update vclwidgets loplugin to handle VclReferenceBase
    
    Change-Id: I447cdb8c65d880b3c5ff28b35cefdc56ff784852

diff --git a/compilerplugins/clang/vclwidgets.cxx b/compilerplugins/clang/vclwidgets.cxx
index b368b18..212dcb5 100644
--- a/compilerplugins/clang/vclwidgets.cxx
+++ b/compilerplugins/clang/vclwidgets.cxx
@@ -57,6 +57,8 @@ static bool startsWith(const std::string& s, const char* other)
     return s.compare(0, strlen(other), other) == 0;
 }
 
+#define BASE_REF_COUNTED_CLASS "VclReferenceBase"
+
 bool BaseCheckNotWindowSubclass(
     const CXXRecordDecl *BaseDefinition
 #if CLANG_VERSION < 30800
@@ -64,7 +66,7 @@ bool BaseCheckNotWindowSubclass(
 #endif
     )
 {
-    if (BaseDefinition && BaseDefinition->getQualifiedNameAsString() == "OutputDevice") {
+    if (BaseDefinition && BaseDefinition->getQualifiedNameAsString() == BASE_REF_COUNTED_CLASS) {
         return false;
     }
     return true;
@@ -73,7 +75,7 @@ bool BaseCheckNotWindowSubclass(
 bool isDerivedFromWindow(const CXXRecordDecl *decl) {
     if (!decl)
         return false;
-    if (decl->getQualifiedNameAsString() == "OutputDevice")
+    if (decl->getQualifiedNameAsString() == BASE_REF_COUNTED_CLASS)
         return true;
     if (!decl->hasDefinition()) {
         return false;
@@ -155,8 +157,8 @@ bool VCLWidgets::VisitCXXDestructorDecl(const CXXDestructorDecl* pCXXDestructorD
         return true;
     }
     const CXXRecordDecl * pRecordDecl = pCXXDestructorDecl->getParent();
-    // ignore OutputDevice class
-    if (pRecordDecl->getQualifiedNameAsString() == "OutputDevice") {
+    // ignore
+    if (pRecordDecl->getQualifiedNameAsString() == BASE_REF_COUNTED_CLASS) {
         return true;
     }
     // check if this class is derived from Window
@@ -193,12 +195,12 @@ bool VCLWidgets::VisitCXXDestructorDecl(const CXXDestructorDecl* pCXXDestructorD
     if (bFoundVclPtrField && pCompoundStatement && pCompoundStatement->size() == 0) {
         report(
             DiagnosticsEngine::Warning,
-            "OutputDevice subclass with VclPtr field must call disposeOnce() from its destructor",
+            BASE_REF_COUNTED_CLASS " subclass with VclPtr field must call disposeOnce() from its destructor",
             pCXXDestructorDecl->getLocStart())
           << pCXXDestructorDecl->getSourceRange();
         return true;
     }
-    // check that the destructor for a OutputDevice subclass does nothing except call into the disposeOnce() method
+    // check that the destructor for a BASE_REF_COUNTED_CLASS subclass does nothing except call into the disposeOnce() method
     bool bOk = false;
     if (pCompoundStatement) {
         bool bFoundDisposeOnce = false;
@@ -229,7 +231,7 @@ bool VCLWidgets::VisitCXXDestructorDecl(const CXXDestructorDecl* pCXXDestructorD
         {
             report(
                 DiagnosticsEngine::Warning,
-                "OutputDevice subclass should have nothing in its destructor but a call to disposeOnce()",
+                BASE_REF_COUNTED_CLASS " subclass should have nothing in its destructor but a call to disposeOnce()",
                 pCXXDestructorDecl->getLocStart())
               << pCXXDestructorDecl->getSourceRange();
         }
@@ -249,7 +251,7 @@ bool VCLWidgets::VisitVarDecl(const VarDecl * pVarDecl) {
     if (containsWindowSubclass(pVarDecl->getType())) {
         report(
             DiagnosticsEngine::Warning,
-            "OutputDevice subclass %0 should be wrapped in VclPtr",
+            BASE_REF_COUNTED_CLASS " subclass %0 should be wrapped in VclPtr",
             pVarDecl->getLocation())
             << pVarDecl->getType() << pVarDecl->getSourceRange();
         return true;
@@ -267,7 +269,7 @@ bool VCLWidgets::VisitVarDecl(const VarDecl * pVarDecl) {
     if (isDerivedFromWindow(recordDecl)) {
         report(
             DiagnosticsEngine::Warning,
-            "OutputDevice subclass allocated on stack, should be allocated via VclPtr or via *",
+            BASE_REF_COUNTED_CLASS " subclass allocated on stack, should be allocated via VclPtr or via *",
             pVarDecl->getLocation())
           << pVarDecl->getSourceRange();
     }
@@ -289,7 +291,7 @@ bool VCLWidgets::VisitFieldDecl(const FieldDecl * fieldDecl) {
                  pParentRecordDecl->getQualifiedNameAsString() == "ScHFEditPage"))) {
             report(
                 DiagnosticsEngine::Warning,
-                "OutputDevice subclass %0 declared as a pointer member, should be wrapped in VclPtr",
+                BASE_REF_COUNTED_CLASS " subclass %0 declared as a pointer member, should be wrapped in VclPtr",
                 fieldDecl->getLocation())
                 << fieldDecl->getType() << fieldDecl->getSourceRange();
             return true;
@@ -308,7 +310,7 @@ bool VCLWidgets::VisitFieldDecl(const FieldDecl * fieldDecl) {
     if (isDerivedFromWindow(recordDecl)) {
         report(
             DiagnosticsEngine::Warning,
-            "OutputDevice subclass allocated as a class member, should be allocated via VclPtr",
+            BASE_REF_COUNTED_CLASS " subclass allocated as a class member, should be allocated via VclPtr",
             fieldDecl->getLocation())
           << fieldDecl->getSourceRange();
     }
@@ -329,14 +331,14 @@ bool VCLWidgets::VisitFieldDecl(const FieldDecl * fieldDecl) {
         if (!bFoundDispose) {
             report(
                 DiagnosticsEngine::Warning,
-                "OutputDevice subclass with a VclPtr field MUST override dispose() (and call its superclass dispose() as the last thing it does)",
+                BASE_REF_COUNTED_CLASS " subclass with a VclPtr field MUST override dispose() (and call its superclass dispose() as the last thing it does)",
                 fieldDecl->getLocation())
               << fieldDecl->getSourceRange();
         }
         if (!pParentRecordDecl->hasUserDeclaredDestructor()) {
             report(
                 DiagnosticsEngine::Warning,
-                "OutputDevice subclass with a VclPtr field MUST have a user-provided destructor (that calls disposeOnce())",
+                BASE_REF_COUNTED_CLASS " subclass with a VclPtr field MUST have a user-provided destructor (that calls disposeOnce())",
                 fieldDecl->getLocation())
               << fieldDecl->getSourceRange();
         }
@@ -378,9 +380,9 @@ bool VCLWidgets::VisitFunctionDecl( const FunctionDecl* functionDecl )
         && pMethodDecl->getParent()->getQualifiedNameAsString() == "VclPtr") {
         return true;
     }
-    // ignore the OutputDevice::dispose() method
+    // ignore the BASE_REF_COUNTED_CLASS::dispose() method
     if (pMethodDecl
-        && pMethodDecl->getParent()->getQualifiedNameAsString() == "OutputDevice") {
+        && pMethodDecl->getParent()->getQualifiedNameAsString() == BASE_REF_COUNTED_CLASS) {
         return true;
     }
     if (functionDecl->hasBody() && pMethodDecl && isDerivedFromWindow(pMethodDecl->getParent())) {
@@ -389,7 +391,7 @@ bool VCLWidgets::VisitFunctionDecl( const FunctionDecl* functionDecl )
             if (!isDisposeCallingSuperclassDispose(pMethodDecl)) {
                 report(
                     DiagnosticsEngine::Warning,
-                    "OutputDevice subclass dispose() function MUST call dispose() of its superclass as the last thing it does",
+                    BASE_REF_COUNTED_CLASS " subclass dispose() function MUST call dispose() of its superclass as the last thing it does",
                     functionDecl->getLocStart())
                   << functionDecl->getSourceRange();
            }
@@ -409,11 +411,11 @@ bool VCLWidgets::VisitCXXDeleteExpr(const CXXDeleteExpr *pCXXDeleteExpr)
         SourceLocation spellingLocation = compiler.getSourceManager().getSpellingLoc(
                               pCXXDeleteExpr->getLocStart());
         StringRef filename = compiler.getSourceManager().getFilename(spellingLocation);
-        if ( !(filename.startswith(SRCDIR "/include/vcl/outdev.hxx")))
+        if ( !(filename.startswith(SRCDIR "/include/vcl/vclreferencebase.hxx")))
         {
             report(
                 DiagnosticsEngine::Warning,
-                "calling delete on instance of OutputDevice subclass, must rather call disposeAndClear()",
+                "calling delete on instance of " BASE_REF_COUNTED_CLASS " subclass, must rather call disposeAndClear()",
                 pCXXDeleteExpr->getLocStart())
               << pCXXDeleteExpr->getSourceRange();
         }
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 6c9991b..5947732 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -226,6 +226,8 @@ void OutputDevice::dispose()
     }
 
     mpAlphaVDev.disposeAndClear();
+
+    VclReferenceBase::dispose();
 }
 
 SalGraphics* OutputDevice::GetGraphics()


More information about the Libreoffice-commits mailing list