office-gobmx/compilerplugins/clang/stringbuffer.cxx
Noel Grandin 4c91b89d8c new loplugin:oustringbuffer
look for places where we are appending the temporary result of adding
strings together, to an OUStringBuffer, where we could rather call
append repeatedly and avoid the temporary creation

Change-Id: I481435124291ac7fb54b91a78344a9fe5b379a82
Reviewed-on: https://gerrit.libreoffice.org/59708
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2018-08-29 09:05:18 +02:00

67 lines
2 KiB
C++

/* -*- 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 "check.hxx"
#include "plugin.hxx"
#include <vector>
/** Look for appending result of adding OUString/OString to OUStringBuffer
*/
namespace
{
class StringBuffer : public loplugin::FilteringPlugin<StringBuffer>
{
public:
explicit StringBuffer(loplugin::InstantiationData const& rData)
: FilteringPlugin(rData)
{
}
void run() override;
bool VisitCXXMemberCallExpr(CXXMemberCallExpr const*);
};
void StringBuffer::run()
{
StringRef fn(handler.getMainFileName());
if (loplugin::hasPathnamePrefix(fn, SRCDIR "/sal/qa/"))
return;
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
}
bool StringBuffer::VisitCXXMemberCallExpr(CXXMemberCallExpr const* memberCallExpr)
{
if (ignoreLocation(memberCallExpr))
return true;
if (!loplugin::DeclCheck(memberCallExpr->getRecordDecl())
.Class("OUStringBuffer")
.Namespace("rtl")
.GlobalNamespace())
return true;
if (!memberCallExpr->getMethodDecl()->getIdentifier())
return true;
if (memberCallExpr->getMethodDecl()->getName() != "append")
return true;
auto matTemp = dyn_cast<MaterializeTemporaryExpr>(memberCallExpr->getArg(0));
if (!matTemp)
return true;
if (!isa<CXXOperatorCallExpr>(matTemp->GetTemporaryExpr()))
return true;
report(DiagnosticsEngine::Warning,
"appending added result of OUString to OUStringBuffer, rather do .append(x).append(y)",
compat::getBeginLoc(memberCallExpr))
<< memberCallExpr->getSourceRange();
return true;
}
loplugin::Plugin::Registration<StringBuffer> X("stringbuffer");
} // namespace
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */