make loplugin constantparam smarter about string params

Change-Id: Id3df69b38fd35f46735246a6d307a89aa10d4294
Reviewed-on: https://gerrit.libreoffice.org/37426
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin
2017-05-09 12:14:32 +02:00
parent 3a9854a929
commit 12191a4f30
56 changed files with 117 additions and 146 deletions

View File

@@ -14,6 +14,7 @@
#include "plugin.hxx"
#include "compat.hxx"
#include "check.hxx"
/*
Find params on methods where the param is only ever passed as a single constant value.
@@ -59,6 +60,14 @@ public:
virtual void run() override
{
// ignore some files that make clang crash inside EvaluateAsInt
std::string fn( compiler.getSourceManager().getFileEntryForID(
compiler.getSourceManager().getMainFileID())->getName() );
normalizeDotDotInFilePath(fn);
if (fn == SRCDIR "/basegfx/source/matrix/b2dhommatrix.cxx"
|| fn == SRCDIR "/basegfx/source/matrix/b3dhommatrix.cxx")
return;
TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
// dump all our output in one write call - this is to try and limit IO "crosstalk" between multiple processes
@@ -169,10 +178,19 @@ std::string ConstantParam::getCallValue(const Expr* arg)
if (isa<MaterializeTemporaryExpr>(arg))
{
const CXXBindTemporaryExpr* strippedArg = dyn_cast_or_null<CXXBindTemporaryExpr>(arg->IgnoreParenCasts());
if (strippedArg && isa<CXXTemporaryObjectExpr>(strippedArg->getSubExpr())
&& dyn_cast<CXXTemporaryObjectExpr>(strippedArg->getSubExpr())->getNumArgs() == 0)
if (strippedArg)
{
return "defaultConstruct";
auto temp = dyn_cast<CXXTemporaryObjectExpr>(strippedArg->getSubExpr());
if (temp->getNumArgs() == 0)
{
if (loplugin::TypeCheck(temp->getType()).Class("OUString").Namespace("rtl").GlobalNamespace()) {
return "\"\"";
}
if (loplugin::TypeCheck(temp->getType()).Class("OString").Namespace("rtl").GlobalNamespace()) {
return "\"\"";
}
return "defaultConstruct";
}
}
}
@@ -192,6 +210,14 @@ std::string ConstantParam::getCallValue(const Expr* arg)
std::replace( s.begin(), s.end(), '\r', ' ');
std::replace( s.begin(), s.end(), '\n', ' ');
std::replace( s.begin(), s.end(), '\t', ' ');
// now normalize the value. For some params, like OUString, we can pass it as OUString() or "" and they are the same thing
if (s == "OUString()")
s = "\"\"";
else if (s == "OString()")
s = "\"\"";
else if (s == "aEmptyOUStr")
s = "\"\"";
return s;
}