aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-10-01 08:53:29 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-10-02 07:35:30 +0200
commit62c21af778b7bff6c86e7f89ef03a87efa6c51cb (patch)
tree8d81d10c06338484b171e819afffbe5aa1b30d26
parent430d02db24b95a56ae0acc6a9df6a0effe49da0d (diff)
Move the annotations for parsing Qt-based headers to shiboken2
It is one of the lesser known things that any project generating bindings for Qt-based code needs to include pyside2_global.h in order for signals, slots and properties to be recognized, since the annotation macro definitions are in this file. Move the definitions over to shiboken2 to remove the need to include it. [ChangeLog][shiboken2] Projects generating bindings for Qt-based code no longer need to include pyside2_global.h. Change-Id: I531bb7444561ccfc352f3be09ecdf854f9f7dd3d Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r--sources/pyside2/tests/pysidetest/pysidetest_global.h1
-rw-r--r--sources/shiboken2/ApiExtractor/apiextractor.cpp19
-rw-r--r--sources/shiboken2/ApiExtractor/apiextractor.h2
-rw-r--r--sources/shiboken2/generator/main.cpp5
-rw-r--r--sources/shiboken2/generator/shiboken2/shibokengenerator.h5
5 files changed, 26 insertions, 6 deletions
diff --git a/sources/pyside2/tests/pysidetest/pysidetest_global.h b/sources/pyside2/tests/pysidetest/pysidetest_global.h
index 6cc8570f0..f65662cb5 100644
--- a/sources/pyside2/tests/pysidetest/pysidetest_global.h
+++ b/sources/pyside2/tests/pysidetest/pysidetest_global.h
@@ -30,7 +30,6 @@
#define PYSIDETEST_GLOBAL_H
// PySide global.h file
-#include "pyside2_global.h"
#include "testobject.h"
#include "testview.h"
#include "hiddenobject.h"
diff --git a/sources/shiboken2/ApiExtractor/apiextractor.cpp b/sources/shiboken2/ApiExtractor/apiextractor.cpp
index 3fdd613ae..aa552cdd3 100644
--- a/sources/shiboken2/ApiExtractor/apiextractor.cpp
+++ b/sources/shiboken2/ApiExtractor/apiextractor.cpp
@@ -172,7 +172,20 @@ int ApiExtractor::classCount() const
return m_builder->classes().count();
}
-bool ApiExtractor::run()
+// Add defines required for parsing Qt code headers
+static void addPySideExtensions(QByteArrayList *a)
+{
+ // Make "signals:", "slots:" visible as access specifiers
+ a->append(QByteArrayLiteral("-DQT_ANNOTATE_ACCESS_SPECIFIER(a)=__attribute__((annotate(#a)))"));
+
+ // Q_PROPERTY is defined as class annotation which does not work since a
+ // sequence of properties will to expand to a sequence of annotations
+ // annotating nothing, causing clang to complain. Instead, define it away in a
+ // static assert with the stringified argument in a ','-operator (cf qdoc).
+ a->append(QByteArrayLiteral("-DQT_ANNOTATE_CLASS(type,...)=static_assert(sizeof(#__VA_ARGS__),#type);"));
+}
+
+bool ApiExtractor::run(bool usePySideExtensions)
{
if (m_builder)
return false;
@@ -215,6 +228,10 @@ bool ApiExtractor::run()
<< "clang language level: " << int(m_languageLevel)
<< "\nclang arguments: " << arguments;
}
+
+ if (usePySideExtensions)
+ addPySideExtensions(&arguments);
+
const bool result = m_builder->build(arguments, m_languageLevel);
if (!result)
autoRemove = false;
diff --git a/sources/shiboken2/ApiExtractor/apiextractor.h b/sources/shiboken2/ApiExtractor/apiextractor.h
index b0c2c696f..9c79ae7a5 100644
--- a/sources/shiboken2/ApiExtractor/apiextractor.h
+++ b/sources/shiboken2/ApiExtractor/apiextractor.h
@@ -93,7 +93,7 @@ public:
int classCount() const;
- bool run();
+ bool run(bool usePySideExtensions);
private:
QString m_typeSystemFileName;
QFileInfoList m_cppFileNames;
diff --git a/sources/shiboken2/generator/main.cpp b/sources/shiboken2/generator/main.cpp
index 3c9d13b48..8d819c763 100644
--- a/sources/shiboken2/generator/main.cpp
+++ b/sources/shiboken2/generator/main.cpp
@@ -612,7 +612,10 @@ int main(int argc, char *argv[])
extractor.setCppFileNames(cppFileNames);
extractor.setTypeSystem(typeSystemFileName);
- if (!extractor.run()) {
+ auto shibokenGenerator = dynamic_cast<const ShibokenGenerator *>(generators.constFirst().data());
+ const bool usePySideExtensions = shibokenGenerator && shibokenGenerator->usePySideExtensions();
+
+ if (!extractor.run(usePySideExtensions)) {
errorPrint(QLatin1String("Error running ApiExtractor."));
return EXIT_FAILURE;
}
diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.h b/sources/shiboken2/generator/shiboken2/shibokengenerator.h
index 33da01a3a..6d36026cd 100644
--- a/sources/shiboken2/generator/shiboken2/shibokengenerator.h
+++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.h
@@ -90,6 +90,9 @@ public:
/// Returns a list of all ancestor classes for the given class.
AbstractMetaClassList getAllAncestors(const AbstractMetaClass *metaClass) const;
+ /// Returns true if the user enabled PySide extensions.
+ bool usePySideExtensions() const;
+
protected:
bool doSetup() override;
@@ -377,8 +380,6 @@ protected:
bool useCtorHeuristic() const;
/// Returns true if the user enabled the so called "return value heuristic".
bool useReturnValueHeuristic() const;
- /// Returns true if the user enabled PySide extensions.
- bool usePySideExtensions() const;
/// Returns true if the generator should use the result of isNull()const to compute boolean casts.
bool useIsNullAsNbNonZero() const;
/// Returns true if the generated code should use the "#define protected public" hack.