summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2018-08-28 15:09:33 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2018-08-29 09:05:18 +0200
commit4c91b89d8ce9c34179f31854dc88bd0a9fa84cba (patch)
tree1fe9cc9db455779d33c24320fedc1e25888b3e5c /compilerplugins
parenta1f31211920bfae1a21ea375fa5280c9c6595e15 (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.cxx67
-rw-r--r--compilerplugins/clang/test/stringbuffer.cxx22
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: */