diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-08-28 15:09:33 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2018-08-29 09:05:18 +0200 |
commit | 4c91b89d8ce9c34179f31854dc88bd0a9fa84cba (patch) | |
tree | 1fe9cc9db455779d33c24320fedc1e25888b3e5c /compilerplugins | |
parent | a1f31211920bfae1a21ea375fa5280c9c6595e15 (diff) |
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>
Diffstat (limited to 'compilerplugins')
-rw-r--r-- | compilerplugins/clang/stringbuffer.cxx | 67 | ||||
-rw-r--r-- | compilerplugins/clang/test/stringbuffer.cxx | 22 |
2 files changed, 89 insertions, 0 deletions
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 <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: */ diff --git a/compilerplugins/clang/test/stringbuffer.cxx b/compilerplugins/clang/test/stringbuffer.cxx new file mode 100644 index 000000000000..929eb478275d --- /dev/null +++ b/compilerplugins/clang/test/stringbuffer.cxx @@ -0,0 +1,22 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * 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 "sal/config.h" +#include "rtl/string.hxx" +#include "rtl/ustring.hxx" +#include "rtl/ustrbuf.hxx" + +void func2(OUString s1, OUString s2) +{ + OUStringBuffer buf; + buf.append(s1 + s2); + // expected-error@-1 {{appending added result of OUString to OUStringBuffer, rather do .append(x).append(y) [loplugin:stringbuffer]}} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |