/* -*- 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/.
*/
#ifndef LO_CLANG_SHARED_PLUGINS
// Find classes deriving from other classes with virtual member functions annotated with // SAL_LOPLUGIN_ANNOTATE("mustoverride"), but where the derived class fails to directly override // them.
#include <set>
#include"plugin.hxx"
namespace
{ void findMustOverride(CXXRecordDecl const* decl, std::set<CXXMethodDecl const*>* mustOverride)
{ for (autoconst& base : decl->bases())
{ autoconst d = base.getType()->getAsCXXRecordDecl(); if (d == nullptr)
{ continue;
}
findMustOverride(d, mustOverride); for (autoconst meth : d->methods())
{ if (!meth->isVirtual())
{ continue;
} for (autoconst attr : meth->specific_attrs<AnnotateAttr>())
{ if (attr->getAnnotation() == "loplugin:mustoverride")
{
mustOverride->insert(meth); break;
}
}
}
}
}
class MustOverride : public loplugin::FilteringPlugin<MustOverride>
{ public: explicit MustOverride(loplugin::InstantiationData const& data)
: FilteringPlugin(data)
{
}
bool VisitCXXRecordDecl(CXXRecordDecl const* decl)
{ if (ignoreLocation(decl))
{ returntrue;
} if (!decl->isThisDeclarationADefinition())
{ returntrue;
} if (!decl->isPolymorphic())
{ returntrue;
}
std::set<CXXMethodDecl const*> mustOverride;
findMustOverride(decl, &mustOverride); for (autoconst meth : mustOverride)
{ if (meth->getCorrespondingMethodDeclaredInClass(decl) != nullptr)
{ continue;
}
report(DiagnosticsEngine::Warning, "%0 does not override %1 from %2",
decl->getLocation())
<< decl << meth << meth->getParent() << decl->getSourceRange();
report(DiagnosticsEngine::Note, "declared here", meth->getLocation())
<< meth->getSourceRange();
} returntrue;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.