summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compilerplugins/clang/test/xmlimport.cxx54
-rw-r--r--compilerplugins/clang/xmlimport.cxx139
-rw-r--r--dbaccess/source/filter/xml/xmlfilter.cxx4
-rw-r--r--editeng/source/misc/SvXMLAutoCorrectImport.hxx6
-rw-r--r--include/xmloff/XMLCharContext.hxx3
-rw-r--r--linguistic/source/convdicxml.cxx3
-rw-r--r--reportdesign/source/filter/xml/xmlColumn.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlCondPrtExpr.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlControlProperty.hxx4
-rw-r--r--reportdesign/source/filter/xml/xmlFormatCondition.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlFunction.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlGroup.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlMasterFields.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlReportElement.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlSection.hxx3
-rw-r--r--reportdesign/source/filter/xml/xmlTable.hxx2
-rw-r--r--solenv/CompilerTest_compilerplugins_clang.mk1
-rw-r--r--sw/source/filter/xml/xmlimp.cxx4
-rw-r--r--sw/source/uibase/config/StoredChapterNumbering.cxx4
-rw-r--r--xmloff/source/text/XMLAutoTextContainerEventImport.hxx3
20 files changed, 251 insertions, 0 deletions
diff --git a/compilerplugins/clang/test/xmlimport.cxx b/compilerplugins/clang/test/xmlimport.cxx
new file mode 100644
index 000000000000..965d4936e41c
--- /dev/null
+++ b/compilerplugins/clang/test/xmlimport.cxx
@@ -0,0 +1,54 @@
+/* -*- 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"
+
+// Cannot include this, makes clang crash
+//#include "xmloff/xmlimp.hxx"
+
+class SvXMLImportContext
+{
+public:
+ virtual ~SvXMLImportContext() {}
+
+ virtual void createFastChildContext() {}
+ virtual void startFastElement() {}
+ virtual void endFastElement() {}
+};
+
+class Test1 : public SvXMLImportContext
+{
+public:
+ // expected-error@+1 {{must override startFastElement too [loplugin:xmlimport]}}
+ virtual void createFastChildContext() override;
+};
+
+class Test2 : public SvXMLImportContext
+{
+public:
+ // no warning expected
+ virtual void createFastChildContext() override;
+ virtual void startFastElement() override {}
+};
+
+class Test3 : public Test2
+{
+public:
+ // no warning expected
+ virtual void createFastChildContext() override;
+};
+
+class Test4 : public SvXMLImportContext
+{
+public:
+ // expected-error@+1 {{must override startFastElement too [loplugin:xmlimport]}}
+ virtual void endFastElement() override;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/compilerplugins/clang/xmlimport.cxx b/compilerplugins/clang/xmlimport.cxx
new file mode 100644
index 000000000000..bdb41f616859
--- /dev/null
+++ b/compilerplugins/clang/xmlimport.cxx
@@ -0,0 +1,139 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * Based on LLVM/Clang.
+ *
+ * This file is distributed under the University of Illinois Open Source
+ * License. See LICENSE.TXT for details.
+ *
+ */
+#ifndef LO_CLANG_SHARED_PLUGINS
+
+#include "compat.hxx"
+#include "plugin.hxx"
+#include "check.hxx"
+#include <iostream>
+#include "clang/AST/CXXInheritance.h"
+
+/*
+ * This is a compile-time checker.
+ *
+ * Check that when we override SvXmlImportContext, and we override createFastChildContext,
+ * we have also overridden startFastElement, or the fast-parser stuff will not work
+ * correctly.
+*/
+
+namespace
+{
+class XmlImport : public loplugin::FilteringPlugin<XmlImport>
+{
+public:
+ explicit XmlImport(loplugin::InstantiationData const& data)
+ : FilteringPlugin(data)
+ {
+ }
+
+ bool preRun() override
+ {
+ // std::string fn(handler.getMainFileName());
+ // loplugin::normalizeDotDotInFilePath(fn);
+ return true;
+ }
+
+ void run() override
+ {
+ if (preRun())
+ {
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+ }
+ }
+
+ bool VisitCXXMethodDecl(const CXXMethodDecl*);
+};
+
+static bool containsStartFastElementMethod(const CXXRecordDecl* cxxRecordDecl,
+ bool& rbFoundImportContext)
+{
+ auto dc = loplugin::DeclCheck(cxxRecordDecl);
+ if (dc.Class("SvXMLImportContext"))
+ {
+ rbFoundImportContext = true;
+ return false;
+ }
+ if (dc.Class("XFastContextHandler"))
+ return false;
+ for (auto it = cxxRecordDecl->method_begin(); it != cxxRecordDecl->method_end(); ++it)
+ {
+ auto i = *it;
+ if (i->getIdentifier() && i->getName() == "startFastElement")
+ {
+ // i->dump();
+ return true;
+ }
+ }
+ return false;
+}
+bool XmlImport::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
+{
+ auto beginLoc = compat::getBeginLoc(methodDecl);
+ if (!beginLoc.isValid() || ignoreLocation(beginLoc))
+ return true;
+
+ auto cxxRecordDecl = methodDecl->getParent();
+ if (!cxxRecordDecl || !cxxRecordDecl->getIdentifier())
+ return true;
+ auto className = cxxRecordDecl->getName();
+ if (className == "OOXMLFactory") // writerfilter
+ return true;
+ if (className == "SvXMLLegacyToFastDocHandler" || className == "ImportDocumentHandler"
+ || className == "ExportDocumentHandler") // reportdesign
+ return true;
+ if (className == "XMLEmbeddedObjectExportFilter" || className == "XMLBasicExportFilter"
+ || className == "XMLTransformerBase" || className == "SvXMLMetaExport") // xmloff
+ return true;
+ if (!methodDecl->getIdentifier())
+ return true;
+ if (!(methodDecl->getName() == "createFastChildContext" || methodDecl->getName() == "characters"
+ || methodDecl->getName() == "endFastElement"))
+ return true;
+ if (loplugin::DeclCheck(cxxRecordDecl).Class("SvXMLImportContext"))
+ return true;
+
+ bool foundImportContext = false;
+ if (containsStartFastElementMethod(cxxRecordDecl, foundImportContext))
+ return true;
+
+ bool foundStartFastElement = false;
+ CXXBasePaths aPaths;
+ cxxRecordDecl->lookupInBases(
+ [&](const CXXBaseSpecifier* Specifier, CXXBasePath & /*Path*/) -> bool {
+ if (!Specifier->getType().getTypePtr())
+ return false;
+ const CXXRecordDecl* baseCXXRecordDecl = Specifier->getType()->getAsCXXRecordDecl();
+ if (!baseCXXRecordDecl)
+ return false;
+ if (baseCXXRecordDecl->isInvalidDecl())
+ return false;
+ foundStartFastElement
+ |= containsStartFastElementMethod(baseCXXRecordDecl, foundImportContext);
+ return false;
+ },
+ aPaths);
+
+ if (foundStartFastElement || !foundImportContext)
+ return true;
+
+ report(DiagnosticsEngine::Warning, "must override startFastElement too",
+ compat::getBeginLoc(methodDecl))
+ << methodDecl->getSourceRange();
+ return true;
+}
+
+loplugin::Plugin::Registration<XmlImport> xmlimport("xmlimport");
+
+} // namespace
+
+#endif // LO_CLANG_SHARED_PLUGINS
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/dbaccess/source/filter/xml/xmlfilter.cxx b/dbaccess/source/filter/xml/xmlfilter.cxx
index eb0e3d505202..4024bec4cfb6 100644
--- a/dbaccess/source/filter/xml/xmlfilter.cxx
+++ b/dbaccess/source/filter/xml/xmlfilter.cxx
@@ -426,6 +426,10 @@ public:
{
}
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
+
virtual uno::Reference< xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList >& /*xAttrList*/ ) override
{
diff --git a/editeng/source/misc/SvXMLAutoCorrectImport.hxx b/editeng/source/misc/SvXMLAutoCorrectImport.hxx
index f61cd036b526..c45180608390 100644
--- a/editeng/source/misc/SvXMLAutoCorrectImport.hxx
+++ b/editeng/source/misc/SvXMLAutoCorrectImport.hxx
@@ -97,6 +97,9 @@ private:
public:
SvXMLExceptionListContext ( SvXMLExceptionListImport& rImport );
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual css::uno::Reference<XFastContextHandler> SAL_CALL createFastChildContext( sal_Int32 Element,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
@@ -109,6 +112,9 @@ public:
SvXMLExceptionContext ( SvXMLExceptionListImport& rImport,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList );
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual ~SvXMLExceptionContext() override;
};
diff --git a/include/xmloff/XMLCharContext.hxx b/include/xmloff/XMLCharContext.hxx
index 4883a39f7922..9cdfa63402be 100644
--- a/include/xmloff/XMLCharContext.hxx
+++ b/include/xmloff/XMLCharContext.hxx
@@ -59,6 +59,9 @@ public:
virtual ~XMLCharContext() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
// EndElement is called before a context will be destructed, but
// after an elements context has been parsed. It may be used for actions
// that require virtual methods. The default is to do nothing.
diff --git a/linguistic/source/convdicxml.cxx b/linguistic/source/convdicxml.cxx
index ecae4e48548e..fe5ff97105aa 100644
--- a/linguistic/source/convdicxml.cxx
+++ b/linguistic/source/convdicxml.cxx
@@ -85,6 +85,9 @@ public:
}
// SvXMLImportContext
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual void SAL_CALL characters( const OUString &rChars ) override;
virtual css::uno::Reference<XFastContextHandler> SAL_CALL createFastChildContext(
sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
diff --git a/reportdesign/source/filter/xml/xmlColumn.hxx b/reportdesign/source/filter/xml/xmlColumn.hxx
index 16e739e9bca1..cd87a9cbebb9 100644
--- a/reportdesign/source/filter/xml/xmlColumn.hxx
+++ b/reportdesign/source/filter/xml/xmlColumn.hxx
@@ -42,6 +42,9 @@ namespace rptxml
);
virtual ~OXMLRowColumn() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
diff --git a/reportdesign/source/filter/xml/xmlCondPrtExpr.hxx b/reportdesign/source/filter/xml/xmlCondPrtExpr.hxx
index 426188efcc63..7842e95c71d7 100644
--- a/reportdesign/source/filter/xml/xmlCondPrtExpr.hxx
+++ b/reportdesign/source/filter/xml/xmlCondPrtExpr.hxx
@@ -37,6 +37,9 @@ namespace rptxml
,const css::uno::Reference< css::beans::XPropertySet >& _xComponent);
virtual ~OXMLCondPrtExpr() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
// This method is called for all characters that are contained in the
// current element. The default is to ignore them.
virtual void SAL_CALL characters( const OUString& rChars ) override;
diff --git a/reportdesign/source/filter/xml/xmlControlProperty.hxx b/reportdesign/source/filter/xml/xmlControlProperty.hxx
index 15379d27b720..b1b2c051aba7 100644
--- a/reportdesign/source/filter/xml/xmlControlProperty.hxx
+++ b/reportdesign/source/filter/xml/xmlControlProperty.hxx
@@ -53,6 +53,10 @@ namespace rptxml
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
+
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
virtual void SAL_CALL characters( const OUString& rChars ) override;
diff --git a/reportdesign/source/filter/xml/xmlFormatCondition.hxx b/reportdesign/source/filter/xml/xmlFormatCondition.hxx
index 56bd5602fb24..a4594b495c7a 100644
--- a/reportdesign/source/filter/xml/xmlFormatCondition.hxx
+++ b/reportdesign/source/filter/xml/xmlFormatCondition.hxx
@@ -39,6 +39,9 @@ namespace rptxml
,const css::uno::Reference< css::report::XFormatCondition >& _xComponent
);
virtual ~OXMLFormatCondition() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
};
diff --git a/reportdesign/source/filter/xml/xmlFunction.hxx b/reportdesign/source/filter/xml/xmlFunction.hxx
index da3f6ac118b6..c58ed9738aab 100644
--- a/reportdesign/source/filter/xml/xmlFunction.hxx
+++ b/reportdesign/source/filter/xml/xmlFunction.hxx
@@ -47,6 +47,9 @@ namespace rptxml
);
virtual ~OXMLFunction() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
};
diff --git a/reportdesign/source/filter/xml/xmlGroup.hxx b/reportdesign/source/filter/xml/xmlGroup.hxx
index ea1b97602aaf..70eeb22db992 100644
--- a/reportdesign/source/filter/xml/xmlGroup.hxx
+++ b/reportdesign/source/filter/xml/xmlGroup.hxx
@@ -42,6 +42,9 @@ namespace rptxml
);
virtual ~OXMLGroup() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
diff --git a/reportdesign/source/filter/xml/xmlMasterFields.hxx b/reportdesign/source/filter/xml/xmlMasterFields.hxx
index e8e212827e60..5dbb36987bb0 100644
--- a/reportdesign/source/filter/xml/xmlMasterFields.hxx
+++ b/reportdesign/source/filter/xml/xmlMasterFields.hxx
@@ -36,6 +36,9 @@ namespace rptxml
,IMasterDetailFieds* _pReport);
virtual ~OXMLMasterFields() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
};
diff --git a/reportdesign/source/filter/xml/xmlReportElement.hxx b/reportdesign/source/filter/xml/xmlReportElement.hxx
index 5f64dbe732e8..dbf5d180c4d0 100644
--- a/reportdesign/source/filter/xml/xmlReportElement.hxx
+++ b/reportdesign/source/filter/xml/xmlReportElement.hxx
@@ -38,6 +38,9 @@ namespace rptxml
,const css::uno::Reference< css::report::XReportControlModel >& _xComponent);
virtual ~OXMLReportElement() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
};
diff --git a/reportdesign/source/filter/xml/xmlSection.hxx b/reportdesign/source/filter/xml/xmlSection.hxx
index 26e8517232ff..797cc3df55a9 100644
--- a/reportdesign/source/filter/xml/xmlSection.hxx
+++ b/reportdesign/source/filter/xml/xmlSection.hxx
@@ -42,6 +42,9 @@ namespace rptxml
,bool _bPageHeader = true);
virtual ~OXMLSection() override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
};
diff --git a/reportdesign/source/filter/xml/xmlTable.hxx b/reportdesign/source/filter/xml/xmlTable.hxx
index 508ad5087166..b84f7310a59e 100644
--- a/reportdesign/source/filter/xml/xmlTable.hxx
+++ b/reportdesign/source/filter/xml/xmlTable.hxx
@@ -65,6 +65,8 @@ namespace rptxml
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/, const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
void addHeight(sal_Int32 _nHeight) { m_aHeight.push_back(_nHeight); }
diff --git a/solenv/CompilerTest_compilerplugins_clang.mk b/solenv/CompilerTest_compilerplugins_clang.mk
index dab7501be1a6..80fd67f347a8 100644
--- a/solenv/CompilerTest_compilerplugins_clang.mk
+++ b/solenv/CompilerTest_compilerplugins_clang.mk
@@ -105,6 +105,7 @@ $(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
compilerplugins/clang/test/vclwidgets \
compilerplugins/clang/test/weakbase \
compilerplugins/clang/test/writeonlyvars \
+ compilerplugins/clang/test/xmlimport \
))
$(eval $(call gb_CompilerTest_use_externals,compilerplugins_clang, \
diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx
index 01b22fef1c3a..0ea3690eddac 100644
--- a/sw/source/filter/xml/xmlimp.cxx
+++ b/sw/source/filter/xml/xmlimp.cxx
@@ -131,6 +131,10 @@ public:
SwXMLBodyContext_Impl( SwXMLImport& rImport );
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
+
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
};
diff --git a/sw/source/uibase/config/StoredChapterNumbering.cxx b/sw/source/uibase/config/StoredChapterNumbering.cxx
index d5f69b2fe7c4..5deb102ac024 100644
--- a/sw/source/uibase/config/StoredChapterNumbering.cxx
+++ b/sw/source/uibase/config/StoredChapterNumbering.cxx
@@ -317,6 +317,10 @@ public:
{
}
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
+
virtual void SAL_CALL endFastElement(sal_Int32 /*Element*/) override
{
assert(m_Contexts.size() < SwChapterNumRules::nMaxRules);
diff --git a/xmloff/source/text/XMLAutoTextContainerEventImport.hxx b/xmloff/source/text/XMLAutoTextContainerEventImport.hxx
index 69923aded3ba..686e9b0cd3d6 100644
--- a/xmloff/source/text/XMLAutoTextContainerEventImport.hxx
+++ b/xmloff/source/text/XMLAutoTextContainerEventImport.hxx
@@ -51,6 +51,9 @@ public:
protected:
+ virtual void SAL_CALL startFastElement(
+ sal_Int32 /*nElement*/,
+ const css::uno::Reference< css::xml::sax::XFastAttributeList >& /*xAttrList*/ ) override {}
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL
createFastChildContext(sal_Int32 /*nElement*/,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & /*rxAttribs*/) override