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>
76 lines
2.2 KiB
C++
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: */
|