From 4c91b89d8ce9c34179f31854dc88bd0a9fa84cba Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Tue, 28 Aug 2018 15:09:33 +0200 Subject: 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 --- compilerplugins/clang/stringbuffer.cxx | 67 ++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 compilerplugins/clang/stringbuffer.cxx (limited to 'compilerplugins/clang/stringbuffer.cxx') diff --git a/compilerplugins/clang/stringbuffer.cxx b/compilerplugins/clang/stringbuffer.cxx new file mode 100644 index 000000000000..154a460a0007 --- /dev/null +++ b/compilerplugins/clang/stringbuffer.cxx @@ -0,0 +1,67 @@ +/* -*- 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 + +/** Look for appending result of adding OUString/OString to OUStringBuffer + */ +namespace +{ +class StringBuffer : public loplugin::FilteringPlugin +{ +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(memberCallExpr->getArg(0)); + if (!matTemp) + return true; + if (!isa(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 X("stringbuffer"); + +} // namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit