Files
libreoffice/compilerplugins/clang/stringbuffer.cxx
Noel Grandin 6e1cb2e9dd disable stringbuffer plugin
as pointed out by mike kaganski:

the 'aCellStr + u"\x0001"' expression gives an OUStringConcat which
holds the references to the strings and doesn't allocate any memory; the
OUStringBuffer has a dedicated overload of append() for the
OUStringConcat, which allocates only once for the combined concat length
and then copies everything from the concat, instead of doing the append
twice for each element... why the strange warning for a more efficient
method?

Change-Id: I6492e99c335e2375cfe78547a87b3079a86890f0
Reviewed-on: https://gerrit.libreoffice.org/79036
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2019-09-17 10:13:47 +02:00

76 lines
2.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/.
*/
#ifndef LO_CLANG_SHARED_PLUGINS
#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)
{
}
bool preRun() override
{
StringRef fn(handler.getMainFileName());
return !loplugin::hasPathnamePrefix(fn, SRCDIR "/sal/qa/");
}
void run() override
{
if (preRun())
{
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
}
}
bool VisitCXXMemberCallExpr(CXXMemberCallExpr const*);
};
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> stringbuffer("stringbuffer", false);
} // namespace
#endif // LO_CLANG_SHARED_PLUGINS
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */