diff options
5 files changed, 20 insertions, 2 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp index 7ad39edec..ae782f9e9 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp @@ -285,6 +285,17 @@ bool AbstractMetaFunction::isModifiedRemoved(const AbstractMetaClass *cls) const return false; } +bool AbstractMetaFunction::isModifiedFinal(const AbstractMetaClass *cls) const +{ + if (!isInGlobalScope() && cls == nullptr) + cls = d->m_implementingClass; + for (const auto &mod : modifications(cls)) { + if (mod.modifiers().testFlag(FunctionModification::Final)) + return true; + } + return false; +} + bool AbstractMetaFunction::isVoid() const { return d->m_type.isVoid(); diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.h b/sources/shiboken6/ApiExtractor/abstractmetafunction.h index 0fa15c2bf..73bdb0eb5 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.h +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.h @@ -239,6 +239,7 @@ public: QString debugSignature() const; // including virtual/override/final, etc., for debugging only. bool isModifiedRemoved(const AbstractMetaClass *cls = nullptr) const; + bool isModifiedFinal(const AbstractMetaClass *cls = nullptr) const; bool isVoid() const; diff --git a/sources/shiboken6/ApiExtractor/typesystemparser.cpp b/sources/shiboken6/ApiExtractor/typesystemparser.cpp index 17ed97b0d..9bb562cdb 100644 --- a/sources/shiboken6/ApiExtractor/typesystemparser.cpp +++ b/sources/shiboken6/ApiExtractor/typesystemparser.cpp @@ -2748,7 +2748,7 @@ bool TypeSystemParser::parseModifyFunction(const ConditionalStreamReader &reader return false; } const FunctionModification::ModifierFlag m = modifierFlagOpt.value(); - if (m == FunctionModification::Final || m == FunctionModification::NonFinal) { + if (m == FunctionModification::NonFinal) { qCWarning(lcShiboken, "%s", qPrintable(msgUnimplementedAttributeValueWarning(reader, accessAttribute(), access))); diff --git a/sources/shiboken6/doc/typesystem_manipulating_objects.rst b/sources/shiboken6/doc/typesystem_manipulating_objects.rst index 88aa18390..c8d35cf9c 100644 --- a/sources/shiboken6/doc/typesystem_manipulating_objects.rst +++ b/sources/shiboken6/doc/typesystem_manipulating_objects.rst @@ -166,6 +166,7 @@ modify-function access="public | private | protected" allow-thread="true | auto | false" exception-handling="off | auto-off | auto-on | on" + final="true | false" overload-number="number" rename="..." snake-case="yes | no | both" /> @@ -240,6 +241,10 @@ modify-function Numbers should be given for all overloads; otherwise, the order will be in declaration order. + The optional ``final`` attribute can be specified for virtual functions + and disables generating the code for overriding the function in Python + (native call). This is useful when the result type is not constructible. + The ``remove`` attribute is an *optional* boolean attribute, which can mark the function to be discarded on generation. diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp index e768dcc1a..c85c83e05 100644 --- a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp +++ b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp @@ -231,7 +231,8 @@ ShibokenGenerator::FunctionGeneration // Check on virtuals (including operators). const bool isAbstract = func->isAbstract(); if (!(isAbstract || func->isVirtual()) - || func->attributes().testFlag(AbstractMetaFunction::FinalCppMethod)) { + || func->attributes().testFlag(AbstractMetaFunction::FinalCppMethod) + || func->isModifiedFinal()) { return result; } |
