# Cppcheck report - LibreOffice: compilerplugins/clang/store/removeforwardstringdecl.cxx

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78

    /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
    /*
     * This file is part of the LibreOffice project.
     *
     * Based on LLVM/Clang.
     *
     * This file is distributed under the University of Illinois Open Source
     * License. See LICENSE.TXT for details.
     *
     */

    #include "removeforwardstringdecl.hxx"

    /*
    This is a rewriter.

    Remove all forward declarations of rtl strings. I.e. 'namespace rtl { class OUString; }' etc.
    */

    namespace loplugin
    {

    RemoveForwardStringDecl::RemoveForwardStringDecl( CompilerInstance& compiler, Rewriter& rewriter )
        : RewritePlugin( compiler, rewriter )
        {
        }

    void RemoveForwardStringDecl::run()
        {
        TraverseDecl( compiler.getASTContext().getTranslationUnitDecl());
        }

    bool RemoveForwardStringDecl::VisitNamespaceDecl( const NamespaceDecl* declaration )<--- The function 'VisitNamespaceDecl' is never used.
        {
        if( ignoreLocation( declaration ))
            return true;
        if( declaration->getQualifiedNameAsString() != "rtl" )
            return true;
        bool canRemove = true;
        for( NamespaceDecl::decl_iterator it = declaration->decls_begin();
             it != declaration->decls_end();
             ++it )
            {
            if( *it != NULL )
                {
                if( !tryRemoveStringForwardDecl( *it ))
                    canRemove = false;
                }
            }
        if( canRemove ) // contained only forward decls that we removed
            removeText( declaration->getSourceRange(), RemoveLineIfEmpty );
        return true;
        }

    bool RemoveForwardStringDecl::tryRemoveStringForwardDecl( const Decl* decl )
        {
        const CXXRecordDecl* classdecl = dyn_cast< CXXRecordDecl >( decl );
        if( classdecl == NULL )
            return false;
        if( !classdecl->isFreeStanding() || classdecl->isCompleteDefinition())
            return false; // not a simple forward declaration
        if( classdecl->getName() == "OString" || classdecl->getName() == "OUString"
            || classdecl->getName() == "OStringBuffer" || classdecl->getName() == "OUStringBuffer"
            || classdecl->getName() == "OStringHash" || classdecl->getName() == "OUStringHash"
            || classdecl->getName() == "OStringLiteral" || classdecl->getName() == "OUStringLiteral" )
            {
            removeText( SourceRange( classdecl->getOuterLocStart(), classdecl->getLocEnd()),
                RemoveLineIfEmpty | RemoveWholeStatement );
            return true;
            }
        return false;
        }

    static Plugin::Registration< RemoveForwardStringDecl > X( "removeforwardstringdecl" );

    } // namespace

    /* vim:set shiftwidth=4 softtabstop=4 expandtab: */