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 <n...@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()
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to